[llvm] r341176 - [MinGW] [ARM] Add stubs for potential automatic dllimported variables
Martin Storsjo via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 31 01:00:26 PDT 2018
Author: mstorsjo
Date: Fri Aug 31 01:00:25 2018
New Revision: 341176
URL: http://llvm.org/viewvc/llvm-project?rev=341176&view=rev
Log:
[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
Added:
llvm/trunk/test/CodeGen/ARM/Windows/mingw-refptr.ll
Modified:
llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h
llvm/trunk/test/CodeGen/ARM/Windows/pic.ll
llvm/trunk/test/CodeGen/ARM/emutls_generic.ll
Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=341176&r1=341175&r2=341176&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Fri Aug 31 01:00:25 2018
@@ -827,15 +827,31 @@ MCSymbol *ARMAsmPrinter::GetARMGVSymbol(
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);
}
Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=341176&r1=341175&r2=341176&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp Fri Aug 31 01:00:25 2018
@@ -5081,6 +5081,7 @@ ARMBaseInstrInfo::getSerializableBitmask
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"},
Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=341176&r1=341175&r2=341176&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Fri Aug 31 01:00:25 2018
@@ -3318,8 +3318,13 @@ SDValue ARMTargetLowering::LowerGlobalAd
"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::LowerGlobalAd
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;
Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h?rev=341176&r1=341175&r2=341176&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h (original)
+++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMBaseInfo.h Fri Aug 31 01:00:25 2018
@@ -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,
Added: llvm/trunk/test/CodeGen/ARM/Windows/mingw-refptr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/Windows/mingw-refptr.ll?rev=341176&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/Windows/mingw-refptr.ll (added)
+++ llvm/trunk/test/CodeGen/ARM/Windows/mingw-refptr.ll Fri Aug 31 01:00:25 2018
@@ -0,0 +1,79 @@
+; RUN: llc < %s -mtriple=thumbv7-w64-mingw32 | FileCheck %s
+
+ at var = external local_unnamed_addr global i32, align 4
+ at dsolocalvar = external dso_local local_unnamed_addr global i32, align 4
+ at localvar = dso_local local_unnamed_addr global i32 0, align 4
+ at localcommon = common dso_local local_unnamed_addr global i32 0, align 4
+ at extvar = external dllimport local_unnamed_addr global i32, align 4
+
+define dso_local i32 @getVar() {
+; CHECK-LABEL: getVar:
+; CHECK: movw r0, :lower16:.refptr.var
+; CHECK: movt r0, :upper16:.refptr.var
+; CHECK: ldr r0, [r0]
+; CHECK: ldr r0, [r0]
+; CHECK: bx lr
+entry:
+ %0 = load i32, i32* @var, align 4
+ ret i32 %0
+}
+
+define dso_local i32 @getDsoLocalVar() {
+; CHECK-LABEL: getDsoLocalVar:
+; CHECK: movw r0, :lower16:dsolocalvar
+; CHECK: movt r0, :upper16:dsolocalvar
+; CHECK: ldr r0, [r0]
+; CHECK: bx lr
+entry:
+ %0 = load i32, i32* @dsolocalvar, align 4
+ ret i32 %0
+}
+
+define dso_local i32 @getLocalVar() {
+; CHECK-LABEL: getLocalVar:
+; CHECK: movw r0, :lower16:localvar
+; CHECK: movt r0, :upper16:localvar
+; CHECK: ldr r0, [r0]
+; CHECK: bx lr
+entry:
+ %0 = load i32, i32* @localvar, align 4
+ ret i32 %0
+}
+
+define dso_local i32 @getLocalCommon() {
+; CHECK-LABEL: getLocalCommon:
+; CHECK: movw r0, :lower16:localcommon
+; CHECK: movt r0, :upper16:localcommon
+; CHECK: ldr r0, [r0]
+; CHECK: bx lr
+entry:
+ %0 = load i32, i32* @localcommon, align 4
+ ret i32 %0
+}
+
+define dso_local i32 @getExtVar() {
+; CHECK-LABEL: getExtVar:
+; CHECK: movw r0, :lower16:__imp_extvar
+; CHECK: movt r0, :upper16:__imp_extvar
+; CHECK: ldr r0, [r0]
+; CHECK: ldr r0, [r0]
+; CHECK: bx lr
+entry:
+ %0 = load i32, i32* @extvar, align 4
+ ret i32 %0
+}
+
+define dso_local void @callFunc() {
+; CHECK-LABEL: callFunc:
+; CHECK: b otherFunc
+entry:
+ tail call void @otherFunc()
+ ret void
+}
+
+declare dso_local void @otherFunc()
+
+; CHECK: .section .rdata$.refptr.var,"dr",discard,.refptr.var
+; CHECK: .globl .refptr.var
+; CHECK: .refptr.var:
+; CHECK: .long var
Modified: llvm/trunk/test/CodeGen/ARM/Windows/pic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/Windows/pic.ll?rev=341176&r1=341175&r2=341176&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/Windows/pic.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/Windows/pic.ll Fri Aug 31 01:00:25 2018
@@ -18,6 +18,7 @@ entry:
; CHECK-WIN: ldrb r0, [r0]
; CHECK-GNU-LABEL: return_external
-; CHECK-GNU: movw r0, :lower16:external
-; CHECK-GNU: movt r0, :upper16:external
+; CHECK-GNU: movw r0, :lower16:.refptr.external
+; CHECK-GNU: movt r0, :upper16:.refptr.external
+; CHECK-GNU: ldr r0, [r0]
; CHECK-GNU: ldrb r0, [r0]
Modified: llvm/trunk/test/CodeGen/ARM/emutls_generic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/emutls_generic.ll?rev=341176&r1=341175&r2=341176&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/emutls_generic.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/emutls_generic.ll Fri Aug 31 01:00:25 2018
@@ -78,8 +78,9 @@ entry:
; ARM_32-NEXT: .long 0
; WIN-LABEL: get_external_x:
-; WIN: movw r0, :lower16:__emutls_v.external_x
-; WIN: movt r0, :upper16:__emutls_v.external_x
+; WIN: movw r0, :lower16:.refptr.__emutls_v.external_x
+; WIN: movt r0, :upper16:.refptr.__emutls_v.external_x
+; WIN: ldr r0, [r0]
; WIN: bl __emutls_get_address
; WIN-LABEL: get_external_y:
; WIN: movw r0, :lower16:__emutls_v.external_y
More information about the llvm-commits
mailing list