[AArch64] Gas add BFD_RELOC_AARCH64_LD64_GOTOFF_LO15 support
authorRenlin Li <renlin.li@arm.com>
Mon, 15 Jun 2015 10:07:37 +0000 (11:07 +0100)
committerJiong Wang <jiong.wang@arm.com>
Mon, 15 Jun 2015 10:07:37 +0000 (11:07 +0100)
2015-06-15  Renlin Li <renlin.li@arm.com>
bfd/
    * reloc.c (BFD_RELOC_AARCH64_LD64_GOTOFF_LO15): New entry.
    * elfnn-aarch64.c (elfNN_aarch64_howto_table): New entry for
    BFD_RELOC_AARCH64_LD64_GOTOFF_LO15.
    * bfd-in2.h: Regenerate.
    * libbfd.h: Regenerate.

gas/
    * config/tc-aarch64.c (reloc_table): New relocation modifier.
    (md_apply_fix): Support BFD_RELOC_AARCH64_LD64_GOTOFF_LO15.
    (aarch64_force_relocation): Ditto

gas/testsuite/
    * gas/aarch64/reloc-insn.s: Update test
    * gas/aarch64/reloc-insn.d: Update expected result.

bfd/ChangeLog
bfd/bfd-in2.h
bfd/elfnn-aarch64.c
bfd/libbfd.h
bfd/reloc.c
gas/ChangeLog
gas/config/tc-aarch64.c
gas/testsuite/ChangeLog
gas/testsuite/gas/aarch64/reloc-insn.d
gas/testsuite/gas/aarch64/reloc-insn.s

index 5aaa45ee8c808fa4439223bcb92d25e60d0b4cfb..ef760d1384759dd285c7346f3bba0dbe520b9dfc 100644 (file)
@@ -1,3 +1,11 @@
+2015-06-15  Renlin Li  <renlin.li@arm.com>
+
+       * reloc.c (BFD_RELOC_AARCH64_LD64_GOTOFF_LO15): New entry.
+       * bfd-in2.h: Regenerate.
+       * libbfd.h: Regenerate.
+       * elfnn-aarch64.c (elfNN_aarch64_howto_table): New entry for
+       BFD_RELOC_AARCH64_LD64_GOTOFF_LO15.
+
 2015-06-15  Alan Modra  <amodra@gmail.com>
 
        * cofflink.c (_bfd_coff_generic_relocate_section): Revert
index 09331bded3945763fb3df1414529d9d5954fad46..60b7a24e0c3e114258fc9cf744e5742165b19efb 100644 (file)
@@ -5737,6 +5737,10 @@ the GOT entry for this symbol.  Used in conjunction with
 BFD_RELOC_AARCH64_ADR_GOTPAGE.  Valid in ILP32 ABI only.  */
   BFD_RELOC_AARCH64_LD32_GOT_LO12_NC,
 
+/* Unsigned 15 bit byte offset for 64 bit load/store from the page of
+the GOT entry for this symbol. Valid in ILP64 ABI only.  */
+  BFD_RELOC_AARCH64_LD64_GOTOFF_LO15,
+
 /* Scaled 14 bit byte offset to the page base of the global offset table.  */
   BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14,
 
index 4065dfc7d1fcf49e810695356e90e78d4e097e33..1c55058240504d1349573ba9623d4c31bb42dffa 100644 (file)
@@ -848,6 +848,21 @@ static reloc_howto_type elfNN_aarch64_howto_table[] =
         0xffc,                 /* dst_mask */
         FALSE),                /* pcrel_offset */
 
