[lld] [LLD][ELF]Skip non-inputsections to avoid invalid cast in Arm BE8 handling. (PR #188154)

Simi Pallipurath via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 1 08:13:23 PDT 2026


https://github.com/simpal01 updated https://github.com/llvm/llvm-project/pull/188154

>From 10192c549b6da6c54383bc52671357b9ff34e231 Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Mon, 23 Mar 2026 23:57:15 +0000
Subject: [PATCH 1/3] [LLD][ELF]Skip non-inputsections to avoid invalid cast in
 BE8 handling.

In BE8 mode, instruction bytes are reversed for sections containing code.
This logic currently assumes that arm mapping symbols (e.g. $a, $t, $d) are
always associated with InputSections.

However, mapping symbols can also be defined in other section types such as
mergeable sections (SHF_MERGE). These are not represented as InputSection,
and attempting to cast them using cast_if_present<InputSection> results in
an assertion failure.
---
 lld/ELF/Arch/ARM.cpp         |  2 +-
 lld/test/ELF/merge-arm-be8.s | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)
 create mode 100644 lld/test/ELF/merge-arm-be8.s

diff --git a/lld/ELF/Arch/ARM.cpp b/lld/ELF/Arch/ARM.cpp
index f55da7afb891e..e0b2f321264b5 100644
--- a/lld/ELF/Arch/ARM.cpp
+++ b/lld/ELF/Arch/ARM.cpp
@@ -1183,7 +1183,7 @@ void elf::addArmInputSectionMappingSymbols(Ctx &ctx) {
       if (!isArmMapSymbol(def) && !isDataMapSymbol(def) &&
           !isThumbMapSymbol(def))
         continue;
-      if (auto *sec = cast_if_present<InputSection>(def->section))
+      if (auto *sec = dyn_cast_if_present<InputSection>(def->section))
         if (sec->flags & SHF_EXECINSTR)
           sectionMap[sec].push_back(def);
     }
diff --git a/lld/test/ELF/merge-arm-be8.s b/lld/test/ELF/merge-arm-be8.s
new file mode 100644
index 0000000000000..d9866e1404f15
--- /dev/null
+++ b/lld/test/ELF/merge-arm-be8.s
@@ -0,0 +1,10 @@
+// REQUIRES: arm
+// Ensure that ARM big-endian(BE8) can link SHF_MERGE sections with mapping symbols correctly.
+
+// RUN: llvm-mc -filetype=obj -triple=armv7aeb-none-linux-gnueabi  %s -o %t.o
+// RUN: ld.lld --be8 %t.o -o /dev/null
+
+.section .merge, "aM", %progbits, 4
+.local $d.1
+$d.1:
+        .word 4

>From 1bd5dda8e91aa583150273580b51d5fb78472a4a Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Fri, 27 Mar 2026 15:46:15 +0000
Subject: [PATCH 2/3] fixup! [LLD][ELF]Skip non-inputsections to avoid invalid
 cast in BE8 handling.

1. Renaming the test file.
2. Non filecheck comments should start with ///.
3. Adding some more comments in the test explaining it.
4. Additionally test some properties of the produced object file.
---
 lld/test/ELF/arm-be8-data-mapsym.s | 34 ++++++++++++++++++++++++++++++
 lld/test/ELF/merge-arm-be8.s       | 10 ---------
 2 files changed, 34 insertions(+), 10 deletions(-)
 create mode 100644 lld/test/ELF/arm-be8-data-mapsym.s
 delete mode 100644 lld/test/ELF/merge-arm-be8.s

