Author: Fangrui Song Date: 2021-05-11T11:38:32-07:00 New Revision: 2075f2b296b0fa90cb7597f0f318232940d29e95
URL: https://github.com/llvm/llvm-project/commit/2075f2b296b0fa90cb7597f0f318232940d29e95 DIFF: https://github.com/llvm/llvm-project/commit/2075f2b296b0fa90cb7597f0f318232940d29e95.diff LOG: [clang] Support -fpic -fno-semantic-interposition for RISCV -fno-semantic-interposition (only effective with -fpic) can optimize default visibility external linkage (non-ifunc-non-COMDAT) variable access and function calls to avoid GOT/PLT, by using local aliases, e.g. ``` int var; __attribute__((optnone)) int fun(int x) { return x * x; } int test() { return fun(var); } ``` -fpic (var and fun are dso_preemptable) ``` test: .LBB1_1: auipc a0, %got_pcrel_hi(var) ld a0, %pcrel_lo(.LBB1_1)(a0) lw a0, 0(a0) // fun is preemptible by default in ld -shared mode. ld will create a PLT. tail fun@plt ``` vs -fpic -fno-semantic-interposition (var and fun are dso_local) ``` test: .Ltest$local: .LBB1_1: auipc a0, %pcrel_hi(.Lvar$local) addi a0, a0, %pcrel_lo(.LBB1_1) lw a0, 0(a0) // The assembler either resolves .Lfun$local at assembly time (-mno-relax // -fno-function-sections), or produces a relocation referencing a non-preemptible // local symbol (which can avoid PLT). tail .Lfun$local ``` Note: Clang's default -fpic is more aggressive than GCC -fpic: interprocedural optimizations (including inlining) are available but local aliases are not used. -fpic -fsemantic-interposition can disable interprocedural optimizations. Depends on D101875 Reviewed By: luismarques Differential Revision: https://reviews.llvm.org/D101876 Added: Modified: clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/fsemantic-interposition.c Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 0cad688873b7..1b2c5b0de73d 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4716,7 +4716,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, options::OPT_fno_semantic_interposition); if (RelocationModel != llvm::Reloc::Static && !IsPIE) { // The supported targets need to call AsmPrinter::getSymbolPreferLocal. - bool SupportsLocalAlias = Triple.isAArch64() || Triple.isX86(); + bool SupportsLocalAlias = + Triple.isAArch64() || Triple.isRISCV() || Triple.isX86(); if (!A) CmdArgs.push_back("-fhalf-no-semantic-interposition"); else if (A->getOption().matches(options::OPT_fsemantic_interposition)) diff --git a/clang/test/Driver/fsemantic-interposition.c b/clang/test/Driver/fsemantic-interposition.c index 3060e8a49b20..e2713de80f69 100644 --- a/clang/test/Driver/fsemantic-interposition.c +++ b/clang/test/Driver/fsemantic-interposition.c @@ -11,6 +11,8 @@ /// If -fno-semantic-interposition is specified and the target supports local /// aliases, neither CC1 option is set. // RUN: %clang -target aarch64 %s -Werror -fPIC -fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s +// RUN: %clang -target riscv32 %s -Werror -fPIC -fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s +// RUN: %clang -target riscv64 %s -Werror -fPIC -fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s // RUN: %clang -target i386 %s -Werror -fPIC -fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s // RUN: %clang -target x86_64 %s -Werror -fPIC -fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s // NO-NOT: "-fsemantic-interposition" @@ -22,7 +24,6 @@ /// optimizations are allowed but local aliases are not used. If references are /// not optimized out, semantic interposition at runtime is possible. // RUN: %clang -target ppc64le %s -Werror -fPIC -fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=HALF %s -// RUN: %clang -target riscv64 %s -Werror -fPIC -fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=HALF %s // RUN: %clang -target x86_64 %s -Werror -fPIC -c -### 2>&1 | FileCheck --check-prefix=HALF %s // _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits