aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/TargetMachine.cpp
diff options
context:
space:
mode:
authorArthur Eubanks <aeubanks@google.com>2023-12-14 09:28:27 -0800
committerArthur Eubanks <aeubanks@google.com>2023-12-14 09:49:35 -0800
commitec92d74a0ef89b9dd46aee6ec8aca6bfd3c66a54 (patch)
treea632502802e5bc0c9570c459fa24b8ade0d6cef8 /llvm/lib/Target/TargetMachine.cpp
parentf976719fb2cb23364957e5993f7fc3684ee15391 (diff)
downloadllvm-ec92d74a0ef89b9dd46aee6ec8aca6bfd3c66a54.zip
llvm-ec92d74a0ef89b9dd46aee6ec8aca6bfd3c66a54.tar.gz
llvm-ec92d74a0ef89b9dd46aee6ec8aca6bfd3c66a54.tar.bz2
Reland [X86] Respect code models more when determining if a global reference can fit in 32 bits (#75386)
For non-GlobalValue references, the small and medium code models can use 32 bit constants. For GlobalValue references, use TargetMachine::isLargeGlobalObject(). Look through aliases for determining if a GlobalValue is small or large. Even the large code model can reference small objects with 32 bit constants as long as we're in no-pic mode, or if the reference is offset from the GOT. Original commit broke the build...
Diffstat (limited to 'llvm/lib/Target/TargetMachine.cpp')
-rw-r--r--llvm/lib/Target/TargetMachine.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Target/TargetMachine.cpp b/llvm/lib/Target/TargetMachine.cpp
index 5428e14..3f96bd3 100644
--- a/llvm/lib/Target/TargetMachine.cpp
+++ b/llvm/lib/Target/TargetMachine.cpp
@@ -39,10 +39,16 @@ TargetMachine::TargetMachine(const Target &T, StringRef DataLayoutString,
TargetMachine::~TargetMachine() = default;
-bool TargetMachine::isLargeGlobalObject(const GlobalObject *GO) const {
+bool TargetMachine::isLargeGlobalValue(const GlobalValue *GVal) const {
if (getTargetTriple().getArch() != Triple::x86_64)
return false;
+ auto *GO = GVal->getAliaseeObject();
+
+ // Be conservative if we can't find an underlying GlobalObject.
+ if (!GO)
+ return true;
+
auto *GV = dyn_cast<GlobalVariable>(GO);
// Functions/GlobalIFuncs are only large under the large code model.