llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: hitmoon <details> <summary>Changes</summary> 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 --- Full diff: https://github.com/llvm/llvm-project/pull/228689.diff 2 Files Affected: - (modified) clang/lib/Driver/ToolChains/FreeBSD.cpp (+5-2) - (modified) clang/test/Driver/freebsd.c (+21) ``````````diff diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index cd4b11af9464f..7a8d53c547b00 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 19b8b7c1cbdf7..08498d98e61de 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 \ `````````` </details> https://github.com/llvm/llvm-project/pull/228689 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
