summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/TargetMachine.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2018-01-24 02:11:18 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2018-01-24 02:11:18 +0000
commit432a587cf00b3ecb552750f0f4dbd830e18f500c (patch)
tree6f3ee8640c51d21d68de3e22872f302da18a00a1 /llvm/lib/Target/TargetMachine.cpp
parenta277d024f7a7c00796344105dbe0f5c427383158 (diff)
downloadbcm5719-llvm-432a587cf00b3ecb552750f0f4dbd830e18f500c.tar.gz
bcm5719-llvm-432a587cf00b3ecb552750f0f4dbd830e18f500c.zip
Don't assume a null GV is local for ELF and MachO.
This is already a simplification, and should help with avoiding a plt reference when calling an intrinsic with -fno-plt. With this change we return false for null GVs, so the caller only needs to check the new metadata to decide if it should use foo@plt or *foo@got. llvm-svn: 323297
Diffstat (limited to 'llvm/lib/Target/TargetMachine.cpp')
-rw-r--r--llvm/lib/Target/TargetMachine.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/llvm/lib/Target/TargetMachine.cpp b/llvm/lib/Target/TargetMachine.cpp
index ee5b010ecf2..76ec541f8b6 100644
--- a/llvm/lib/Target/TargetMachine.cpp
+++ b/llvm/lib/Target/TargetMachine.cpp
@@ -137,20 +137,27 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module &M,
if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
return true;
+ // If GV is null we know that this is a call to an intrinsic. For ELF and
+ // MachO we don't need to assume those are local since the liker can trivially
+ // convert a call to a PLT to a direct call if the target (in the runtime
+ // library) turns out to be local.
+ if (!GV)
+ return false;
+
// Most PIC code sequences that assume that a symbol is local cannot
// produce a 0 if it turns out the symbol is undefined. While this
// is ABI and relocation depended, it seems worth it to handle it
// here.
- if (GV && isPositionIndependent() && GV->hasExternalWeakLinkage())
+ if (isPositionIndependent() && GV->hasExternalWeakLinkage())
return false;
- if (GV && !GV->hasDefaultVisibility())
+ if (!GV->hasDefaultVisibility())
return true;
if (TT.isOSBinFormatMachO()) {
if (RM == Reloc::Static)
return true;
- return GV && GV->isStrongDefinitionForLinker();
+ return GV->isStrongDefinitionForLinker();
}
assert(TT.isOSBinFormatELF());
@@ -160,19 +167,19 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module &M,
RM == Reloc::Static || M.getPIELevel() != PIELevel::Default;
if (IsExecutable) {
// If the symbol is defined, it cannot be preempted.
- if (GV && !GV->isDeclarationForLinker())
+ if (!GV->isDeclarationForLinker())
return true;
// A symbol marked nonlazybind should not be accessed with a plt. If the
// symbol turns out to be external, the linker will convert a direct
// access to an access via the plt, so don't assume it is local.
- const Function *F = dyn_cast_or_null<Function>(GV);
+ const Function *F = dyn_cast<Function>(GV);
if (F && F->hasFnAttribute(Attribute::NonLazyBind))
return false;
- bool IsTLS = GV && GV->isThreadLocal();
+ bool IsTLS = GV->isThreadLocal();
bool IsAccessViaCopyRelocs =
- Options.MCOptions.MCPIECopyRelocations && GV && isa<GlobalVariable>(GV);
+ Options.MCOptions.MCPIECopyRelocations && isa<GlobalVariable>(GV);
Triple::ArchType Arch = TT.getArch();
bool IsPPC =
Arch == Triple::ppc || Arch == Triple::ppc64 || Arch == Triple::ppc64le;
OpenPOWER on IntegriCloud