+  /* LD64: GOT offset for the symbol.  */
+  HOWTO64 (AARCH64_R (LD64_GOTOFF_LO15),       /* type */
+        3,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        12,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_unsigned,    /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        AARCH64_R_STR (LD64_GOTOFF_LO15),      /* name */
+        FALSE,                 /* partial_inplace */
+        0x7ff8,                        /* src_mask */
+        0x7ff8,                        /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
   /* LD32: GOT offset to the page address of GOT table.
      (G(S) - PAGE (_GLOBAL_OFFSET_TABLE_)) & 0x5ffc.  */
   HOWTO32 (AARCH64_R (LD32_GOTPAGE_LO14),      /* type */
index b2a09791cc9ca6029d0bbacdaade2ac108637694..711f08f60b4b2ea90e4b686a6c55cd83bc1896d6 100644 (file)
@@ -2733,6 +2733,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_AARCH64_ADR_GOT_PAGE",
   "BFD_RELOC_AARCH64_LD64_GOT_LO12_NC",
   "BFD_RELOC_AARCH64_LD32_GOT_LO12_NC",
+  "BFD_RELOC_AARCH64_LD64_GOTOFF_LO15",
   "BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14",
   "BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15",
   "BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21",
index 7f2b31e35c59641fd97d316e4c2dc70b697ca838..d312e48bc13c544fe856fc4c740bfbb79d51c5ae 100644 (file)
@@ -6761,6 +6761,11 @@ ENUMDOC
   Unsigned 12 bit byte offset for 32 bit load/store from the page of
   the GOT entry for this symbol.  Used in conjunction with
   BFD_RELOC_AARCH64_ADR_GOTPAGE.  Valid in ILP32 ABI only.
+ENUM
+  BFD_RELOC_AARCH64_LD64_GOTOFF_LO15
+ENUMDOC
+  Unsigned 15 bit byte offset for 64 bit load/store from the page of
+  the GOT entry for this symbol. Valid in ILP64 ABI only.
 ENUM
   BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14
 ENUMDOC
index d81d8a154fbdc09ea61cbe8b139b09c9542bc7ca..c0be3f557d054abfaf557663cdc2f2396bfd6c7d 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-15  Renlin Li  <renlin.li@arm.com>
+
+       * config/tc-aarch64.c (reloc_table): New relocation modifier.
+       (md_apply_fix): Support BFD_RELOC_AARCH64_LD64_GOTOFF_LO15.
+       (aarch64_force_relocation): Ditto
+
 2015-06-13  Mark Wielaard  <mjw@redhat.com>
 
        * dwarf2dbg.c (out_header): Document EXPR->X_add_number value,
index e95d5f6fe2075e59c425179aeee11e0e13736831..7d4ec29e4f338c24c4a0b099ded0bd1292cdd53b 100644 (file)
@@ -2455,6 +2455,15 @@ static struct reloc_table_entry reloc_table[] = {
    BFD_RELOC_AARCH64_LD_GOT_LO12_NC,
    0},
 
+  /* 15 bit offset into the page containing GOT entry for that symbol.  */
+  {"gotoff_lo15", 0,
+   0,                          /* adr_type */
+   0,
+   0,
+   0,
+   BFD_RELOC_AARCH64_LD64_GOTOFF_LO15,
+   0},
+
   /* Get to the page containing GOT TLS entry for a symbol */
   {"tlsgd", 0,
    BFD_RELOC_AARCH64_TLSGD_ADR_PREL21, /* adr_type */
@@ -6788,6 +6797,7 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg)
     case BFD_RELOC_AARCH64_GOT_LD_PREL19:
     case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
     case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
+    case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
     case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
     case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
     case BFD_RELOC_AARCH64_LDST128_LO12:
@@ -6943,6 +6953,7 @@ aarch64_force_relocation (struct fix *fixp)
     case BFD_RELOC_AARCH64_GOT_LD_PREL19:
     case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
     case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
+    case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
     case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
     case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
     case BFD_RELOC_AARCH64_LDST128_LO12:
index 6d6a90c2ed358c73db06711c392605580059c315..8ab97c8015e871c66155b7263833d2aa0f8b451a 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-15  Renlin Li  <renlin.li@arm.com>
+
+       * gas/aarch64/reloc-insn.s: Update test
+       * gas/aarch64/reloc-insn.d: Update expected result.
+
 2015-06-13  Mark Wielaard  <mjw@redhat.com>
 
        * gas/aarch64/dwarf.d: New.
index 02c548a3d0a3c2b5a7d3ef9d59b1aeb31829b571..cee9ea56586dbd9c2968eef78529d3610906b27d 100644 (file)
@@ -37,12 +37,12 @@ Disassembly of section \.text:
   5c:  f2d75301        movk    x1, #0xba98, lsl #32
   60:  f2aeca81        movk    x1, #0x7654, lsl #16
   64:  f2864201        movk    x1, #0x3210
-  68:  58000980        ldr     x0, 198 <llit>
+  68:  580009a0        ldr     x0, 19c <llit>
   6c:  58000001        ldr     x1, 0 <func>
                        6c: R_AARCH64_LD_PREL_LO19      \.data\+0x8
   70:  58000002        ldr     x2, 0 <xdata>
                        70: R_AARCH64_LD_PREL_LO19      xdata\+0xc
-  74:  10000920        adr     x0, 198 <llit>
+  74:  10000940        adr     x0, 19c <llit>
   78:  10000001        adr     x1, 0 <func>
                        78: R_AARCH64_ADR_PREL_LO21     \.data\+0x8
   7c:  10000002        adr     x2, 0 <func>
@@ -54,7 +54,7 @@ Disassembly of section \.text:
   88:  10000005        adr     x5, 0 <xdata>
                        88: R_AARCH64_ADR_PREL_LO21     xdata\+0xff8
   8c:  90000000        adrp    x0, 0 <func>
-                       8c: R_AARCH64_ADR_PREL_PG_HI21  \.text\+0x198
+                       8c: R_AARCH64_ADR_PREL_PG_HI21  \.text\+0x19c
   90:  90000001        adrp    x1, 0 <func>
                        90: R_AARCH64_ADR_PREL_PG_HI21  \.data\+0x8
   94:  90000002        adrp    x2, 0 <func>
@@ -66,7 +66,7 @@ Disassembly of section \.text:
   a0:  90000005        adrp    x5, 0 <xdata>
                        a0: R_AARCH64_ADR_PREL_PG_HI21  xdata\+0xff8
   a4:  90000000        adrp    x0, 0 <func>
-                       a4: R_AARCH64_ADR_PREL_PG_HI21  \.text\+0x198
+                       a4: R_AARCH64_ADR_PREL_PG_HI21  \.text\+0x19c
   a8:  90000001        adrp    x1, 0 <func>
                        a8: R_AARCH64_ADR_PREL_PG_HI21  \.data\+0x8
   ac:  90000002        adrp    x2, 0 <func>
@@ -78,7 +78,7 @@ Disassembly of section \.text:
   b8:  90000005        adrp    x5, 0 <xdata>
                        b8: R_AARCH64_ADR_PREL_PG_HI21  xdata\+0xff8
   bc:  91000000        add     x0, x0, #0x0
-                       bc: R_AARCH64_ADD_ABS_LO12_NC   \.text\+0x198
+                       bc: R_AARCH64_ADD_ABS_LO12_NC   \.text\+0x19c
   c0:  91000021        add     x1, x1, #0x0
                        c0: R_AARCH64_ADD_ABS_LO12_NC   \.data\+0x8
   c4:  91000042        add     x2, x2, #0x0
@@ -91,7 +91,7 @@ Disassembly of section \.text:
                        d0: R_AARCH64_ADD_ABS_LO12_NC   xdata\+0xff8
   d4:  913ffcc6        add     x6, x6, #0xfff
   d8:  39400000        ldrb    w0, \[x0\]
-                       d8: R_AARCH64_LDST8_ABS_LO12_NC \.text\+0x198
+                       d8: R_AARCH64_LDST8_ABS_LO12_NC \.text\+0x19c
   dc:  39400021        ldrb    w1, \[x1\]
                        dc: R_AARCH64_LDST8_ABS_LO12_NC \.data\+0x8
   e0:  39400042        ldrb    w2, \[x2\]
@@ -103,22 +103,22 @@ Disassembly of section \.text:
   ec:  394000a5        ldrb    w5, \[x5\]
                        ec: R_AARCH64_LDST8_ABS_LO12_NC xdata\+0xff8
   f0:  397ffcc6        ldrb    w6, \[x6,#4095\]
-  f4:  36000540        tbz     w0, #0, 19c <lab>
+  f4:  36000560        tbz     w0, #0, 1a0 <lab>
   f8:  b6f80001        tbz     x1, #63, 0 <xlab>
                        f8: R_AARCH64_TSTBR14   xlab
-  fc:  37400502        tbnz    w2, #8, 19c <lab>
+  fc:  37400522        tbnz    w2, #8, 1a0 <lab>
  100:  b7780002        tbnz    x2, #47, 0 <xlab>
                        100: R_AARCH64_TSTBR14  xlab
- 104:  540004c0        b\.eq   19c <lab>
+ 104:  540004e0        b\.eq   1a0 <lab>
  108:  54000000        b\.eq   0 <xlab>
                        108: R_AARCH64_CONDBR19 xlab
- 10c:  b4000480        cbz     x0, 19c <lab>
+ 10c:  b40004a0        cbz     x0, 1a0 <lab>
  110:  b500001e        cbnz    x30, 0 <xlab>
                        110: R_AARCH64_CONDBR19 xlab
- 114:  14000022        b       19c <lab>
+ 114:  14000023        b       1a0 <lab>
  118:  14000000        b       0 <xlab>
                        118: R_AARCH64_JUMP26   xlab
- 11c:  94000020        bl      19c <lab>
+ 11c:  94000021        bl      1a0 <lab>
  120:  94000000        bl      0 <xlab>
                        120: R_AARCH64_CALL26   xlab
  124:  d2e24680        mov     x0, #0x1234000000000000         // #1311673391471656960
@@ -142,7 +142,7 @@ Disassembly of section \.text:
  16c:  f8500020        ldur    x0, \[x1,#-256\]
  170:  f97ffc20        ldr     x0, \[x1,#32760\]
  174:  79400000        ldrh    w0, \[x0\]
-                       174: R_AARCH64_LDST16_ABS_LO12_NC       \.text\+0x198
+                       174: R_AARCH64_LDST16_ABS_LO12_NC       \.text\+0x19c
  178:  b9400021        ldr     w1, \[x1\]
                        178: R_AARCH64_LDST32_ABS_LO12_NC       \.data\+0x8
  17c:  f9400042        ldr     x2, \[x2\]
@@ -157,6 +157,8 @@ Disassembly of section \.text:
  190:  d65f03c0        ret
  194:  f94001bc        ldr     x28, \[x13\]
                        194: R_AARCH64_LD64_GOTPAGE_LO15        \.data
+ 198:  f9400000        ldr     x0, \[x0\]
+                       198: R_AARCH64_LD64_GOTOFF_LO15 .data
 
-0000000000000198 <llit>:
- 198:  deadf00d        \.word  0xdeadf00d
+000000000000019c <llit>:
+ 19c:  deadf00d        \.word  0xdeadf00d
index 09c5db9910f651e3c0dcceed705b1c1319870df7..47c59d2aae1fa36a36e1944bd2f3cd498a0e6a30 100644 (file)
@@ -185,6 +185,8 @@ func:
        
        // BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15
        ldr     x28, [x13, #:gotpage_lo15:dummy]
+       // BFD_RELOC_AARCH64_LD64_GOTOFF_LO15
+       ldr     x0, [x0, #:gotoff_lo15:dummy]
 
 llit:  .word   0xdeadf00d