diff options
| author | Martin Storsjo <martin@martin.st> | 2018-08-31 08:00:25 +0000 | 
|---|---|---|
| committer | Martin Storsjo <martin@martin.st> | 2018-08-31 08:00:25 +0000 | 
| commit | 2dcaa41e1ef234a3387a2cb83288252b90c22fb8 (patch) | |
| tree | abd2f61eff312ec16a1e87fec644cfd24a5f61d1 /llvm/lib/Target/ARM | |
| parent | 802fcb4167a309dc5a10af14d1a1aaf5a2c625de (diff) | |
| download | bcm5719-llvm-2dcaa41e1ef234a3387a2cb83288252b90c22fb8.tar.gz bcm5719-llvm-2dcaa41e1ef234a3387a2cb83288252b90c22fb8.zip  | |
[MinGW] [ARM] Add stubs for potential automatic dllimported variables
The runtime pseudo relocations can't handle the ARM format embedded
addresses in movw/movt pairs. By using stubs, the potentially
dllimported addresses can be touched up by the runtime pseudo relocation
framework.
Differential Revision: https://reviews.llvm.org/D51450
llvm-svn: 341176
Diffstat (limited to 'llvm/lib/Target/ARM')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 22 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h | 5 | 
4 files changed, 33 insertions, 6 deletions
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index a19584c7d40..17dd7ee7b81 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -827,15 +827,31 @@ MCSymbol *ARMAsmPrinter::GetARMGVSymbol(const GlobalValue *GV,      assert(Subtarget->isTargetWindows() &&             "Windows is the only supported COFF target"); -    bool IsIndirect = (TargetFlags & ARMII::MO_DLLIMPORT); +    bool IsIndirect = +        (TargetFlags & (ARMII::MO_DLLIMPORT | ARMII::MO_COFFSTUB));      if (!IsIndirect)        return getSymbol(GV);      SmallString<128> Name; -    Name = "__imp_"; +    if (TargetFlags & ARMII::MO_DLLIMPORT) +      Name = "__imp_"; +    else if (TargetFlags & ARMII::MO_COFFSTUB) +      Name = ".refptr.";      getNameWithPrefix(Name, GV); -    return OutContext.getOrCreateSymbol(Name); +    MCSymbol *MCSym = OutContext.getOrCreateSymbol(Name); + +    if (TargetFlags & ARMII::MO_COFFSTUB) { +      MachineModuleInfoCOFF &MMICOFF = +          MMI->getObjFileInfo<MachineModuleInfoCOFF>(); +      MachineModuleInfoImpl::StubValueTy &StubSym = +          MMICOFF.getGVStubEntry(MCSym); + +      if (!StubSym.getPointer()) +        StubSym = MachineModuleInfoImpl::StubValueTy(getSymbol(GV), true); +    } + +    return MCSym;    } else if (Subtarget->isTargetELF()) {      return getSymbol(GV);    } diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp index 1b626ff5580..9a4614c1686 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -5081,6 +5081,7 @@ ARMBaseInstrInfo::getSerializableBitmaskMachineOperandTargetFlags() const {    using namespace ARMII;    static const std::pair<unsigned, const char *> TargetFlags[] = { +      {MO_COFFSTUB, "arm-coffstub"},        {MO_GOT, "arm-got"},        {MO_SBREL, "arm-sbrel"},        {MO_DLLIMPORT, "arm-dllimport"}, diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index a6ce9615b8c..26f23c55698 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -3318,8 +3318,13 @@ SDValue ARMTargetLowering::LowerGlobalAddressWindows(SDValue Op,           "ROPI/RWPI not currently supported for Windows");    const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal(); -  const ARMII::TOF TargetFlags = -    (GV->hasDLLImportStorageClass() ? ARMII::MO_DLLIMPORT : ARMII::MO_NO_FLAG); +  ARMII::TOF TargetFlags = ARMII::MO_NO_FLAG; +  if (GV->hasDLLImportStorageClass()) +    TargetFlags = ARMII::MO_DLLIMPORT; +  else if (Subtarget->getTargetTriple().isWindowsGNUEnvironment() && +           !GV->isDSOLocal() && GV->isDeclarationForLinker() && +           isa<GlobalVariable>(GV)) +    TargetFlags = ARMII::MO_COFFSTUB;    EVT PtrVT = getPointerTy(DAG.getDataLayout());    SDValue Result;    SDLoc DL(Op); @@ -3331,7 +3336,7 @@ SDValue ARMTargetLowering::LowerGlobalAddressWindows(SDValue Op,    Result = DAG.getNode(ARMISD::Wrapper, DL, PtrVT,                         DAG.getTargetGlobalAddress(GV, DL, PtrVT, /*Offset=*/0,                                                    TargetFlags)); -  if (GV->hasDLLImportStorageClass()) +  if (TargetFlags & (ARMII::MO_DLLIMPORT | ARMII::MO_COFFSTUB))      Result = DAG.getLoad(PtrVT, DL, DAG.getEntryNode(), Result,                           MachinePointerInfo::getGOT(DAG.getMachineFunction()));    return Result; diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h b/llvm/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h index b918006fe9e..cdadf198e90 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h @@ -246,6 +246,11 @@ namespace ARMII {      /// just that part of the flag set.      MO_OPTION_MASK = 0x3, +    /// MO_COFFSTUB - On a symbol operand "FOO", this indicates that the +    /// reference is actually to the ".refptrp.FOO" symbol.  This is used for +    /// stub symbols on windows. +    MO_COFFSTUB = 0x4, +      /// MO_GOT - On a symbol operand, this represents a GOT relative relocation.      MO_GOT = 0x8,  | 

