diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 6190c9d65ddbd..2f3450432ba25 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -764,6 +764,13 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args, 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( diff --git a/clang/test/Driver/emulated-tls.cpp b/clang/test/Driver/emulated-tls.cpp index 20abad181128d..edc68e0f29f59 100644 --- a/clang/test/Driver/emulated-tls.cpp +++ b/clang/test/Driver/emulated-tls.cpp @@ -29,6 +29,16 @@ // 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 +50,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