https://github.com/zhaoqi5 updated https://github.com/llvm/llvm-project/pull/123587
>From 8608d84983580afd13a791bece3ca7b05872b36b Mon Sep 17 00:00:00 2001 From: Qi Zhao <zhaoq...@loongson.cn> Date: Mon, 20 Jan 2025 19:09:22 +0800 Subject: [PATCH 1/2] [Clang][Driver] Pass -X and forward --no-relax to linker for LoongArch --- clang/lib/Driver/ToolChains/Gnu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index e5db1b2f1550b8..5557ca4bf4491f 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -422,7 +422,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, return; } - if (Triple.isRISCV()) { + if (Triple.isRISCV() || Triple.isLoongArch()) { CmdArgs.push_back("-X"); if (Args.hasArg(options::OPT_mno_relax)) CmdArgs.push_back("--no-relax"); >From 154904c053c0b7696a492d1832d340e9a980207c Mon Sep 17 00:00:00 2001 From: Qi Zhao <zhaoq...@loongson.cn> Date: Wed, 22 Jan 2025 11:24:33 +0800 Subject: [PATCH 2/2] support for relax option and error for -gsplit-dwarf -mrelax --- .../clang/Basic/DiagnosticDriverKinds.td | 3 ++ .../lib/Driver/ToolChains/Arch/LoongArch.cpp | 19 +++++++++++ clang/test/Driver/loongarch-relax-features.c | 33 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 clang/test/Driver/loongarch-relax-features.c diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 42c39ac6606c7f..612f7e330ba51e 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -808,6 +808,9 @@ def err_drv_loongarch_invalid_simd_option_combination : Error< def err_drv_loongarch_invalid_msimd_EQ : Error< "invalid argument '%0' to -msimd=; must be one of: none, lsx, lasx">; +def err_drv_loongarch_unsupported_with_linker_relaxation : Error< + "%0 is unsupported with LoongArch linker relaxation (-mrelax)">; + def err_drv_expand_response_file : Error< "failed to expand response file: %0">; diff --git a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp index bbd9397aa2378a..bafe241151763e 100644 --- a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp +++ b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "LoongArch.h" +#include "../Clang.h" #include "ToolChains/CommonArgs.h" #include "clang/Basic/DiagnosticDriver.h" #include "clang/Driver/Driver.h" @@ -134,6 +135,24 @@ void loongarch::getLoongArchTargetFeatures(const Driver &D, (!Args.hasArgNoClaim(clang::driver::options::OPT_march_EQ))) Features.push_back("+lsx"); + // FIXME: Now we must use -mrelax to enable relax, maybe -mrelax will be set + // as default in the future. + if (const Arg *A = + Args.getLastArg(options::OPT_mrelax, options::OPT_mno_relax)) { + if (A->getOption().matches(options::OPT_mrelax)) { + Features.push_back("+relax"); + // -gsplit-dwarf -mrelax requires DW_AT_high_pc/DW_AT_ranges/... indexing + // into .debug_addr, which is currently not implemented. + Arg *A; + if (getDebugFissionKind(D, Args, A) != DwarfFissionKind::None) + D.Diag( + clang::diag::err_drv_loongarch_unsupported_with_linker_relaxation) + << A->getAsString(Args); + } else { + Features.push_back("-relax"); + } + } + std::string ArchName; const Arg *MArch = Args.getLastArg(options::OPT_march_EQ); if (MArch) diff --git a/clang/test/Driver/loongarch-relax-features.c b/clang/test/Driver/loongarch-relax-features.c new file mode 100644 index 00000000000000..c6ef15a8fcff0e --- /dev/null +++ b/clang/test/Driver/loongarch-relax-features.c @@ -0,0 +1,33 @@ +/// Test -m[no-]relax options. + +// RUN: %clang --target=loongarch32 -S -emit-llvm %s -o - | FileCheck %s --check-prefix=LA32 +// RUN: %clang --target=loongarch64 -S -emit-llvm %s -o - | FileCheck %s --check-prefix=LA64 +// RUN: %clang --target=loongarch32 -mno-relax -S -emit-llvm %s -o - | FileCheck %s --check-prefix=LA32-NORELAX +// RUN: %clang --target=loongarch64 -mno-relax -S -emit-llvm %s -o - | FileCheck %s --check-prefix=LA64-NORELAX +// RUN: %clang --target=loongarch32 -mrelax -S -emit-llvm %s -o - | FileCheck %s --check-prefix=LA32-RELAX +// RUN: %clang --target=loongarch64 -mrelax -S -emit-llvm %s -o - | FileCheck %s --check-prefix=LA64-RELAX + +/// Error when using -gsplit-dwarf with linker relaxation (-mrelax). + +// RUN: %clang -### -c --target=loongarch32 -mno-relax -g -gsplit-dwarf %s 2>&1 | FileCheck %s --check-prefix=SPLIT-DWARF +// RUN: not %clang -c --target=loongarch32-linux-gnu -mrelax -gsplit-dwarf %s 2>&1 | FileCheck %s --check-prefix=ERR-SPLIT-DWARF +// RUN: not %clang -c --target=loongarch32 -mrelax -gsplit-dwarf=single %s 2>&1 | FileCheck %s --check-prefix=ERR-SPLIT-DWARF +// RUN: %clang -### -c --target=loongarch64 -mno-relax -g -gsplit-dwarf %s 2>&1 | FileCheck %s --check-prefix=SPLIT-DWARF +// RUN: not %clang -c --target=loongarch64-linux-gnu -mrelax -gsplit-dwarf %s 2>&1 | FileCheck %s --check-prefix=ERR-SPLIT-DWARF +// RUN: not %clang -c --target=loongarch64 -mrelax -gsplit-dwarf=single %s 2>&1 | FileCheck %s --check-prefix=ERR-SPLIT-DWARF + +// LA32: "target-features"="+32bit" +// LA64: "target-features"="+64bit,+d,+f,+lsx,+ual" + +// LA32-NORELAX: "target-features"="+32bit,-relax" +// LA64-NORELAX: "target-features"="+64bit,+d,+f,+lsx,+ual,-relax" + +// LA32-RELAX: "target-features"="+32bit,+relax" +// LA64-RELAX: "target-features"="+64bit,+d,+f,+lsx,+relax,+ual" + +// SPLIT-DWARF: "-split-dwarf-file" +// ERR-SPLIT-DWARF: error: -gsplit-dwarf{{.*}} is unsupported with LoongArch linker relaxation (-mrelax) + +int foo(void) { + return 3; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits