From d980ed0d002b120a8dc3e1ded951211714b01894 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 27 Jun 2016 23:15:57 +0000 Subject: [PATCH] Move shouldAssumeDSOLocal to Target. Should fix the shared library build. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273958 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/Analysis.h | 3 -- include/llvm/Target/TargetMachine.h | 2 ++ lib/CodeGen/Analysis.cpp | 42 -------------------------- lib/CodeGen/SelectionDAG/TargetLowering.cpp | 4 +-- lib/Target/AArch64/AArch64Subtarget.cpp | 3 +- lib/Target/ARM/ARMFastISel.cpp | 5 +-- lib/Target/ARM/ARMISelLowering.cpp | 10 ++---- lib/Target/ARM/ARMSubtarget.cpp | 2 +- lib/Target/Hexagon/HexagonISelLowering.cpp | 3 +- lib/Target/PowerPC/PPCISelLowering.cpp | 4 +-- lib/Target/PowerPC/PPCSubtarget.cpp | 3 +- lib/Target/SystemZ/SystemZISelLowering.cpp | 3 +- lib/Target/SystemZ/SystemZSubtarget.cpp | 3 +- lib/Target/SystemZ/SystemZSubtarget.h | 3 +- lib/Target/TargetMachine.cpp | 47 ++++++++++++++++++++++++++++- lib/Target/X86/X86Subtarget.cpp | 5 ++- 16 files changed, 63 insertions(+), 79 deletions(-) diff --git a/include/llvm/CodeGen/Analysis.h b/include/llvm/CodeGen/Analysis.h index d425fed4212..2e4dc49a1e2 100644 --- a/include/llvm/CodeGen/Analysis.h +++ b/include/llvm/CodeGen/Analysis.h @@ -120,9 +120,6 @@ bool returnTypeIsEligibleForTailCall(const Function *F, // or we are in LTO. bool canBeOmittedFromSymbolTable(const GlobalValue *GV); -bool shouldAssumeDSOLocal(Reloc::Model RM, const Triple &TT, const Module &M, - const GlobalValue *GV); - DenseMap getFuncletMembership(const MachineFunction &MF); diff --git a/include/llvm/Target/TargetMachine.h b/include/llvm/Target/TargetMachine.h index 0b521064f21..79897b27f2e 100644 --- a/include/llvm/Target/TargetMachine.h +++ b/include/llvm/Target/TargetMachine.h @@ -177,6 +177,8 @@ public: bool isPositionIndependent() const; + bool shouldAssumeDSOLocal(const Module &M, const GlobalValue *GV) const; + /// Returns the TLS model which should be used for the given global variable. TLSModel::Model getTLSModel(const GlobalValue *GV) const; diff --git a/lib/CodeGen/Analysis.cpp b/lib/CodeGen/Analysis.cpp index d3b3a9de110..d69073458cd 100644 --- a/lib/CodeGen/Analysis.cpp +++ b/lib/CodeGen/Analysis.cpp @@ -638,48 +638,6 @@ bool llvm::canBeOmittedFromSymbolTable(const GlobalValue *GV) { return GV->hasAtLeastLocalUnnamedAddr(); } -// FIXME: make this a proper option -static bool CanUseCopyRelocWithPIE = false; - -bool llvm::shouldAssumeDSOLocal(Reloc::Model RM, const Triple &TT, - const Module &M, const GlobalValue *GV) { - // DLLImport explicitly marks the GV as external. - if (GV && GV->hasDLLImportStorageClass()) - return false; - - // Every other GV is local on COFF - if (TT.isOSBinFormatCOFF()) - return true; - - if (GV && (GV->hasLocalLinkage() || !GV->hasDefaultVisibility())) - return true; - - if (TT.isOSBinFormatMachO()) { - if (RM == Reloc::Static) - return true; - return GV && GV->isStrongDefinitionForLinker(); - } - - assert(TT.isOSBinFormatELF()); - assert(RM != Reloc::DynamicNoPIC); - - bool IsExecutable = - RM == Reloc::Static || M.getPIELevel() != PIELevel::Default; - if (IsExecutable) { - // If the symbol is defined, it cannot be preempted. - if (GV && !GV->isDeclarationForLinker()) - return true; - - bool IsTLS = GV && GV->isThreadLocal(); - // Check if we can use copy relocations. - if (!IsTLS && (RM == Reloc::Static || CanUseCopyRelocWithPIE)) - return true; - } - - // ELF supports preemption of other symbols. - return false; -} - static void collectFuncletMembers( DenseMap &FuncletMembership, int Funclet, const MachineBasicBlock *MBB) { diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 87ce2de0542..10dcb0a266d 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -316,13 +316,11 @@ TargetLowering::getPICJumpTableRelocBaseExpr(const MachineFunction *MF, bool TargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const { const TargetMachine &TM = getTargetMachine(); - Reloc::Model RM = TM.getRelocationModel(); const GlobalValue *GV = GA->getGlobal(); - const Triple &TargetTriple = TM.getTargetTriple(); // If the address is not even local to this DSO we will have to load it from // a got and then add the offset. - if (!shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV)) + if (!TM.shouldAssumeDSOLocal(*GV->getParent(), GV)) return false; // If the code is position independent we will have to add a base register. diff --git a/lib/Target/AArch64/AArch64Subtarget.cpp b/lib/Target/AArch64/AArch64Subtarget.cpp index 20faf8e6d2e..572cf7d7dca 100644 --- a/lib/Target/AArch64/AArch64Subtarget.cpp +++ b/lib/Target/AArch64/AArch64Subtarget.cpp @@ -112,8 +112,7 @@ AArch64Subtarget::ClassifyGlobalReference(const GlobalValue *GV, if (TM.getCodeModel() == CodeModel::Large && isTargetMachO()) return AArch64II::MO_GOT; - Reloc::Model RM = TM.getRelocationModel(); - if (!shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV)) + if (!TM.shouldAssumeDSOLocal(*GV->getParent(), GV)) return AArch64II::MO_GOT; // The small code mode's direct accesses use ADRP, which cannot necessarily diff --git a/lib/Target/ARM/ARMFastISel.cpp b/lib/Target/ARM/ARMFastISel.cpp index 84160ce5e84..dc6782f9a3a 100644 --- a/lib/Target/ARM/ARMFastISel.cpp +++ b/lib/Target/ARM/ARMFastISel.cpp @@ -2935,10 +2935,7 @@ bool ARMFastISel::tryToFoldLoadIntoMI(MachineInstr *MI, unsigned OpNo, unsigned ARMFastISel::ARMLowerPICELF(const GlobalValue *GV, unsigned Align, MVT VT) { - Reloc::Model RM = TM.getRelocationModel(); - const Triple &TargetTriple = TM.getTargetTriple(); - bool UseGOT_PREL = - !shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV); + bool UseGOT_PREL = !TM.shouldAssumeDSOLocal(*GV->getParent(), GV); LLVMContext *Context = &MF->getFunction()->getContext(); unsigned ARMPCLabelIndex = AFI->createPICLabelUId(); diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index dd7f5218bd5..1ca216a60a2 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -1802,15 +1802,12 @@ ARMTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, bool isDirect = false; const TargetMachine &TM = getTargetMachine(); - Reloc::Model RM = TM.getRelocationModel(); - const Triple &TargetTriple = TM.getTargetTriple(); const Module *Mod = MF.getFunction()->getParent(); const GlobalValue *GV = nullptr; if (GlobalAddressSDNode *G = dyn_cast(Callee)) GV = G->getGlobal(); bool isStub = - !shouldAssumeDSOLocal(RM, TargetTriple, *Mod, GV) && - Subtarget->isTargetMachO(); + !TM.shouldAssumeDSOLocal(*Mod, GV) && Subtarget->isTargetMachO(); bool isARMFunc = !Subtarget->isThumb() || (isStub && !Subtarget->isMClass()); bool isLocalARMFunc = false; @@ -2799,11 +2796,8 @@ SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op, SDLoc dl(Op); const GlobalValue *GV = cast(Op)->getGlobal(); const TargetMachine &TM = getTargetMachine(); - Reloc::Model RM = TM.getRelocationModel(); - const Triple &TargetTriple = TM.getTargetTriple(); if (isPositionIndependent()) { - bool UseGOT_PREL = - !shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV); + bool UseGOT_PREL = !TM.shouldAssumeDSOLocal(*GV->getParent(), GV); MachineFunction &MF = DAG.getMachineFunction(); ARMFunctionInfo *AFI = MF.getInfo(); diff --git a/lib/Target/ARM/ARMSubtarget.cpp b/lib/Target/ARM/ARMSubtarget.cpp index 8bc22d18920..719ac77e8dc 100644 --- a/lib/Target/ARM/ARMSubtarget.cpp +++ b/lib/Target/ARM/ARMSubtarget.cpp @@ -264,7 +264,7 @@ bool ARMSubtarget::isAAPCS16_ABI() const { bool ARMSubtarget::GVIsIndirectSymbol(const GlobalValue *GV, Reloc::Model RelocM) const { - if (!shouldAssumeDSOLocal(RelocM, TargetTriple, *GV->getParent(), GV)) + if (!TM.shouldAssumeDSOLocal(*GV->getParent(), GV)) return true; // 32 bit macho has no relocation for a-b if a is undefined, even if b is in diff --git a/lib/Target/Hexagon/HexagonISelLowering.cpp b/lib/Target/Hexagon/HexagonISelLowering.cpp index 2fa0bfd5765..98e4a27834c 100644 --- a/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/lib/Target/Hexagon/HexagonISelLowering.cpp @@ -1503,8 +1503,7 @@ HexagonTargetLowering::LowerGLOBALADDRESS(SDValue Op, SelectionDAG &DAG) const { return DAG.getNode(HexagonISD::CONST32, dl, PtrVT, GA); } - const Triple &TargetTriple = HTM.getTargetTriple(); - bool UsePCRel = shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV); + bool UsePCRel = getTargetMachine().shouldAssumeDSOLocal(*GV->getParent(), GV); if (UsePCRel) { SDValue GA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, Offset, HexagonII::MO_PCREL); diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index 3d3cd414942..b895f3fe80c 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -4278,7 +4278,7 @@ PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag, SDValue &Chain, // PC-relative references to external symbols should go through $stub, unless // we're building with the leopard linker or later, which automatically // synthesizes these stubs. - Reloc::Model RM = DAG.getTarget().getRelocationModel(); + const TargetMachine &TM = DAG.getTarget(); const Triple &TargetTriple = Subtarget.getTargetTriple(); bool OldMachOLinker = TargetTriple.isMacOSX() && TargetTriple.isMacOSXVersionLT(10, 5); @@ -4286,7 +4286,7 @@ PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag, SDValue &Chain, const GlobalValue *GV = nullptr; if (auto *G = dyn_cast(Callee)) GV = G->getGlobal(); - bool Local = shouldAssumeDSOLocal(RM, TargetTriple, *Mod, GV); + bool Local = TM.shouldAssumeDSOLocal(*Mod, GV); bool UsePlt = !Local && (OldMachOLinker || (Subtarget.isTargetELF() && !isPPC64)); diff --git a/lib/Target/PowerPC/PPCSubtarget.cpp b/lib/Target/PowerPC/PPCSubtarget.cpp index 577d2d73895..312a2d4c0d5 100644 --- a/lib/Target/PowerPC/PPCSubtarget.cpp +++ b/lib/Target/PowerPC/PPCSubtarget.cpp @@ -153,8 +153,7 @@ void PPCSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) { bool PPCSubtarget::hasLazyResolverStub(const GlobalValue *GV) const { if (!HasLazyResolverStubs) return false; - if (!shouldAssumeDSOLocal(TM.getRelocationModel(), TM.getTargetTriple(), - *GV->getParent(), GV)) + if (!TM.shouldAssumeDSOLocal(*GV->getParent(), GV)) return true; // 32 bit macho has no relocation for a-b if a is undefined, even if b is in // the section that is being relocated. This means we have to use o load even diff --git a/lib/Target/SystemZ/SystemZISelLowering.cpp b/lib/Target/SystemZ/SystemZISelLowering.cpp index ec8740a9d8b..9c4c93df654 100644 --- a/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -2458,11 +2458,10 @@ SDValue SystemZTargetLowering::lowerGlobalAddress(GlobalAddressSDNode *Node, const GlobalValue *GV = Node->getGlobal(); int64_t Offset = Node->getOffset(); EVT PtrVT = getPointerTy(DAG.getDataLayout()); - Reloc::Model RM = DAG.getTarget().getRelocationModel(); CodeModel::Model CM = DAG.getTarget().getCodeModel(); SDValue Result; - if (Subtarget.isPC32DBLSymbol(GV, RM, CM)) { + if (Subtarget.isPC32DBLSymbol(GV, CM)) { // Assign anchors at 1<<12 byte boundaries. uint64_t Anchor = Offset & ~uint64_t(0xfff); Result = DAG.getTargetGlobalAddress(GV, DL, PtrVT, Anchor); diff --git a/lib/Target/SystemZ/SystemZSubtarget.cpp b/lib/Target/SystemZ/SystemZSubtarget.cpp index 5f947495e32..b8476309463 100644 --- a/lib/Target/SystemZ/SystemZSubtarget.cpp +++ b/lib/Target/SystemZ/SystemZSubtarget.cpp @@ -46,7 +46,6 @@ SystemZSubtarget::SystemZSubtarget(const Triple &TT, const std::string &CPU, TSInfo(), FrameLowering() {} bool SystemZSubtarget::isPC32DBLSymbol(const GlobalValue *GV, - Reloc::Model RM, CodeModel::Model CM) const { // PC32DBL accesses require the low bit to be clear. Note that a zero // value selects the default alignment and is therefore OK. @@ -55,7 +54,7 @@ bool SystemZSubtarget::isPC32DBLSymbol(const GlobalValue *GV, // For the small model, all locally-binding symbols are in range. if (CM == CodeModel::Small) - return shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV); + return TLInfo.getTargetMachine().shouldAssumeDSOLocal(*GV->getParent(), GV); // For Medium and above, assume that the symbol is not within the 4GB range. // Taking the address of locally-defined text would be OK, but that diff --git a/lib/Target/SystemZ/SystemZSubtarget.h b/lib/Target/SystemZ/SystemZSubtarget.h index fb157190a48..d091625f1b0 100644 --- a/lib/Target/SystemZ/SystemZSubtarget.h +++ b/lib/Target/SystemZ/SystemZSubtarget.h @@ -116,8 +116,7 @@ public: // Return true if GV can be accessed using LARL for reloc model RM // and code model CM. - bool isPC32DBLSymbol(const GlobalValue *GV, Reloc::Model RM, - CodeModel::Model CM) const; + bool isPC32DBLSymbol(const GlobalValue *GV, CodeModel::Model CM) const; bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } }; diff --git a/lib/Target/TargetMachine.cpp b/lib/Target/TargetMachine.cpp index d7617e73245..b703105eaf4 100644 --- a/lib/Target/TargetMachine.cpp +++ b/lib/Target/TargetMachine.cpp @@ -110,11 +110,56 @@ static TLSModel::Model getSelectedTLSModel(const GlobalValue *GV) { llvm_unreachable("invalid TLS model"); } +// FIXME: make this a proper option +static bool CanUseCopyRelocWithPIE = false; + +bool TargetMachine::shouldAssumeDSOLocal(const Module &M, + const GlobalValue *GV) const { + Reloc::Model RM = getRelocationModel(); + const Triple &TT = getTargetTriple(); + + // DLLImport explicitly marks the GV as external. + if (GV && GV->hasDLLImportStorageClass()) + return false; + + // Every other GV is local on COFF + if (TT.isOSBinFormatCOFF()) + return true; + + if (GV && (GV->hasLocalLinkage() || !GV->hasDefaultVisibility())) + return true; + + if (TT.isOSBinFormatMachO()) { + if (RM == Reloc::Static) + return true; + return GV && GV->isStrongDefinitionForLinker(); + } + + assert(TT.isOSBinFormatELF()); + assert(RM != Reloc::DynamicNoPIC); + + bool IsExecutable = + RM == Reloc::Static || M.getPIELevel() != PIELevel::Default; + if (IsExecutable) { + // If the symbol is defined, it cannot be preempted. + if (GV && !GV->isDeclarationForLinker()) + return true; + + bool IsTLS = GV && GV->isThreadLocal(); + // Check if we can use copy relocations. + if (!IsTLS && (RM == Reloc::Static || CanUseCopyRelocWithPIE)) + return true; + } + + // ELF supports preemption of other symbols. + return false; +} + TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const { bool IsPIE = GV->getParent()->getPIELevel() != PIELevel::Default; Reloc::Model RM = getRelocationModel(); bool IsSharedLibrary = RM == Reloc::PIC_ && !IsPIE; - bool IsLocal = shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV); + bool IsLocal = shouldAssumeDSOLocal(*GV->getParent(), GV); TLSModel::Model Model; if (IsSharedLibrary) { diff --git a/lib/Target/X86/X86Subtarget.cpp b/lib/Target/X86/X86Subtarget.cpp index 4eddfacbafd..49ad9ccaef2 100644 --- a/lib/Target/X86/X86Subtarget.cpp +++ b/lib/Target/X86/X86Subtarget.cpp @@ -93,8 +93,7 @@ unsigned char X86Subtarget::classifyGlobalReference(const GlobalValue *GV, if (TM.getCodeModel() == CodeModel::Large) return X86II::MO_NO_FLAG; - Reloc::Model RM = TM.getRelocationModel(); - if (shouldAssumeDSOLocal(RM, TargetTriple, M, GV)) + if (TM.shouldAssumeDSOLocal(M, GV)) return classifyLocalReference(GV); if (isTargetCOFF()) @@ -120,7 +119,7 @@ X86Subtarget::classifyGlobalFunctionReference(const GlobalValue *GV) const { unsigned char X86Subtarget::classifyGlobalFunctionReference(const GlobalValue *GV, const Module &M) const { - if (shouldAssumeDSOLocal(TM.getRelocationModel(), TargetTriple, M, GV)) + if (TM.shouldAssumeDSOLocal(M, GV)) return X86II::MO_NO_FLAG; assert(!isTargetCOFF()); -- 2.11.0