diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-07-22 13:03:22 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-07-22 13:03:22 -0700 |
commit | b5d67b3f53ed7392a86110ebe4bfd7dcdda65ddd (patch) | |
tree | 886ae1f0d92d190700a54be09c835d1ab55c37f9 /binutils | |
parent | 28fccff586e77d73d1ef58d0e3f2d167065513b0 (diff) | |
download | riscv-gnu-toolchain-b5d67b3f53ed7392a86110ebe4bfd7dcdda65ddd.zip riscv-gnu-toolchain-b5d67b3f53ed7392a86110ebe4bfd7dcdda65ddd.tar.gz riscv-gnu-toolchain-b5d67b3f53ed7392a86110ebe4bfd7dcdda65ddd.tar.bz2 |
Avoid t0 for indirect calls
We sometimes use t0 as a link register, e.g. for the compressed prologues
and epilogues, and so we want microarchitectures to push the RAS when
rd=t0 and pop the RAS when rs1=t0. Thus, we want to avoid using t0 for
indirect calls to avoid errant RAS operations.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/bfd/elfnn-riscv.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/binutils/bfd/elfnn-riscv.c b/binutils/bfd/elfnn-riscv.c index 16792c6..b6ef1cc 100644 --- a/binutils/bfd/elfnn-riscv.c +++ b/binutils/bfd/elfnn-riscv.c @@ -190,7 +190,7 @@ static void riscv_make_plt0_entry(bfd_vma gotplt_addr, bfd_vma addr, uint32_t *entry) { /* auipc t2, %hi(.got.plt) - sub t1, t1, t0 # shifted .got.plt offset + hdr size + 12 + sub t1, t1, t3 # shifted .got.plt offset + hdr size + 12 l[w|d] t3, %lo(.got.plt)(t2) # _dl_runtime_resolve addi t1, t1, -(hdr size + 12) # shifted .got.plt offset addi t0, t2, %lo(.got.plt) # &.got.plt @@ -199,7 +199,7 @@ riscv_make_plt0_entry(bfd_vma gotplt_addr, bfd_vma addr, uint32_t *entry) jr t3 */ entry[0] = RISCV_UTYPE (AUIPC, X_T2, RISCV_PCREL_HIGH_PART (gotplt_addr, addr)); - entry[1] = RISCV_RTYPE (SUB, X_T1, X_T1, X_T0); + entry[1] = RISCV_RTYPE (SUB, X_T1, X_T1, X_T3); entry[2] = RISCV_ITYPE (LREG, X_T3, X_T2, RISCV_PCREL_LOW_PART (gotplt_addr, addr)); entry[3] = RISCV_ITYPE (ADDI, X_T1, X_T1, -(PLT_HEADER_SIZE + 12)); entry[4] = RISCV_ITYPE (ADDI, X_T0, X_T2, RISCV_PCREL_LOW_PART (gotplt_addr, addr)); @@ -213,14 +213,14 @@ riscv_make_plt0_entry(bfd_vma gotplt_addr, bfd_vma addr, uint32_t *entry) static void riscv_make_plt_entry(bfd_vma got_address, bfd_vma addr, uint32_t *entry) { - /* auipc t1, %hi(.got.plt entry) - l[w|d] t0, %lo(.got.plt entry)(t1) - jalr t1, t0 + /* auipc t3, %hi(.got.plt entry) + l[w|d] t3, %lo(.got.plt entry)(t3) + jalr t1, t3 nop */ - entry[0] = RISCV_UTYPE (AUIPC, X_T1, RISCV_PCREL_HIGH_PART (got_address, addr)); - entry[1] = RISCV_ITYPE (LREG, X_T0, X_T1, RISCV_PCREL_LOW_PART(got_address, addr)); - entry[2] = RISCV_ITYPE (JALR, X_T1, X_T0, 0); + entry[0] = RISCV_UTYPE (AUIPC, X_T3, RISCV_PCREL_HIGH_PART (got_address, addr)); + entry[1] = RISCV_ITYPE (LREG, X_T3, X_T3, RISCV_PCREL_LOW_PART(got_address, addr)); + entry[2] = RISCV_ITYPE (JALR, X_T1, X_T3, 0); entry[3] = RISCV_NOP; } |