mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 20:59:51 +00:00
Don't create TargetGlobalAddress nodes with offsets that don't fit
in the 32-bit signed offset field of addresses. Even though this may be intended, some linkers refuse to relocate code where the relocated address computation overflows. Also, fix the sign-extension of constant offsets to use the actual pointer size, rather than the size of the GlobalAddress node, which may be different, for example on x86-64 where MVT::i32 is used when the address is being fit into the 32-bit displacement field. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57885 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
279c22e6da
commit
4401361a2f
@ -974,7 +974,7 @@ SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV,
|
||||
unsigned Opc;
|
||||
|
||||
// Truncate (with sign-extension) the offset value to the pointer size.
|
||||
unsigned BitWidth = VT.getSizeInBits();
|
||||
unsigned BitWidth = TLI.getPointerTy().getSizeInBits();
|
||||
if (BitWidth < 64)
|
||||
Offset = (Offset << (64 - BitWidth) >> (64 - BitWidth));
|
||||
|
||||
|
@ -4400,7 +4400,7 @@ X86TargetLowering::LowerGlobalAddress(const GlobalValue *GV,
|
||||
// Create the TargetGlobalAddress node, folding in the constant
|
||||
// offset if it is legal.
|
||||
SDValue Result;
|
||||
if (!IsPic && !ExtraLoadRequired) {
|
||||
if (!IsPic && !ExtraLoadRequired && isInt32(Offset)) {
|
||||
Result = DAG.getTargetGlobalAddress(GV, getPointerTy(), Offset);
|
||||
Offset = 0;
|
||||
} else
|
||||
|
14
test/CodeGen/X86/x86-64-disp.ll
Normal file
14
test/CodeGen/X86/x86-64-disp.ll
Normal file
@ -0,0 +1,14 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 | grep mov | count 2
|
||||
|
||||
; Fold an offset into an address even if it's not a 32-bit
|
||||
; signed integer.
|
||||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
@call_used_regs = external global [53 x i8], align 32
|
||||
|
||||
define fastcc void @foo() nounwind {
|
||||
%t = getelementptr [53 x i8]* @call_used_regs, i64 0, i64 4294967295
|
||||
store i8 1, i8* %t, align 1
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user