From 4aa21aa6d13b8ea00eb0817e53f24e5416ed3038 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 9 Jul 2009 00:58:53 +0000 Subject: [PATCH] move handling of dllimport linkage in isel, not in asmprinter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75086 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp | 13 ++++++------- .../X86/AsmPrinter/X86IntelAsmPrinter.cpp | 18 ++++++++++-------- lib/Target/X86/X86ISelLowering.cpp | 7 +++++-- lib/Target/X86/X86InstrInfo.h | 6 ++++++ 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index 6890f11443c..75d2cd96f8b 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -351,10 +351,9 @@ void X86ATTAsmPrinter::print_pcrel_imm(const MachineInstr *MI, unsigned OpNo) { O << Name; } } else { - if (GV->hasDLLImportLinkage()) { - assert(MO.getTargetFlags() == 0); + // Handle dllimport linkage. + if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) O << "__imp_"; - } O << Name; if (shouldPrintPLT(TM, Subtarget)) { @@ -503,10 +502,9 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, PrintPICBaseSymbol(); } } else { - if (GV->hasDLLImportLinkage()) { + // Handle dllimport linkage. + if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) O << "__imp_"; - assert(MO.getTargetFlags() == 0); - } O << Name; } @@ -533,7 +531,8 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, switch (MO.getTargetFlags()) { default: assert(0 && "Unknown target flag on GV operand"); - case X86II::MO_NO_FLAG: + case X86II::MO_NO_FLAG: // No flag. + case X86II::MO_DLLIMPORT: // Prefix, not a suffix. break; case X86II::MO_GOT_ABSOLUTE_ADDRESS: O << " + [.-"; diff --git a/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp index 9d4df93c1b4..ad8d6adde7e 100644 --- a/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.cpp @@ -244,11 +244,13 @@ void X86IntelAsmPrinter::printOp(const MachineOperand &MO, decorateName(Name, GV); if (!isMemOp) O << "OFFSET "; - if (GV->hasDLLImportLinkage()) { - // FIXME: This should be fixed with full support of stdcall & fastcall - // CC's + + // Handle dllimport linkage. + // FIXME: This should be fixed with full support of stdcall & fastcall + // CC's + if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) O << "__imp_"; - } + O << Name; printOffset(MO.getOffset()); return; @@ -278,11 +280,11 @@ void X86IntelAsmPrinter::print_pcrel_imm(const MachineInstr *MI, unsigned OpNo){ std::string Name = Mang->getValueName(GV); decorateName(Name, GV); - if (GV->hasDLLImportLinkage()) { - // FIXME: This should be fixed with full support of stdcall & fastcall - // CC's + // Handle dllimport linkage. + // FIXME: This should be fixed with full support of stdcall & fastcall + // CC's + if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) O << "__imp_"; - } O << Name; printOffset(MO.getOffset()); return; diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 32f247df977..3f6c759ea5f 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -4547,13 +4547,16 @@ X86TargetLowering::LowerGlobalAddress(const GlobalValue *GV, DebugLoc dl, // offset if it is legal. SDValue Result; if (!IsPic && !ExtraLoadRequired && isInt32(Offset)) { + // A direct static reference to a global. Result = DAG.getTargetGlobalAddress(GV, getPointerTy(), Offset); Offset = 0; } else { unsigned char OpFlags = 0; - if (Subtarget->isPICStyleRIPRel() && - getTargetMachine().getRelocationModel() != Reloc::Static) { + if (GV->hasDLLImportLinkage()) + OpFlags = X86II::MO_DLLIMPORT; + else if (Subtarget->isPICStyleRIPRel() && + getTargetMachine().getRelocationModel() != Reloc::Static) { if (ExtraLoadRequired) OpFlags = X86II::MO_GOTPCREL; } else if (Subtarget->isPICStyleGOT() && diff --git a/lib/Target/X86/X86InstrInfo.h b/lib/Target/X86/X86InstrInfo.h index 83f01945ea2..45f358470a0 100644 --- a/lib/Target/X86/X86InstrInfo.h +++ b/lib/Target/X86/X86InstrInfo.h @@ -149,6 +149,12 @@ namespace X86II { /// SYMBOL_LABEL @NTPOFF MO_NTPOFF = 11, + /// MO_DLLIMPORT - On a symbol operand "FOO", this indicates that the + /// reference is actually to the "__imp_FOO" symbol. This is used for + /// dllimport linkage on windows. + MO_DLLIMPORT = 12, + + //===------------------------------------------------------------------===// // Instruction encodings. These are the standard/most common forms for X86 // instructions.