diff options
author | Chris Lattner <sabre@nondot.org> | 2009-10-19 21:53:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-10-19 21:53:00 +0000 |
commit | 9521525ee4beef3f057a4b1921399322c5060f97 (patch) | |
tree | d1d52400f8d18e22ae4b97613e17eaf52e9b61f9 /lib | |
parent | 96a4cb23a20b1c7c67bd04759f2a67bf4f289bbd (diff) | |
download | external_llvm-9521525ee4beef3f057a4b1921399322c5060f97.zip external_llvm-9521525ee4beef3f057a4b1921399322c5060f97.tar.gz external_llvm-9521525ee4beef3f057a4b1921399322c5060f97.tar.bz2 |
add jump tables, constant pools and some trivial global
lowering stuff. We can now compile hello world to:
_main:
stm ,
mov r7, sp
sub sp, sp, #4
mov r0, #0
str r0,
ldr r0,
bl _printf
ldr r0,
mov sp, r7
ldm ,
Almost looks like arm code :)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84542 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp | 2 | ||||
-rw-r--r-- | lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp | 12 | ||||
-rw-r--r-- | lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp | 84 | ||||
-rw-r--r-- | lib/Target/ARM/AsmPrinter/ARMMCInstLower.h | 18 |
4 files changed, 94 insertions, 22 deletions
diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index d5e2991..4685c0e 100644 --- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp @@ -1311,7 +1311,7 @@ extern "C" void LLVMInitializeARMAsmPrinter() { //===----------------------------------------------------------------------===// void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) { - ARMMCInstLower MCInstLowering(OutContext, Mang); + ARMMCInstLower MCInstLowering(OutContext, *Mang, getFunctionNumber(), *MAI); switch (MI->getOpcode()) { case TargetInstrInfo::DBG_LABEL: case TargetInstrInfo::EH_LABEL: diff --git a/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp index 8393e24..41be859 100644 --- a/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp @@ -16,9 +16,8 @@ #include "ARMAddressingModes.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCAsmInfo.h" -//#include "llvm/MC/MCExpr.h" -//#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/FormattedStream.h" +#include "llvm/MC/MCExpr.h" +#include "llvm/Support/raw_ostream.h" #include "ARMGenInstrNames.inc" using namespace llvm; @@ -34,7 +33,8 @@ void ARMInstPrinter::printInst(const MCInst *MI) { printInstruction(MI); } void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, const char *Modifier) { - assert((Modifier == 0 || Modifier[0] == 0) && "Cannot print modifiers"); + // FIXME: TURN ASSERT ON. + //assert((Modifier == 0 || Modifier[0] == 0) && "Cannot print modifiers"); const MCOperand &Op = MI->getOperand(OpNo); if (Op.isReg()) { @@ -43,9 +43,7 @@ void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, O << '#' << Op.getImm(); } else { assert(Op.isExpr() && "unknown operand kind in printOperand"); - assert(0 && "UNIMP"); - //O << '$'; - //Op.getExpr()->print(O, &MAI); + Op.getExpr()->print(O, &MAI); } } diff --git a/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp b/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp index d60996e..45e61de 100644 --- a/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp @@ -13,16 +13,16 @@ //===----------------------------------------------------------------------===// #include "ARMMCInstLower.h" -//#include "ARMMCAsmInfo.h" //#include "llvm/CodeGen/MachineModuleInfoImpls.h" #include "llvm/CodeGen/MachineInstr.h" -//#include "llvm/MC/MCContext.h" -//#include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" //#include "llvm/MC/MCStreamer.h" -//#include "llvm/Support/FormattedStream.h" -//#include "llvm/Support/Mangler.h" -//#include "llvm/ADT/SmallString.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Mangler.h" +#include "llvm/ADT/SmallString.h" using namespace llvm; @@ -37,6 +37,74 @@ MachineModuleInfoMachO &ARMMCInstLower::getMachOMMI() const { } #endif +MCSymbol *ARMMCInstLower:: +GetGlobalAddressSymbol(const MachineOperand &MO) const { + const GlobalValue *GV = MO.getGlobal(); + + SmallString<128> Name; + Mang.getNameWithPrefix(Name, GV, false); + + // FIXME: HANDLE PLT references how?? + switch (MO.getTargetFlags()) { + default: assert(0 && "Unknown target flag on GV operand"); + case 0: break; + } + + return Ctx.GetOrCreateSymbol(Name.str()); +} + + +MCSymbol *ARMMCInstLower:: +GetJumpTableSymbol(const MachineOperand &MO) const { + SmallString<256> Name; + raw_svector_ostream(Name) << MAI.getPrivateGlobalPrefix() << "JTI" + << CurFunctionNumber << '_' << MO.getIndex(); + +#if 0 + switch (MO.getTargetFlags()) { + default: llvm_unreachable("Unknown target flag on GV operand"); + } +#endif + + // Create a symbol for the name. + return Ctx.GetOrCreateSymbol(Name.str()); +} + +MCSymbol *ARMMCInstLower:: +GetConstantPoolIndexSymbol(const MachineOperand &MO) const { + SmallString<256> Name; + raw_svector_ostream(Name) << MAI.getPrivateGlobalPrefix() << "CPI" + << CurFunctionNumber << '_' << MO.getIndex(); + +#if 0 + switch (MO.getTargetFlags()) { + default: llvm_unreachable("Unknown target flag on GV operand"); + } +#endif + + // Create a symbol for the name. + return Ctx.GetOrCreateSymbol(Name.str()); +} + +MCOperand ARMMCInstLower:: +LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const { + // FIXME: We would like an efficient form for this, so we don't have to do a + // lot of extra uniquing. + const MCExpr *Expr = MCSymbolRefExpr::Create(Sym, Ctx); + +#if 0 + switch (MO.getTargetFlags()) { + default: llvm_unreachable("Unknown target flag on GV operand"); + } +#endif + + if (!MO.isJTI() && MO.getOffset()) + Expr = MCBinaryExpr::CreateAdd(Expr, + MCConstantExpr::Create(MO.getOffset(), Ctx), + Ctx); + return MCOperand::CreateExpr(Expr); +} + void ARMMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { OutMI.setOpcode(MI->getOpcode()); @@ -60,19 +128,21 @@ void ARMMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create( AsmPrinter.GetMBBSymbol(MO.getMBB()->getNumber()), Ctx)); break; +#endif case MachineOperand::MO_GlobalAddress: MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO)); break; +#if 0 case MachineOperand::MO_ExternalSymbol: MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO)); break; +#endif case MachineOperand::MO_JumpTableIndex: MCOp = LowerSymbolOperand(MO, GetJumpTableSymbol(MO)); break; case MachineOperand::MO_ConstantPoolIndex: MCOp = LowerSymbolOperand(MO, GetConstantPoolIndexSymbol(MO)); break; -#endif } OutMI.addOperand(MCOp); diff --git a/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h b/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h index 67fe79c..4e15c2f 100644 --- a/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h +++ b/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h @@ -13,6 +13,7 @@ #include "llvm/Support/Compiler.h" namespace llvm { + class MCAsmInfo; class MCContext; class MCInst; class MCOperand; @@ -26,24 +27,27 @@ namespace llvm { /// ARMMCInstLower - This class is used to lower an MachineInstr into an MCInst. class VISIBILITY_HIDDEN ARMMCInstLower { MCContext &Ctx; - Mangler *Mang; + Mangler &Mang; + + const unsigned CurFunctionNumber; + const MCAsmInfo &MAI; //const ARMSubtarget &getSubtarget() const; public: - ARMMCInstLower(MCContext &ctx, Mangler *mang) - : Ctx(ctx), Mang(mang) {} + ARMMCInstLower(MCContext &ctx, Mangler &mang, unsigned FuncNum, + const MCAsmInfo &mai) + : Ctx(ctx), Mang(mang), CurFunctionNumber(FuncNum), MAI(mai) {} void Lower(const MachineInstr *MI, MCInst &OutMI) const; -/* - MCSymbol *GetPICBaseSymbol() const; - + //MCSymbol *GetPICBaseSymbol() const; MCSymbol *GetGlobalAddressSymbol(const MachineOperand &MO) const; - MCSymbol *GetExternalSymbolSymbol(const MachineOperand &MO) const; + //MCSymbol *GetExternalSymbolSymbol(const MachineOperand &MO) const; MCSymbol *GetJumpTableSymbol(const MachineOperand &MO) const; MCSymbol *GetConstantPoolIndexSymbol(const MachineOperand &MO) const; MCOperand LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const; +/* private: MachineModuleInfoMachO &getMachOMMI() const; */ |