https://github.com/mintsuki updated 
https://github.com/llvm/llvm-project/pull/149681

>From 491a834787083c74c3584839dc036cc1f54519c1 Mon Sep 17 00:00:00 2001
From: Mintsuki <mints...@protonmail.com>
Date: Sun, 20 Jul 2025 00:21:08 +0200
Subject: [PATCH] [Clang][Driver] Override Generic_ELF::buildLinker() to avoid
 calling gcc to link

This change primarily makes it so that when targeting freestanding/unknown
OSes, the driver will not use `gcc` to link, but rather will link using
the chosen linker (`-fuse-ld=...`) directly.

If Clang is to be a cross compiler, there is no reason to assume that the
host's gcc is in any way capable of handling the linkage of programs for
targets that do not match the host's triple, especially for freestanding
targets.
---
 clang/lib/Driver/ToolChains/Gnu.cpp |  2 ++
 clang/lib/Driver/ToolChains/Gnu.h   |  3 +++
 clang/test/Driver/baremetal-ld.c    | 13 +++++++++++++
 clang/test/Driver/bindings.c        |  2 +-
 4 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp 
b/clang/lib/Driver/ToolChains/Gnu.cpp
index f5e2655857432..4beb67f888a7c 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -3375,3 +3375,5 @@ void Generic_ELF::addClangTargetOptions(const ArgList 
&DriverArgs,
                           options::OPT_fno_use_init_array, true))
     CC1Args.push_back("-fno-use-init-array");
 }
+
+Tool *Generic_ELF::buildLinker() const { return new 
tools::gnutools::Linker(*this); }
diff --git a/clang/lib/Driver/ToolChains/Gnu.h 
b/clang/lib/Driver/ToolChains/Gnu.h
index 3b8df71bbf9d3..152a7ab8d5289 100644
--- a/clang/lib/Driver/ToolChains/Gnu.h
+++ b/clang/lib/Driver/ToolChains/Gnu.h
@@ -382,6 +382,9 @@ class LLVM_LIBRARY_VISIBILITY Generic_ELF : public 
Generic_GCC {
   }
 
   virtual void addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const {}
+
+protected:
+  Tool *buildLinker() const override;
 };
 
 } // end namespace toolchains
diff --git a/clang/test/Driver/baremetal-ld.c b/clang/test/Driver/baremetal-ld.c
index ec61b42b6f487..a51a8c6fd623e 100644
--- a/clang/test/Driver/baremetal-ld.c
+++ b/clang/test/Driver/baremetal-ld.c
@@ -4,3 +4,16 @@
 
 // RUN: %clang -### --target=armv7-unknown-none-eabi -mcpu=cortex-m4 
--sysroot= -fuse-ld=ld -flto -O3 %s 2>&1 | FileCheck --check-prefix=LTO %s
 // LTO: {{".*ld.*"}} {{.*}} "-plugin-opt=mcpu=cortex-m4" "-plugin-opt=O3"
+
+// Ensure that, for freestanding -none targets, the linker does not call into 
gcc.
+// We do this by checking if clang is trying to pass "-fuse-ld=bfd" to the 
linker command.
+// RUN: %clang --target=aarch64-unknown-none-elf -ccc-print-bindings %s 2>&1 | 
FileCheck --check-prefix=LDAARCH64 %s
+// LDAARCH64: "baremetal::Linker"
+// RUN: %clang --target=loongarch64-unknown-none-elf -ccc-print-bindings %s 
2>&1 | FileCheck --check-prefix=LDLOONGARCH64 %s
+// LDLOONGARCH64: "GNU::Linker"
+// RUN: %clang --target=riscv64-unknown-none-elf -ccc-print-bindings %s 2>&1 | 
FileCheck --check-prefix=LDRISCV64 %s
+// LDRISCV64: "baremetal::Linker"
+// RUN: %clang --target=x86_64-unknown-none-elf -ccc-print-bindings %s 2>&1 | 
FileCheck --check-prefix=LDX8664 %s
+// LDX8664: "GNU::Linker"
+// RUN: %clang --target=i386-unknown-none-elf -ccc-print-bindings %s 2>&1 | 
FileCheck --check-prefix=LDI386 %s
+// LDI386: "GNU::Linker"
diff --git a/clang/test/Driver/bindings.c b/clang/test/Driver/bindings.c
index 77afa8a115e20..35f4039c90a90 100644
--- a/clang/test/Driver/bindings.c
+++ b/clang/test/Driver/bindings.c
@@ -2,7 +2,7 @@
 // RUN: %clang -target i386-unknown-unknown -ccc-print-bindings 
-no-integrated-as %s 2>&1 | FileCheck %s --check-prefix=CHECK01
 // CHECK01: "clang", inputs: ["{{.*}}bindings.c"], output: "{{.*}}.s"
 // CHECK01: "GNU::Assembler", inputs: ["{{.*}}.s"], output: "{{.*}}.o"
-// CHECK01: "gcc::Linker", inputs: ["{{.*}}.o"], output: "a.out"
+// CHECK01: "GNU::Linker", inputs: ["{{.*}}.o"], output: "a.out"
 
 // Clang control options
 

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to