[lld] [lld][AArch64] Fix handling of SHT_REL relocation addends. (PR #98291)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 15 10:50:33 PDT 2024


================
@@ -1,97 +1,318 @@
-## Test certain REL relocation types generated by legacy armasm.
-# RUN: yaml2obj %s -o %t.o
-# RUN: ld.lld %t.o -o %t
-# RUN: llvm-objdump -s %t | FileCheck %s
-
-# CHECK:      Contents of section .abs:
-# CHECK-NEXT:  [[#%x,]] 29002800 00002700 00000000 0000fcff  ).(...'.........
-# CHECK-NEXT:  [[#%x,]] ffffffff ffff                        ......
-# CHECK-NEXT: Contents of section .uabs:
-# CHECK-NEXT:  [[#%x,]] 40ffffff 40ffffff 20ffffff 20ffffff  @... at ... ... ...
-# CHECK-NEXT:  [[#%x,]] 00ffffff 00ffffff                    ........
-# CHECK-NEXT: Contents of section .prel:
-# CHECK-NEXT:  [[#%x,]] 00ffffff fcfeffff f8feffff a0ffffff  ................
-# CHECK-NEXT:  [[#%x,]] 0010009f 0010009f                    ........
-# CHECK-NEXT: Contents of section .branch:
-# CHECK-NEXT:  [[#%x,]] f0ffffff f0ffffff fdffffff fcffff14  ................
-
----
-!ELF
-FileHeader:
-  Class: ELFCLASS64
-  Data: ELFDATA2LSB
-  Type: ET_REL
-  Machine: EM_AARCH64
-Sections:
-  - Name:    .abs
-    Type:    SHT_PROGBITS
-    Flags:   [ SHF_ALLOC ]
-    Content: fffffefffffffdfffffffffffffffcffffffffffffff
-  - Name:    .rel.abs
-    Type:    SHT_REL
-    Link:    .symtab
-    Info:    .abs
-    Relocations:
-      - {Offset: 0, Symbol: abs, Type: R_AARCH64_ABS16}
-      - {Offset: 2, Symbol: abs, Type: R_AARCH64_ABS32}
-      - {Offset: 6, Symbol: abs, Type: R_AARCH64_ABS64}
-      - {Offset: 14, Symbol: abs, Type: R_AARCH64_ADD_ABS_LO12_NC}
-
-  - Name:    .uabs
-    Type:    SHT_PROGBITS
-    Flags:   [ SHF_ALLOC ]
-    AddressAlign: 4
-    Content: 00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff
-  - Name:    .rel.uabs
-    Type:    SHT_REL
-    Link:    .symtab
-    Info:    .uabs
-    Relocations:
-      - {Offset:  0, Symbol: abs, Type: R_AARCH64_MOVW_UABS_G0}
-      - {Offset:  4, Symbol: abs, Type: R_AARCH64_MOVW_UABS_G0_NC}
-      - {Offset:  8, Symbol: abs, Type: R_AARCH64_MOVW_UABS_G1}
-      - {Offset: 12, Symbol: abs, Type: R_AARCH64_MOVW_UABS_G1_NC}
-      - {Offset: 16, Symbol: abs, Type: R_AARCH64_MOVW_UABS_G2}
-      - {Offset: 20, Symbol: abs, Type: R_AARCH64_MOVW_UABS_G2_NC}
-
-  - Name:    .prel
-    Type:    SHT_PROGBITS
-    Flags:   [ SHF_ALLOC ]
-    AddressAlign: 4
-    Content: 00ffffff00ffffff00ffffff00ffffff00ffffff00ffffff
-  - Name:    .rel.prel
-    Type:    SHT_REL
-    Link:    .symtab
-    Info:    .prel
-    Relocations:
-      - {Offset:  0, Symbol: .prel, Type: R_AARCH64_PREL64}
-      - {Offset:  4, Symbol: .prel, Type: R_AARCH64_PREL32}
-      - {Offset:  8, Symbol: .prel, Type: R_AARCH64_PREL16}
-      - {Offset: 12, Symbol: .prel, Type: R_AARCH64_LD_PREL_LO19}
-      - {Offset: 16, Symbol: .prel, Type: R_AARCH64_ADR_PREL_PG_HI21}
-      - {Offset: 20, Symbol: .prel, Type: R_AARCH64_ADR_PREL_PG_HI21_NC}
-
-  - Name:    .branch
-    Type:    SHT_PROGBITS
-    Flags:   [ SHF_ALLOC ]
-    AddressAlign: 4
-    Content: f0fffffff0fffffff0fffffff0ffffff
-  - Name:    .rel.branch
-    Type:    SHT_REL
-    Link:    .symtab
-    Info:    .branch
-    Relocations:
-      - {Offset:  0, Symbol: .branch, Type: R_AARCH64_TSTBR14}
-      - {Offset:  4, Symbol: .branch, Type: R_AARCH64_CONDBR19}
-      - {Offset:  8, Symbol: .branch, Type: R_AARCH64_CALL26}
-      - {Offset: 12, Symbol: .branch, Type: R_AARCH64_JUMP26}
-
-Symbols:
-  - Name:    .branch
-    Section: .branch
-  - Name:    .prel
-    Section: .prel
-  - Name:    abs
-    Index:   SHN_ABS
-    Value:   42
-    Binding: STB_GLOBAL
+REQUIRES: aarch64
+
+## Test handling of addends taken from the relocated word or instruction
+## in AArch64 relocation sections of type SHT_REL. These can be generated
+## by assemblers other than LLVM, in particular the legacy 'armasm'.
+##
+## llvm-mc will only generate SHT_RELA when targeting AArch64. So to make
+## an input file with SHT_REL, we assemble our test source file, then
+## round-trip via YAML and do some seddery to change the type of the
+## relocation section. Since all the relocations were made manually with
+## .reloc directives containing no addend, this succeeds.
+
+# RUN: rm -rf %t
----------------
MaskRay wrote:

Many newer tests use `rm -rf %t && split-file %s %t && cd %t` so that you can eliminate `%t/` (sometimes error-prone) below.

https://github.com/llvm/llvm-project/pull/98291


More information about the llvm-commits mailing list