[llvm] 90bc5b1 - [gold] Switch section-ordering-file tests to use ld.bfd (#219150)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 7 00:54:45 PDT 2026
Author: Nikita Popov
Date: 2026-09-07T09:54:40+02:00
New Revision: 90bc5b106b5f36fd6c6fffd7eb914946ce75b4a3
URL: https://github.com/llvm/llvm-project/commit/90bc5b106b5f36fd6c6fffd7eb914946ce75b4a3
DIFF: https://github.com/llvm/llvm-project/commit/90bc5b106b5f36fd6c6fffd7eb914946ce75b4a3.diff
LOG: [gold] Switch section-ordering-file tests to use ld.bfd (#219150)
ld.bfd supports `--section-ordering-file` since 2.43. Use it if the
binutils version is sufficiently recent.
The implementation in ld.bfd is significantly different, with the
section ordering file looking more like an incomplete linker script,
rather than a plain section listing.
The addresses of the sections are also slightly different than with
ld.gold. Use hex matches + arithmetic to just check the correct
order/offsets instead of hardcoding the exact choice of address.
ld.bfd also supports --start-lib/--end-lib since 2.47, but it seems like
those don't actually work with linker plugins, so I'm not migrating them
(https://sourceware.org/bugzilla/show_bug.cgi?id=34572).
Followup to https://github.com/llvm/llvm-project/pull/130981.
Added:
llvm/test/tools/gold/X86/Inputs/multiple-data-section-ordering.txt
Modified:
llvm/test/tools/gold/X86/multiple-data.s
llvm/test/tools/gold/X86/multiple-sections.ll
llvm/test/tools/gold/lit.local.cfg
Removed:
################################################################################
diff --git a/llvm/test/tools/gold/X86/Inputs/multiple-data-section-ordering.txt b/llvm/test/tools/gold/X86/Inputs/multiple-data-section-ordering.txt
new file mode 100644
index 0000000000000..beedeb7f9718b
--- /dev/null
+++ b/llvm/test/tools/gold/X86/Inputs/multiple-data-section-ordering.txt
@@ -0,0 +1,5 @@
+.data : {
+ *(.data.tin)
+ *(.data.dipsy)
+ *(.data.pat)
+}
diff --git a/llvm/test/tools/gold/X86/multiple-data.s b/llvm/test/tools/gold/X86/multiple-data.s
index a6dfb44599651..75cb36fc220b6 100644
--- a/llvm/test/tools/gold/X86/multiple-data.s
+++ b/llvm/test/tools/gold/X86/multiple-data.s
@@ -1,20 +1,15 @@
-# RUN: echo ".data.tin" > %t_order_lto.txt
-# RUN: echo ".data.dipsy" >> %t_order_lto.txt
-# RUN: echo ".data.pat" >> %t_order_lto.txt
-
# RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-unknown-linux-gnu
# RUN: llvm-as %p/Inputs/multiple-data.ll -o %t2.o
-# RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
+# RUN: %ld_bfd -plugin %llvmshlibdir/LLVMgold%shlibext \
# RUN: -m elf_x86_64 -o %t.exe %t2.o %t.o \
-# RUN: --section-ordering-file=%t_order_lto.txt
+# RUN: --section-ordering-file=%S/Inputs/multiple-data-section-ordering.txt
# RUN: llvm-readelf -s %t.exe | FileCheck %s
-# --section-ordering-file is not supported by ld.bfd, use gold instead.
-# REQUIRES: gold_linker
+# REQUIRES: ld-bfd-supports-section-ordering-file
-# CHECK-DAG: 00000000004010fc 4 OBJECT GLOBAL DEFAULT 2 dipsy
-# CHECK-DAG: 00000000004010f8 4 OBJECT GLOBAL DEFAULT 2 tin
-# CHECK-DAG: 0000000000401100 4 OBJECT GLOBAL DEFAULT 2 pat
+# CHECK-DAG: [[#%x, ADDR:]] 4 OBJECT GLOBAL DEFAULT 2 tin
+# CHECK-DAG: [[#%x, ADDR + 4]] 4 OBJECT GLOBAL DEFAULT 2 dipsy
+# CHECK-DAG: [[#%x, ADDR + 8]] 4 OBJECT GLOBAL DEFAULT 2 pat
.globl _start
_start:
diff --git a/llvm/test/tools/gold/X86/multiple-sections.ll b/llvm/test/tools/gold/X86/multiple-sections.ll
index 9d5c444033640..7693f825da683 100644
--- a/llvm/test/tools/gold/X86/multiple-sections.ll
+++ b/llvm/test/tools/gold/X86/multiple-sections.ll
@@ -1,23 +1,24 @@
; RUN: split-file %s %t
; RUN: llvm-as %t/a.ll -o %t.o
-; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
+; RUN: %ld_bfd -plugin %llvmshlibdir/LLVMgold%shlibext \
; RUN: -m elf_x86_64 -o %t.exe %t.o \
; RUN: --section-ordering-file=%t/order
; RUN: llvm-readelf -s %t.exe | FileCheck %s
-; --section-ordering-file is not supported by ld.bfd, use gold instead.
-; REQUIRES: gold_linker
+# REQUIRES: ld-bfd-supports-section-ordering-file
; Check that the order of the sections is tin -> _start -> pat.
-; CHECK: 00000000004000cf 1 FUNC LOCAL DEFAULT 1 pat
-; CHECK: 00000000004000b0 1 FUNC LOCAL DEFAULT 1 tin
-; CHECK: 00000000004000c0 15 FUNC GLOBAL DEFAULT 1 _start
+; CHECK: [[#%x, ADDR:]] 1 FUNC LOCAL DEFAULT 1 pat
+; CHECK: [[#%x, ADDR - 31]] 1 FUNC LOCAL DEFAULT 1 tin
+; CHECK: [[#%x, ADDR - 15]] 15 FUNC GLOBAL DEFAULT 1 _start
;--- order
-.text.tin
-.text._start
-.text.pat
+.text : {
+ *(.text.tin)
+ *(.text._start)
+ *(.text.pat)
+}
;--- a.ll
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
diff --git a/llvm/test/tools/gold/lit.local.cfg b/llvm/test/tools/gold/lit.local.cfg
index aa07261d10d3e..622a0ed2dc300 100644
--- a/llvm/test/tools/gold/lit.local.cfg
+++ b/llvm/test/tools/gold/lit.local.cfg
@@ -1,3 +1,6 @@
+import re
+import subprocess
+
if not "ld_plugin" in config.available_features:
config.unsupported = True
@@ -5,3 +8,27 @@ if not "ld_plugin" in config.available_features:
for san in ["asan", "msan", "ubsan"]:
if san in config.available_features:
config.unsupported = True
+
+def get_ld_bfd_version():
+ try:
+ ld_cmd = subprocess.Popen(
+ [config.ld_bfd_executable, "-v"],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+ ld_out, _ = ld_cmd.communicate()
+ ld_out = ld_out.decode()
+ except:
+ return (0, 0)
+
+ match = re.search(r"GNU ld .* (\d+)\.(\d+)", ld_out)
+ if not match:
+ return (0, 0)
+ major = int(match.group(1))
+ minor = int(match.group(2))
+ return (major, minor)
+
+if not config.unsupported:
+ version = get_ld_bfd_version()
+ if version >= (2, 43):
+ config.available_features.add("ld-bfd-supports-section-ordering-file")
More information about the llvm-commits
mailing list