diff --git a/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index d5e2991ec504..4685c0e2e379 100644 --- a/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/llvm/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/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp b/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp index 8393e241284d..41be859ce0d2 100644 --- a/llvm/lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp +++ b/llvm/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/llvm/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp b/llvm/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp index d60996ebe159..45e61de3f845 100644 --- a/llvm/lib/Target/ARM/AsmPrinter/ARMMCInstLower.cpp +++ b/llvm/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/llvm/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h b/llvm/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h index 67fe79cf83a1..4e15c2f7c6dd 100644 --- a/llvm/lib/Target/ARM/AsmPrinter/ARMMCInstLower.h +++ b/llvm/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; */