mirror of https://github.com/aamine/cbc
r4986@macbookpro: aamine | 2009-05-26 16:07:49 +0900
* net/loveruby/cflat/compiler/Compiler.java: --dump-asm now dumps AssemblyFile. * net/loveruby/cflat/compiler/Compiler.java: new option --print-asm, prints assembly source text. * net/loveruby/cflat/compiler/CompilerMode.java: new enum PrintAsm. * net/loveruby/cflat/compiler/Options.java: new option --print-asm. * net/loveruby/cflat/sysdep/x86/AssemblyFile.java: new method #dump. * net/loveruby/cflat/sysdep/x86/Register.java: new method #dump. * net/loveruby/cflat/asm: new method #dump. git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4264 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
parent
144393f6d4
commit
8049035053
21
ChangeLog
21
ChangeLog
|
@ -1,3 +1,24 @@
|
||||||
|
Tue May 26 16:07:33 2009 Minero Aoki <aamine@loveruby.net>
|
||||||
|
|
||||||
|
* net/loveruby/cflat/compiler/Compiler.java: --dump-asm now dumps
|
||||||
|
AssemblyFile.
|
||||||
|
|
||||||
|
* net/loveruby/cflat/compiler/Compiler.java: new option
|
||||||
|
--print-asm, prints assembly source text.
|
||||||
|
|
||||||
|
* net/loveruby/cflat/compiler/CompilerMode.java: new enum
|
||||||
|
PrintAsm.
|
||||||
|
|
||||||
|
* net/loveruby/cflat/compiler/Options.java: new option
|
||||||
|
--print-asm.
|
||||||
|
|
||||||
|
* net/loveruby/cflat/sysdep/x86/AssemblyFile.java: new method
|
||||||
|
#dump.
|
||||||
|
|
||||||
|
* net/loveruby/cflat/sysdep/x86/Register.java: new method #dump.
|
||||||
|
|
||||||
|
* net/loveruby/cflat/asm: new method #dump.
|
||||||
|
|
||||||
Tue May 26 15:16:04 2009 Minero Aoki <aamine@loveruby.net>
|
Tue May 26 15:16:04 2009 Minero Aoki <aamine@loveruby.net>
|
||||||
|
|
||||||
* net/loveruby/cflat/sysdep/x86/AssemblyFile.java: refactoring:
|
* net/loveruby/cflat/sysdep/x86/AssemblyFile.java: refactoring:
|
||||||
|
|
|
@ -18,4 +18,8 @@ public class AbsoluteAddress extends Operand {
|
||||||
public String toSource(SymbolTable table) {
|
public String toSource(SymbolTable table) {
|
||||||
return "*" + register.toSource(table);
|
return "*" + register.toSource(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(AbsoluteAddress " + register.dump() + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package net.loveruby.cflat.asm;
|
||||||
|
|
||||||
abstract public class Assembly {
|
abstract public class Assembly {
|
||||||
abstract public String toSource(SymbolTable table);
|
abstract public String toSource(SymbolTable table);
|
||||||
|
abstract public String dump();
|
||||||
|
|
||||||
public boolean isInstruction() {
|
public boolean isInstruction() {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
package net.loveruby.cflat.asm;
|
package net.loveruby.cflat.asm;
|
||||||
|
import net.loveruby.cflat.utils.TextUtils;
|
||||||
|
|
||||||
public class Comment extends Assembly {
|
public class Comment extends Assembly {
|
||||||
protected String string;
|
protected String string;
|
||||||
|
@ -28,4 +29,8 @@ public class Comment extends Assembly {
|
||||||
}
|
}
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(Comment " + TextUtils.dumpString(string) + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,4 +34,8 @@ public class DirectMemoryReference extends MemoryReference {
|
||||||
protected int cmp(DirectMemoryReference mem) {
|
protected int cmp(DirectMemoryReference mem) {
|
||||||
return value.compareTo(mem.value);
|
return value.compareTo(mem.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(DirectMemoryReference " + value.dump() + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
package net.loveruby.cflat.asm;
|
package net.loveruby.cflat.asm;
|
||||||
|
import net.loveruby.cflat.utils.TextUtils;
|
||||||
|
|
||||||
public class Directive extends Assembly {
|
public class Directive extends Assembly {
|
||||||
protected String content;
|
protected String content;
|
||||||
|
@ -14,4 +15,8 @@ public class Directive extends Assembly {
|
||||||
public String toSource(SymbolTable table) {
|
public String toSource(SymbolTable table) {
|
||||||
return this.content;
|
return this.content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(Directive " + TextUtils.dumpString(content.trim()) + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,4 +28,8 @@ public class ImmediateValue extends Operand {
|
||||||
public String toSource(SymbolTable table) {
|
public String toSource(SymbolTable table) {
|
||||||
return "$" + expr.toSource(table);
|
return "$" + expr.toSource(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(ImmediateValue " + expr.dump() + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,4 +70,9 @@ public class IndirectMemoryReference extends MemoryReference {
|
||||||
protected int cmp(IndirectMemoryReference mem) {
|
protected int cmp(IndirectMemoryReference mem) {
|
||||||
return offset.compareTo(mem.offset);
|
return offset.compareTo(mem.offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(IndirectMemoryReference "
|
||||||
|
+ offset.dump() + " " + base.dump() + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
package net.loveruby.cflat.asm;
|
package net.loveruby.cflat.asm;
|
||||||
|
import net.loveruby.cflat.utils.TextUtils;
|
||||||
|
|
||||||
public class Instruction extends Assembly {
|
public class Instruction extends Assembly {
|
||||||
protected String mnemonic;
|
protected String mnemonic;
|
||||||
|
@ -109,4 +110,17 @@ public class Instruction extends Assembly {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "#<Insn " + mnemonic + ">";
|
return "#<Insn " + mnemonic + ">";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
StringBuilder buf = new StringBuilder();
|
||||||
|
buf.append("(Instruction ");
|
||||||
|
buf.append(TextUtils.dumpString(mnemonic));
|
||||||
|
buf.append(" ");
|
||||||
|
buf.append(TextUtils.dumpString(suffix));
|
||||||
|
for (Operand oper : operands) {
|
||||||
|
buf.append(" ").append(oper.dump());
|
||||||
|
}
|
||||||
|
buf.append(")");
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ public class IntegerLiteral implements Literal {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "$" + value;
|
return new Long(value).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int compareTo(Literal lit) {
|
public int compareTo(Literal lit) {
|
||||||
|
@ -67,4 +67,8 @@ public class IntegerLiteral implements Literal {
|
||||||
public int cmp(SuffixedSymbol sym) {
|
public int cmp(SuffixedSymbol sym) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(IntegerLiteral " + new Long(value).toString() + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,4 +22,8 @@ public class Label extends Assembly {
|
||||||
public String toSource(SymbolTable table) {
|
public String toSource(SymbolTable table) {
|
||||||
return symbol.toSource(table) + ":";
|
return symbol.toSource(table) + ":";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(Label " + symbol.dump() + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package net.loveruby.cflat.asm;
|
||||||
public interface Literal extends Comparable<Literal> {
|
public interface Literal extends Comparable<Literal> {
|
||||||
public String toSource();
|
public String toSource();
|
||||||
public String toSource(SymbolTable table);
|
public String toSource(SymbolTable table);
|
||||||
|
public String dump();
|
||||||
public void collectStatistics(Statistics stats);
|
public void collectStatistics(Statistics stats);
|
||||||
public boolean isZero();
|
public boolean isZero();
|
||||||
public Literal plus(long diff);
|
public Literal plus(long diff);
|
||||||
|
|
|
@ -42,4 +42,8 @@ public class NamedSymbol extends BaseSymbol {
|
||||||
public int cmp(SuffixedSymbol sym) {
|
public int cmp(SuffixedSymbol sym) {
|
||||||
return toString().compareTo(sym.toString());
|
return toString().compareTo(sym.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(NamedSymbol " + name + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package net.loveruby.cflat.asm;
|
||||||
|
|
||||||
abstract public class Operand implements OperandPattern {
|
abstract public class Operand implements OperandPattern {
|
||||||
abstract public String toSource(SymbolTable table);
|
abstract public String toSource(SymbolTable table);
|
||||||
|
abstract public String dump();
|
||||||
|
|
||||||
public boolean isRegister() {
|
public boolean isRegister() {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -9,5 +9,6 @@ abstract public class Register extends Operand {
|
||||||
stats.registerUsed(this);
|
stats.registerUsed(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract public String toSource(SymbolTable table);
|
abstract public String toSource(SymbolTable syms);
|
||||||
|
abstract public String dump();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
package net.loveruby.cflat.asm;
|
package net.loveruby.cflat.asm;
|
||||||
|
import net.loveruby.cflat.utils.TextUtils;
|
||||||
|
|
||||||
public class SuffixedSymbol implements Symbol {
|
public class SuffixedSymbol implements Symbol {
|
||||||
protected Symbol base;
|
protected Symbol base;
|
||||||
|
@ -56,4 +57,9 @@ public class SuffixedSymbol implements Symbol {
|
||||||
public int cmp(SuffixedSymbol sym) {
|
public int cmp(SuffixedSymbol sym) {
|
||||||
return toString().compareTo(sym.toString());
|
return toString().compareTo(sym.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(SuffixedSymbol " + base.dump() +
|
||||||
|
" " + TextUtils.dumpString(suffix) + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,4 +3,5 @@ package net.loveruby.cflat.asm;
|
||||||
public interface Symbol extends Literal {
|
public interface Symbol extends Literal {
|
||||||
public String name();
|
public String name();
|
||||||
public String toString();
|
public String toString();
|
||||||
|
public String dump();
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,4 +40,8 @@ public class UnnamedSymbol extends BaseSymbol {
|
||||||
public int cmp(SuffixedSymbol sym) {
|
public int cmp(SuffixedSymbol sym) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(UnnamedSymbol @" + Integer.toHexString(hashCode()) + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,6 +116,7 @@ public class Compiler {
|
||||||
if (dumpIR(ir, opts.mode())) return;
|
if (dumpIR(ir, opts.mode())) return;
|
||||||
AssemblyFile asm = generateAssembly(ir, opts);
|
AssemblyFile asm = generateAssembly(ir, opts);
|
||||||
if (dumpAsm(asm, opts.mode())) return;
|
if (dumpAsm(asm, opts.mode())) return;
|
||||||
|
if (printAsm(asm, opts.mode())) return;
|
||||||
writeFile(destPath, asm.toSource());
|
writeFile(destPath, asm.toSource());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,6 +253,16 @@ public class Compiler {
|
||||||
|
|
||||||
private boolean dumpAsm(AssemblyFile asm, CompilerMode mode) {
|
private boolean dumpAsm(AssemblyFile asm, CompilerMode mode) {
|
||||||
if (mode == CompilerMode.DumpAsm) {
|
if (mode == CompilerMode.DumpAsm) {
|
||||||
|
asm.dump(System.out);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean printAsm(AssemblyFile asm, CompilerMode mode) {
|
||||||
|
if (mode == CompilerMode.PrintAsm) {
|
||||||
System.out.print(asm.toSource());
|
System.out.print(asm.toSource());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ enum CompilerMode {
|
||||||
DumpReference ("--dump-reference"),
|
DumpReference ("--dump-reference"),
|
||||||
DumpIR ("--dump-ir"),
|
DumpIR ("--dump-ir"),
|
||||||
DumpAsm ("--dump-asm"),
|
DumpAsm ("--dump-asm"),
|
||||||
|
PrintAsm ("--print-asm"),
|
||||||
Compile ("-S"),
|
Compile ("-S"),
|
||||||
Assemble ("-c"),
|
Assemble ("-c"),
|
||||||
Link ("--link");
|
Link ("--link");
|
||||||
|
@ -29,6 +30,7 @@ enum CompilerMode {
|
||||||
modes.put("--dump-reference", DumpReference);
|
modes.put("--dump-reference", DumpReference);
|
||||||
modes.put("--dump-ir", DumpIR);
|
modes.put("--dump-ir", DumpIR);
|
||||||
modes.put("--dump-asm", DumpAsm);
|
modes.put("--dump-asm", DumpAsm);
|
||||||
|
modes.put("--print-asm", PrintAsm);
|
||||||
modes.put("-S", Compile);
|
modes.put("-S", Compile);
|
||||||
modes.put("-c", Assemble);
|
modes.put("-c", Assemble);
|
||||||
}
|
}
|
||||||
|
|
|
@ -328,10 +328,11 @@ class Options {
|
||||||
// --dump-stmt is a hidden option.
|
// --dump-stmt is a hidden option.
|
||||||
// --dump-expr is a hidden option.
|
// --dump-expr is a hidden option.
|
||||||
out.println(" --dump-ast Dumps AST and quit.");
|
out.println(" --dump-ast Dumps AST and quit.");
|
||||||
out.println(" --dump-semantic Dumps AST after semantic check and quit.");
|
out.println(" --dump-semantic Dumps AST after semantic checks and quit.");
|
||||||
// --dump-reference is a hidden option.
|
// --dump-reference is a hidden option.
|
||||||
out.println(" --dump-ir Dumps IR and quit.");
|
out.println(" --dump-ir Dumps IR and quit.");
|
||||||
out.println(" --dump-asm Prints an assembly source and quit.");
|
out.println(" --dump-asm Dumps AssemblyFile and quit.");
|
||||||
|
out.println(" --print-asm Prints assembly code and quit.");
|
||||||
out.println(" -S Generates an assembly file and quit.");
|
out.println(" -S Generates an assembly file and quit.");
|
||||||
out.println(" -c Generates an object file and quit.");
|
out.println(" -c Generates an object file and quit.");
|
||||||
out.println(" -o PATH Places output in file PATH.");
|
out.println(" -o PATH Places output in file PATH.");
|
||||||
|
|
|
@ -46,7 +46,9 @@ public class AssemblyFile implements net.loveruby.cflat.sysdep.AssemblyFile {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dump(PrintStream s) {
|
public void dump(PrintStream s) {
|
||||||
// FIXME
|
for (Assembly asm : assemblies) {
|
||||||
|
s.println(asm.dump());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void comment(String str) {
|
void comment(String str) {
|
||||||
|
|
|
@ -65,4 +65,8 @@ class Register extends net.loveruby.cflat.asm.Register {
|
||||||
throw new Error("does not have lower-byte register: " + _class);
|
throw new Error("does not have lower-byte register: " + _class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String dump() {
|
||||||
|
return "(Register " + _class.toString() + " " + type.toString() + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue