From 2dcaa41e1ef234a3387a2cb83288252b90c22fb8 Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Fri, 31 Aug 2018 08:00:25 +0000 Subject: [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 --- llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Target/ARM/ARMAsmPrinter.cpp') 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(); + MachineModuleInfoImpl::StubValueTy &StubSym = + MMICOFF.getGVStubEntry(MCSym); + + if (!StubSym.getPointer()) + StubSym = MachineModuleInfoImpl::StubValueTy(getSymbol(GV), true); + } + + return MCSym; } else if (Subtarget->isTargetELF()) { return getSymbol(GV); } -- cgit v1.2.3