diff options
author | Chris Lattner <sabre@nondot.org> | 2009-08-18 05:33:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-08-18 05:33:27 +0000 |
commit | 40bbb859495121dd525b7e143418e76798a4005b (patch) | |
tree | 295376c16dbb1de6aa6c0ee4e063ccc967a05e9b /llvm/lib | |
parent | 2a4061929f05514b4a31c5a35193882cfe138743 (diff) | |
download | bcm5719-llvm-40bbb859495121dd525b7e143418e76798a4005b.tar.gz bcm5719-llvm-40bbb859495121dd525b7e143418e76798a4005b.zip |
add support for some targetflags on GV operands. This allows us to
send instructions like:
NEW: movl "L___stack_chk_guard$non_lazy_ptr" - "L1$pb"(%esi), %eax
OLD: movl L___stack_chk_guard$non_lazy_ptr-"L1$pb"(%esi), %eax
through the streamer. Several fixmes.
llvm-svn: 79317
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index 8c9401cdbdf..ca001d32dc0 100644 --- a/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -72,7 +72,7 @@ MCSymbol *X86ATTAsmPrinter::GetPICBaseSymbol() { } else { assert(Subtarget->isTargetELF() && "Don't know how to print PIC label!"); Name = ".Lllvm$" + utostr(getFunctionNumber())+".$piclabel"; - } + } return OutContext.GetOrCreateSymbol(Name); } @@ -734,9 +734,51 @@ MCOperand X86ATTAsmPrinter::LowerGlobalAddressOperand(const MachineOperand &MO){ else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) FnStubs[Name] = Mang->getMangledName(GV); + + // Handle target operand flags. + // FIXME: This should be common between external symbols, constant pool etc. + MCSymbol *NegatedSymbol = 0; + + switch (MO.getTargetFlags()) { + default: + llvm_unreachable("Unknown target flag on GV operand"); + case X86II::MO_NO_FLAG: // No flag. + break; + case X86II::MO_DARWIN_NONLAZY: + case X86II::MO_DARWIN_HIDDEN_NONLAZY: + case X86II::MO_DLLIMPORT: + case X86II::MO_DARWIN_STUB: + // These affect the name of the symbol, not any suffix. + break; + case X86II::MO_GOT_ABSOLUTE_ADDRESS: + assert(0 && "Reloc mode unimp!"); + //O << " + [.-"; + //PrintPICBaseSymbol(); + //O << ']'; + break; + case X86II::MO_PIC_BASE_OFFSET: + case X86II::MO_DARWIN_NONLAZY_PIC_BASE: + case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: + // Subtract the pic base. + NegatedSymbol = GetPICBaseSymbol(); + break; + + // FIXME: These probably should be a modifier on the symbol or something?? + case X86II::MO_TLSGD: Name += "@TLSGD"; break; + case X86II::MO_GOTTPOFF: Name += "@GOTTPOFF"; break; + case X86II::MO_INDNTPOFF: Name += "@INDNTPOFF"; break; + case X86II::MO_TPOFF: Name += "@TPOFF"; break; + case X86II::MO_NTPOFF: Name += "@NTPOFF"; break; + case X86II::MO_GOTPCREL: Name += "@GOTPCREL"; break; + case X86II::MO_GOT: Name += "@GOT"; break; + case X86II::MO_GOTOFF: Name += "@GOTOFF"; break; + case X86II::MO_PLT: Name += "@PLT"; break; + } + // Create a symbol for the name. MCSymbol *Sym = OutContext.GetOrCreateSymbol(Name); - return MCOperand::CreateMCValue(MCValue::get(Sym, 0, MO.getOffset())); + return MCOperand::CreateMCValue(MCValue::get(Sym, NegatedSymbol, + MO.getOffset())); } MCOperand X86ATTAsmPrinter:: |