diff --git a/lld/test/ELF/arm-be8-data-mapsym.s b/lld/test/ELF/arm-be8-data-mapsym.s
new file mode 100644
index 0000000000000..ec4f3fc120454
--- /dev/null
+++ b/lld/test/ELF/arm-be8-data-mapsym.s
@@ -0,0 +1,34 @@
+/// REQUIRES: arm
+/// ARM big-endian(BE-8) reversal needs to account for explicit mapping
+/// symbols in data sections not represented as an InputSection. SHF_MERGE sections
+/// are an example of such a section.
+
+// RUN: llvm-mc -filetype=obj -triple=armv7aeb-none-linux-gnueabi %s -o %t.o
+// RUN: ld.lld --be8 %t.o -shared -o %t
+// RUN: llvm-readobj --file-headers --sections --section-data %t | FileCheck %s
+
+// CHECK:      DataEncoding: BigEndian (0x2)
+// CHECK:      Name: .merge
+// CHECK-NEXT: Type: SHT_PROGBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT:   SHF_ALLOC
+// CHECK-NEXT:   SHF_MERGE
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address:
+// CHECK-NEXT: Offset:
+// CHECK-NEXT: Size: 4
+// CHECK-NEXT: Link: 0
+// CHECK-NEXT: Info: 0
+// CHECK-NEXT: AddressAlignment:
+// CHECK-NEXT: EntrySize: 4
+// CHECK-NEXT: SectionData (
+// CHECK-NEXT:   0000: 11223344 |
+// CHECK-NEXT: )
+
+.section .merge, "aM", %progbits, 4
+/// GNU assembler adds a mapping symbol for this SHF_MERGE data section.
+/// Clang integrated assembler uses the implicit $d from the section type,
+/// so add one manually to match GNU assembler output.
+.local $d.1
+$d.1:
+        .word 0x11223344
diff --git a/lld/test/ELF/merge-arm-be8.s b/lld/test/ELF/merge-arm-be8.s
deleted file mode 100644
index d9866e1404f15..0000000000000
--- a/lld/test/ELF/merge-arm-be8.s
+++ /dev/null
@@ -1,10 +0,0 @@
-// REQUIRES: arm
-// Ensure that ARM big-endian(BE8) can link SHF_MERGE sections with mapping symbols correctly.
-
-// RUN: llvm-mc -filetype=obj -triple=armv7aeb-none-linux-gnueabi  %s -o %t.o
-// RUN: ld.lld --be8 %t.o -o /dev/null
-
-.section .merge, "aM", %progbits, 4
-.local $d.1
-$d.1:
-        .word 4

>From 7ac412ad42816b7928882a65da225c07b3bca7f6 Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Wed, 1 Apr 2026 16:12:21 +0100
Subject: [PATCH 3/3] fixup! [LLD][ELF]Skip non-inputsections to avoid invalid
 cast in BE8 handling.

---
 lld/test/ELF/arm-be8-data-mapsym.s | 21 +++------------------
 1 file changed, 3 insertions(+), 18 deletions(-)

diff --git a/lld/test/ELF/arm-be8-data-mapsym.s b/lld/test/ELF/arm-be8-data-mapsym.s
index ec4f3fc120454..e48ad6ec53203 100644
--- a/lld/test/ELF/arm-be8-data-mapsym.s
+++ b/lld/test/ELF/arm-be8-data-mapsym.s
@@ -5,25 +5,10 @@
 
 // RUN: llvm-mc -filetype=obj -triple=armv7aeb-none-linux-gnueabi %s -o %t.o
 // RUN: ld.lld --be8 %t.o -shared -o %t
-// RUN: llvm-readobj --file-headers --sections --section-data %t | FileCheck %s
+// RUN: llvm-readelf -S -x .merge %t | FileCheck %s
 
-// CHECK:      DataEncoding: BigEndian (0x2)
-// CHECK:      Name: .merge
-// CHECK-NEXT: Type: SHT_PROGBITS
-// CHECK-NEXT: Flags [
-// CHECK-NEXT:   SHF_ALLOC
-// CHECK-NEXT:   SHF_MERGE
-// CHECK-NEXT: ]
-// CHECK-NEXT: Address:
-// CHECK-NEXT: Offset:
-// CHECK-NEXT: Size: 4
-// CHECK-NEXT: Link: 0
-// CHECK-NEXT: Info: 0
-// CHECK-NEXT: AddressAlignment:
-// CHECK-NEXT: EntrySize: 4
-// CHECK-NEXT: SectionData (
-// CHECK-NEXT:   0000: 11223344 |
-// CHECK-NEXT: )
+// CHECK: Hex dump of section '.merge':
+// CHECK-NEXT: 0x0000014d 11223344
 
 .section .merge, "aM", %progbits, 4
 /// GNU assembler adds a mapping symbol for this SHF_MERGE data section.



More information about the llvm-commits mailing list