diff options
author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2012-12-14 17:02:38 +0000 |
---|---|---|
committer | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2012-12-14 17:02:38 +0000 |
commit | b453e16855f347e300f1dc0cd0dfbdd65c27b0d2 (patch) | |
tree | b743e0bbee0e4509e09b0b4cbc19b2d4e5d14113 /lib/Target/PowerPC/PPCISelLowering.h | |
parent | 79c3742620efccf7c36ea1738bb121ad70d644d0 (diff) | |
download | external_llvm-b453e16855f347e300f1dc0cd0dfbdd65c27b0d2.zip external_llvm-b453e16855f347e300f1dc0cd0dfbdd65c27b0d2.tar.gz external_llvm-b453e16855f347e300f1dc0cd0dfbdd65c27b0d2.tar.bz2 |
This patch improves the 64-bit PowerPC InitialExec TLS support by providing
for a wider range of GOT entries that can hold thread-relative offsets.
This matches the behavior of GCC, which was not documented in the PPC64 TLS
ABI. The ABI will be updated with the new code sequence.
Former sequence:
ld 9,x@got@tprel(2)
add 9,9,x@tls
New sequence:
addis 9,2,x@got@tprel@ha
ld 9,x@got@tprel@l(9)
add 9,9,x@tls
Note that a linker optimization exists to transform the new sequence into
the shorter sequence when appropriate, by replacing the addis with a nop
and modifying the base register and relocation type of the ld.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170209 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCISelLowering.h')
-rw-r--r-- | lib/Target/PowerPC/PPCISelLowering.h | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/Target/PowerPC/PPCISelLowering.h b/lib/Target/PowerPC/PPCISelLowering.h index f36fbfd..12b3df7 100644 --- a/lib/Target/PowerPC/PPCISelLowering.h +++ b/lib/Target/PowerPC/PPCISelLowering.h @@ -178,11 +178,16 @@ namespace llvm { CR6SET, CR6UNSET, - /// G8RC = LD_GOT_TPREL Symbol, G8RReg - Used by the initial-exec + /// G8RC = ADDIS_GOT_TPREL_HA %X2, Symbol - Used by the initial-exec + /// TLS model, produces an ADDIS8 instruction that adds the GOT + /// base to sym@got@tprel@ha. + ADDIS_GOT_TPREL_HA, + + /// G8RC = LD_GOT_TPREL_L Symbol, G8RReg - Used by the initial-exec /// TLS model, produces a LD instruction with base register G8RReg - /// and offset sym@got@tprel. The latter identifies the GOT entry - /// containing the offset of "sym" relative to the thread pointer. - LD_GOT_TPREL, + /// and offset sym@got@tprel@l. This completes the addition that + /// finds the offset of "sym" relative to the thread pointer. + LD_GOT_TPREL_L, /// G8RC = ADD_TLS G8RReg, Symbol - Used by the initial-exec TLS /// model, produces an ADD instruction that adds the contents of |