[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