[clang] [clang][Driver]: Skip crti.o/crtn.o on LoongArch FreeBSD (PR #228689)

via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 3 03:31:32 PDT 2026


https://github.com/hitmoon created https://github.com/llvm/llvm-project/pull/228689

FreeBSD will not provides crti.o and crtn.o for LoongArch: the _init/_fini interface they assemble is obsolete, and constructors and destructors run exclusively through .init_array/.fini_array.

Skip both objects when the target is loongarch FreeBSD. Other FreeBSD architectures are unchanged, and LoongArch on other operating systems is not affected.

FreeBSD reference: https://reviews.freebsd.org/D59892

>From aca0b9c656731e0dbd13266acbc333ccf4ac3daf Mon Sep 17 00:00:00 2001
From: xiaoqiang zhao <zxq_yx_007 at 163.com>
Date: Sat, 3 Oct 2026 17:04:39 +0800
Subject: [PATCH] [clang][Driver]: Skip crti.o/crtn.o on LoongArch FreeBSD

FreeBSD will not provides crti.o and crtn.o for LoongArch: the
_init/_fini interface they assemble is obsolete, and constructors
and destructors run exclusively through .init_array/.fini_array.

Skip both objects when the target is loongarch FreeBSD.
Other FreeBSD architectures are unchanged, and LoongArch on
other operating systems is not affected.

FreeBSD reference: https://reviews.freebsd.org/D59892

Signed-off-by: xiaoqiang zhao <zxq_yx_007 at 163.com>
---
 clang/lib/Driver/ToolChains/FreeBSD.cpp |  7 +++++--
 clang/test/Driver/freebsd.c             | 21 +++++++++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index cd4b11af9464f7..7a8d53c547b007 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -254,7 +254,9 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     if (crt1)
       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
 
-    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
+    // LoongArch does not provide the obsolete _init/_fini interface.
+    if (ToolChain.getArch() != llvm::Triple::loongarch64)
+      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
 
     const char *crtbegin = nullptr;
     if (Args.hasArg(options::OPT_static))
@@ -372,7 +374,8 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
     else
       crtend = "crtend.o";
     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
-    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
+    if (ToolChain.getArch() != llvm::Triple::loongarch64)
+      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
   }
 
   ToolChain.addProfileRTLibs(Args, CmdArgs);
diff --git a/clang/test/Driver/freebsd.c b/clang/test/Driver/freebsd.c
index 19b8b7c1cbdf79..08498d98e61dec 100644
--- a/clang/test/Driver/freebsd.c
+++ b/clang/test/Driver/freebsd.c
@@ -101,6 +101,27 @@
 // RUN:   | FileCheck --check-prefix=CHECK-LA64-LD-OPTS %s
 // CHECK-LA64-LD-OPTS: ld{{.*}}" {{.*}} "-X" "--no-relax"
 //
+// Check that LoongArch does not pass crti.o/crtn.o to the linker:
+// the obsolete _init/_fini interface is not provided.
+//
+// RUN: %clang --target=loongarch64-freebsd -### %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA64-NOCRTI %s
+// CHECK-LA64-NOCRTI: crt1.o
+// CHECK-LA64-NOCRTI-NOT: crti.o
+// CHECK-LA64-NOCRTI: crtbegin{{S?}}.o
+// CHECK-LA64-NOCRTI: crtend{{S?}}.o
+// CHECK-LA64-NOCRTI-NOT: crtn.o
+//
+// Check the same for shared libraries.
+//
+// RUN: %clang --target=loongarch64-freebsd -shared -### %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA64-SHARED-NOCRTI %s
+// CHECK-LA64-SHARED-NOCRTI: --eh-frame-hdr
+// CHECK-LA64-SHARED-NOCRTI-NOT: crti.o
+// CHECK-LA64-SHARED-NOCRTI: crtbeginS.o
+// CHECK-LA64-SHARED-NOCRTI: crtendS.o
+// CHECK-LA64-SHARED-NOCRTI-NOT: crtn.o
+//
 // Check that the new linker flags are passed to FreeBSD
 // RUN: %clang --target=x86_64-pc-freebsd10.0 -m32 %s \
 // RUN:   --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \



More information about the cfe-commits mailing list