paulkirth created this revision. paulkirth added reviewers: phosek, MaskRay, enh, hiraditya, vit9696. Herald added subscribers: luismarques, s.egerton, PkmX, simoncook, asb, arichardson, inglorion. Herald added a project: All. paulkirth requested review of this revision. Herald added subscribers: cfe-commits, pcwang-thead. Herald added a project: clang.
Currently the driver does not propagate the `-f[no-]emulated-tls` flags to the linker under LTO. This can be surprising when the platform defaults differ from the flags being passed. A related discussion can be found in https://reviews.llvm.org/D143619. While the focus there was RISC-V support, the root cause was that setting `-femualted-tls` and `-flto` when compiling with Clang resulted in missing symbols because the platform defaults for Android differed from the flags being passed to Clang. This patch changes the Clang driver's behavior to pass the emulated-tls flags through to the linker when compiling with LTO/ThinLTO. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D147834 Files: clang/lib/Driver/ToolChains/CommonArgs.cpp clang/test/Driver/emulated-tls.cpp Index: clang/test/Driver/emulated-tls.cpp =================================================================== --- clang/test/Driver/emulated-tls.cpp +++ clang/test/Driver/emulated-tls.cpp @@ -29,6 +29,18 @@ // RUN: %clang -### -target i686-pc-openbsd %s -femulated-tls -fno-emulated-tls 2>&1 \ // RUN: | FileCheck -check-prefix=NOEMU %s +// Test that when lto is used any -emualted-tls flags are passed to the linker +// LINUX and Android have different defaults for EmulatedTLS +// RUN: %clang -### -flto --target=riscv64-linux -fno-emulated-tls %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=LTO_NOEMUTLS +// RUN: %clang -### -flto --target=riscv64-linux-android10000 -femulated-tls %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=LTO_EMUTLS +// RUN: %clang -### -flto --target=riscv64-linux -femulated-tls %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=LTO_EMUTLS +// RUN: %clang -### -flto --target=riscv64-linux-android10000 -fno-emulated-tls %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=LTO_NOEMUTLS + + // Default without -f[no-]emulated-tls, will be decided by the target triple. // DEFAULT-NOT: "-cc1" {{.*}}"-femulated-tls" @@ -40,3 +52,10 @@ // NOEMU: "-cc1" {{.*}}"-fno-emulated-tls" // NOEMU-NOT: "-cc1" {{.*}}"-femulated-tls" + +// LTO related checks +//LTO_NOEMUTLS: plugin-opt=-emulated-tls=0 +//LTO_NOEMUTLS-NOT: plugin-opt=-emulated-tls=1 + +//LTO_EMUTLS: plugin-opt=-emulated-tls=1 +//LTO_EMUTLS-NOT: plugin-opt=-emulated-tls=0 Index: clang/lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -764,6 +764,13 @@ D.Diag(clang::diag::warn_drv_fjmc_for_elf_only); } + if (Arg *A = Args.getLastArg(options::OPT_femulated_tls, + options::OPT_fno_emulated_tls)) { + bool Enable = A->getOption().getID() == options::OPT_femulated_tls; + CmdArgs.push_back(Args.MakeArgString( + Twine(PluginOptPrefix) + "-emulated-tls=" + (Enable ? "1" : "0"))); + } + if (Args.hasFlag(options::OPT_fstack_size_section, options::OPT_fno_stack_size_section, false)) CmdArgs.push_back(
Index: clang/test/Driver/emulated-tls.cpp =================================================================== --- clang/test/Driver/emulated-tls.cpp +++ clang/test/Driver/emulated-tls.cpp @@ -29,6 +29,18 @@ // RUN: %clang -### -target i686-pc-openbsd %s -femulated-tls -fno-emulated-tls 2>&1 \ // RUN: | FileCheck -check-prefix=NOEMU %s +// Test that when lto is used any -emualted-tls flags are passed to the linker +// LINUX and Android have different defaults for EmulatedTLS +// RUN: %clang -### -flto --target=riscv64-linux -fno-emulated-tls %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=LTO_NOEMUTLS +// RUN: %clang -### -flto --target=riscv64-linux-android10000 -femulated-tls %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=LTO_EMUTLS +// RUN: %clang -### -flto --target=riscv64-linux -femulated-tls %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=LTO_EMUTLS +// RUN: %clang -### -flto --target=riscv64-linux-android10000 -fno-emulated-tls %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=LTO_NOEMUTLS + + // Default without -f[no-]emulated-tls, will be decided by the target triple. // DEFAULT-NOT: "-cc1" {{.*}}"-femulated-tls" @@ -40,3 +52,10 @@ // NOEMU: "-cc1" {{.*}}"-fno-emulated-tls" // NOEMU-NOT: "-cc1" {{.*}}"-femulated-tls" + +// LTO related checks +//LTO_NOEMUTLS: plugin-opt=-emulated-tls=0 +//LTO_NOEMUTLS-NOT: plugin-opt=-emulated-tls=1 + +//LTO_EMUTLS: plugin-opt=-emulated-tls=1 +//LTO_EMUTLS-NOT: plugin-opt=-emulated-tls=0 Index: clang/lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -764,6 +764,13 @@ D.Diag(clang::diag::warn_drv_fjmc_for_elf_only); } + if (Arg *A = Args.getLastArg(options::OPT_femulated_tls, + options::OPT_fno_emulated_tls)) { + bool Enable = A->getOption().getID() == options::OPT_femulated_tls; + CmdArgs.push_back(Args.MakeArgString( + Twine(PluginOptPrefix) + "-emulated-tls=" + (Enable ? "1" : "0"))); + } + if (Args.hasFlag(options::OPT_fstack_size_section, options::OPT_fno_stack_size_section, false)) CmdArgs.push_back(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits