mirror of https://github.com/aamine/cbc
r5104@macbookpro: aamine | 2009-06-13 22:43:16 +0900
* rename class: AssemblyFile -> AssemblyCode. git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4292 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
parent
0837912b64
commit
ee8432d4fa
|
@ -1,3 +1,7 @@
|
|||
Sat Jun 13 22:42:24 2009 Minero Aoki <aamine@loveruby.net>
|
||||
|
||||
* rename class: AssemblyFile -> AssemblyCode.
|
||||
|
||||
Sat Jun 13 22:37:02 2009 Minero Aoki <aamine@loveruby.net>
|
||||
|
||||
* net/loveruby/cflat/entity/ToplevelScope.java: move
|
||||
|
|
|
@ -6,7 +6,7 @@ import net.loveruby.cflat.ast.ExprNode;
|
|||
import net.loveruby.cflat.type.TypeTable;
|
||||
import net.loveruby.cflat.ir.IR;
|
||||
import net.loveruby.cflat.sysdep.CodeGenerator;
|
||||
import net.loveruby.cflat.sysdep.AssemblyFile;
|
||||
import net.loveruby.cflat.sysdep.AssemblyCode;
|
||||
import net.loveruby.cflat.utils.ErrorHandler;
|
||||
import net.loveruby.cflat.exception.*;
|
||||
import java.util.*;
|
||||
|
@ -114,7 +114,7 @@ public class Compiler {
|
|||
if (dumpSemant(sem, opts.mode())) return;
|
||||
IR ir = new IRGenerator(types, errorHandler).generate(sem);
|
||||
if (dumpIR(ir, opts.mode())) return;
|
||||
AssemblyFile asm = generateAssembly(ir, opts);
|
||||
AssemblyCode asm = generateAssembly(ir, opts);
|
||||
if (dumpAsm(asm, opts.mode())) return;
|
||||
if (printAsm(asm, opts.mode())) return;
|
||||
writeFile(destPath, asm.toSource());
|
||||
|
@ -140,7 +140,7 @@ public class Compiler {
|
|||
return ast;
|
||||
}
|
||||
|
||||
public AssemblyFile generateAssembly(IR ir, Options opts) {
|
||||
public AssemblyCode generateAssembly(IR ir, Options opts) {
|
||||
return opts.codeGenerator(errorHandler).generate(ir);
|
||||
}
|
||||
|
||||
|
@ -251,7 +251,7 @@ public class Compiler {
|
|||
}
|
||||
}
|
||||
|
||||
private boolean dumpAsm(AssemblyFile asm, CompilerMode mode) {
|
||||
private boolean dumpAsm(AssemblyCode asm, CompilerMode mode) {
|
||||
if (mode == CompilerMode.DumpAsm) {
|
||||
asm.dump(System.out);
|
||||
return true;
|
||||
|
@ -261,7 +261,7 @@ public class Compiler {
|
|||
}
|
||||
}
|
||||
|
||||
private boolean printAsm(AssemblyFile asm, CompilerMode mode) {
|
||||
private boolean printAsm(AssemblyCode asm, CompilerMode mode) {
|
||||
if (mode == CompilerMode.PrintAsm) {
|
||||
System.out.print(asm.toSource());
|
||||
return true;
|
||||
|
|
|
@ -331,7 +331,7 @@ class Options {
|
|||
out.println(" --dump-semantic Dumps AST after semantic checks and quit.");
|
||||
// --dump-reference is a hidden option.
|
||||
out.println(" --dump-ir Dumps IR and quit.");
|
||||
out.println(" --dump-asm Dumps AssemblyFile and quit.");
|
||||
out.println(" --dump-asm Dumps AssemblyCode and quit.");
|
||||
out.println(" --print-asm Prints assembly code and quit.");
|
||||
out.println(" -S Generates an assembly file and quit.");
|
||||
out.println(" -c Generates an object file and quit.");
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package net.loveruby.cflat.sysdep;
|
||||
import java.io.PrintStream;
|
||||
|
||||
public interface AssemblyFile {
|
||||
public interface AssemblyCode {
|
||||
String toSource();
|
||||
void dump();
|
||||
void dump(PrintStream s);
|
|
@ -1,5 +1,5 @@
|
|||
package net.loveruby.cflat.sysdep;
|
||||
|
||||
public interface CodeGenerator {
|
||||
AssemblyFile generate(net.loveruby.cflat.ir.IR ir);
|
||||
AssemblyCode generate(net.loveruby.cflat.ir.IR ir);
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import java.util.List;
|
|||
import java.util.ArrayList;
|
||||
import java.io.PrintStream;
|
||||
|
||||
public class AssemblyFile implements net.loveruby.cflat.sysdep.AssemblyFile {
|
||||
public class AssemblyCode implements net.loveruby.cflat.sysdep.AssemblyCode {
|
||||
final Type naturalType;
|
||||
final long stackWordSize;
|
||||
final SymbolTable labelSymbols;
|
||||
|
@ -15,7 +15,7 @@ public class AssemblyFile implements net.loveruby.cflat.sysdep.AssemblyFile {
|
|||
private int commentIndentLevel = 0;
|
||||
private Statistics statistics;
|
||||
|
||||
AssemblyFile(Type naturalType, long stackWordSize,
|
||||
AssemblyCode(Type naturalType, long stackWordSize,
|
||||
SymbolTable labelSymbols, boolean verbose) {
|
||||
this.naturalType = naturalType;
|
||||
this.stackWordSize = stackWordSize;
|
|
@ -26,7 +26,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
|
||||
/** Compiles IR and generates assembly code. */
|
||||
// #@@range/generate{
|
||||
public AssemblyFile generate(IR ir) {
|
||||
public AssemblyCode generate(IR ir) {
|
||||
locateSymbols(ir);
|
||||
return generateAssemblyCode(ir);
|
||||
}
|
||||
|
@ -142,8 +142,8 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
//
|
||||
|
||||
// #@@range/generateAssemblyCode{
|
||||
private AssemblyFile generateAssemblyCode(IR ir) {
|
||||
AssemblyFile file = newAssemblyFile();
|
||||
private AssemblyCode generateAssemblyCode(IR ir) {
|
||||
AssemblyCode file = newAssemblyCode();
|
||||
file._file(ir.fileName());
|
||||
if (ir.isGlobalVariableDefined()) {
|
||||
generateDataSection(file, ir.definedGlobalVariables());
|
||||
|
@ -164,9 +164,9 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
}
|
||||
// #@@}
|
||||
|
||||
// #@@range/newAssemblyFile{
|
||||
private AssemblyFile newAssemblyFile() {
|
||||
return new AssemblyFile(
|
||||
// #@@range/newAssemblyCode{
|
||||
private AssemblyCode newAssemblyCode() {
|
||||
return new AssemblyCode(
|
||||
naturalType, STACK_WORD_SIZE,
|
||||
new SymbolTable(LABEL_SYMBOL_BASE),
|
||||
options.isVerboseAsm());
|
||||
|
@ -175,7 +175,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
|
||||
/** Generates initialized entries */
|
||||
// #@@range/generateDataSection{
|
||||
private void generateDataSection(AssemblyFile file,
|
||||
private void generateDataSection(AssemblyCode file,
|
||||
List<DefinedVariable> gvars) {
|
||||
file._data();
|
||||
for (DefinedVariable var : gvars) {
|
||||
|
@ -194,7 +194,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
|
||||
/** Generates immediate values for .data section */
|
||||
// #@@range/generateImmediate{
|
||||
private void generateImmediate(AssemblyFile file, long size, Expr node) {
|
||||
private void generateImmediate(AssemblyCode file, long size, Expr node) {
|
||||
if (node instanceof Int) {
|
||||
Int expr = (Int)node;
|
||||
switch ((int)size) {
|
||||
|
@ -223,7 +223,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
|
||||
/** Generates .rodata entries (constant strings) */
|
||||
// #@@range/generateReadOnlyDataSection{
|
||||
private void generateReadOnlyDataSection(AssemblyFile file,
|
||||
private void generateReadOnlyDataSection(AssemblyCode file,
|
||||
ConstantTable constants) {
|
||||
file._section(".rodata");
|
||||
for (ConstantEntry ent : constants) {
|
||||
|
@ -234,7 +234,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
// #@@}
|
||||
|
||||
// #@@range/generateTextSection{
|
||||
private void generateTextSection(AssemblyFile file,
|
||||
private void generateTextSection(AssemblyCode file,
|
||||
List<DefinedFunction> functions) {
|
||||
file._text();
|
||||
for (DefinedFunction func : functions) {
|
||||
|
@ -252,7 +252,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
|
||||
/** Generates BSS entries */
|
||||
// #@@range/generateCommonSymbols{
|
||||
private void generateCommonSymbols(AssemblyFile file,
|
||||
private void generateCommonSymbols(AssemblyCode file,
|
||||
List<DefinedVariable> variables) {
|
||||
for (DefinedVariable var : variables) {
|
||||
Symbol sym = globalSymbol(var.symbolString());
|
||||
|
@ -272,7 +272,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
static private final Symbol GOT =
|
||||
new NamedSymbol("_GLOBAL_OFFSET_TABLE_");
|
||||
|
||||
private void loadGOTBaseAddress(AssemblyFile file, Register reg) {
|
||||
private void loadGOTBaseAddress(AssemblyCode file, Register reg) {
|
||||
file.call(PICThunkSymbol(reg));
|
||||
file.add(imm(GOT), reg);
|
||||
}
|
||||
|
@ -320,7 +320,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
* .section NAME, "...M", TYPE, section_group_name, linkage
|
||||
*/
|
||||
// #@@range/PICThunk{
|
||||
private void PICThunk(AssemblyFile file, Register reg) {
|
||||
private void PICThunk(AssemblyCode file, Register reg) {
|
||||
Symbol sym = PICThunkSymbol(reg);
|
||||
file._section(".text" + "." + sym.toSource(),
|
||||
"\"" + PICThunkSectionFlags + "\"",
|
||||
|
@ -406,7 +406,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
// #@@}
|
||||
|
||||
// #@@range/compileFunctionBody{
|
||||
private void compileFunctionBody(AssemblyFile file, DefinedFunction func) {
|
||||
private void compileFunctionBody(AssemblyCode file, DefinedFunction func) {
|
||||
StackFrameInfo frame = new StackFrameInfo();
|
||||
// #@@range/cfb_locate{
|
||||
locateParameters(func.parameters());
|
||||
|
@ -414,7 +414,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
// #@@}
|
||||
|
||||
// #@@range/cfb_offset{
|
||||
AssemblyFile body = optimize(compileStmts(func));
|
||||
AssemblyCode body = optimize(compileStmts(func));
|
||||
frame.saveRegs = usedCalleeSavedRegisters(body);
|
||||
frame.tempSize = body.virtualStack.maxSize();
|
||||
|
||||
|
@ -432,7 +432,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
// #@@}
|
||||
|
||||
// #@@range/optimize{
|
||||
private AssemblyFile optimize(AssemblyFile body) {
|
||||
private AssemblyCode optimize(AssemblyCode body) {
|
||||
if (options.optimizeLevel() < 1) {
|
||||
return body;
|
||||
}
|
||||
|
@ -442,7 +442,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
}
|
||||
// #@@}
|
||||
|
||||
private void printStackFrameLayout(AssemblyFile file,
|
||||
private void printStackFrameLayout(AssemblyCode file,
|
||||
StackFrameInfo frame, List<DefinedVariable> lvars) {
|
||||
List<MemInfo> vars = new ArrayList<MemInfo>();
|
||||
for (DefinedVariable var : lvars) {
|
||||
|
@ -481,11 +481,11 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
}
|
||||
|
||||
// #@@range/compileStmts{
|
||||
private AssemblyFile as;
|
||||
private AssemblyCode as;
|
||||
private Label epilogue;
|
||||
|
||||
private AssemblyFile compileStmts(DefinedFunction func) {
|
||||
as = newAssemblyFile();
|
||||
private AssemblyCode compileStmts(DefinedFunction func) {
|
||||
as = newAssemblyCode();
|
||||
epilogue = new Label();
|
||||
for (Stmt s : func.ir()) {
|
||||
compileStmt(s);
|
||||
|
@ -497,7 +497,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
|
||||
// does NOT include BP
|
||||
// #@@range/usedCalleeSavedRegisters{
|
||||
private List<Register> usedCalleeSavedRegisters(AssemblyFile body) {
|
||||
private List<Register> usedCalleeSavedRegisters(AssemblyCode body) {
|
||||
List<Register> result = new ArrayList<Register>();
|
||||
for (Register reg : calleeSavedRegisters()) {
|
||||
if (body.doesUses(reg)) {
|
||||
|
@ -528,8 +528,8 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
}
|
||||
|
||||
// #@@range/generateFunctionBody{
|
||||
private void generateFunctionBody(AssemblyFile file,
|
||||
AssemblyFile body, StackFrameInfo frame) {
|
||||
private void generateFunctionBody(AssemblyCode file,
|
||||
AssemblyCode body, StackFrameInfo frame) {
|
||||
file.virtualStack.reset();
|
||||
prologue(file, frame.saveRegs, frame.frameSize());
|
||||
if (options.isPositionIndependent() && body.doesUses(GOTBaseReg())) {
|
||||
|
@ -542,7 +542,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
// #@@}
|
||||
|
||||
// #@@range/prologue{
|
||||
private void prologue(AssemblyFile file,
|
||||
private void prologue(AssemblyCode file,
|
||||
List<Register> saveRegs, long frameSize) {
|
||||
file.push(bp());
|
||||
file.mov(sp(), bp());
|
||||
|
@ -554,7 +554,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
// #@@}
|
||||
|
||||
// #@@range/epilogue{
|
||||
private void epilogue(AssemblyFile file, List<Register> savedRegs) {
|
||||
private void epilogue(AssemblyCode file, List<Register> savedRegs) {
|
||||
for (Register reg : ListUtils.reverse(savedRegs)) {
|
||||
file.virtualPop(reg);
|
||||
}
|
||||
|
@ -621,13 +621,13 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
// #@@}
|
||||
|
||||
// #@@range/fixTempVariableOffsets{
|
||||
private void fixTempVariableOffsets(AssemblyFile asm, long len) {
|
||||
private void fixTempVariableOffsets(AssemblyCode asm, long len) {
|
||||
asm.virtualStack.fixOffset(-len);
|
||||
}
|
||||
// #@@}
|
||||
|
||||
// #@@range/extendStack{
|
||||
private void extendStack(AssemblyFile file, long len) {
|
||||
private void extendStack(AssemblyCode file, long len) {
|
||||
if (len > 0) {
|
||||
file.sub(imm(len), sp());
|
||||
}
|
||||
|
@ -635,7 +635,7 @@ public class CodeGenerator implements net.loveruby.cflat.sysdep.CodeGenerator,
|
|||
// #@@}
|
||||
|
||||
// #@@range/rewindStack{
|
||||
private void rewindStack(AssemblyFile file, long len) {
|
||||
private void rewindStack(AssemblyCode file, long len) {
|
||||
if (len > 0) {
|
||||
file.add(imm(len), sp());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue