ro created this revision. ro added a reviewer: MaskRay. ro added a project: clang. Herald added subscribers: fedor.sergeev, jyknight. ro requested review of this revision.
This is the driver part of D91605 <https://reviews.llvm.org/D91605>, a workaround to allow direct calls to `__tls_get_addr` on Solaris/amd64. Tested on `amd64-pc-solaris2.11` and `sparcv9-sun-solaris2.11`. This adds a testcase to the original submission. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D119829 Files: clang/lib/Driver/ToolChains/Solaris.cpp clang/test/Driver/solaris-ld-sanitizer.c
Index: clang/test/Driver/solaris-ld-sanitizer.c =================================================================== --- /dev/null +++ clang/test/Driver/solaris-ld-sanitizer.c @@ -0,0 +1,67 @@ +// General tests that the ld -z relax=transtls workaround is only applied +// on Solaris/amd64. Note that we use sysroot to make these tests +// independent of the host system. + +// Check sparc-sun-solaris2.11, 32bit +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32 %s +// CHECK-LD-SPARC32-NOT: -zrelax=transtls + +// Check sparc-sun-solaris2.11, 32bit +// RUN: %clang -no-canonical-prefixes -fsanitize=undefined %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32 %s +// CHECK-LD-SPARC32-NOT: -zrelax=transtls + +// Check sparc-sun-solaris2.11, 64bit +// RUN: %clang -no-canonical-prefixes -m64 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC64 %s +// CHECK-LD-SPARC64-NOT: -zrelax=transtls + +// Check sparc-sun-solaris2.11, 64bit +// RUN: %clang -no-canonical-prefixes -m64 -fsanitize=undefined %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC64 %s +// CHECK-LD-SPARC64-NOT: -zrelax=transtls + +// Check i386-pc-solaris2.11, 32bit +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: --target=i386-pc-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_x86_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-X32 %s +// CHECK-LD-X32-NOT: -zrelax=transtls + +// Check i386-pc-solaris2.11, 32bit +// RUN: %clang -no-canonical-prefixes -fsanitize=undefined %s -### -o %t.o 2>&1 \ +// RUN: --target=i386-pc-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_x86_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-X32 %s +// CHECK-LD-X32-NOT: -zrelax=transtls + +// Check i386-pc-solaris2.11, 64bit +// RUN: %clang -no-canonical-prefixes -m64 %s -### -o %t.o 2>&1 \ +// RUN: --target=i386-pc-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_x86_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-X64 %s +// CHECK-LD-X64-NOT: -zrelax=transtls + +// Check i386-pc-solaris2.11, 64bit +// RUN: %clang -no-canonical-prefixes -m64 -fsanitize=undefined %s -### -o %t.o 2>&1 \ +// RUN: --target=i386-pc-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_x86_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-X64-UBSAN %s +// CHECK-LD-X64-UBSAN: -zrelax=transtls Index: clang/lib/Driver/ToolChains/Solaris.cpp =================================================================== --- clang/lib/Driver/ToolChains/Solaris.cpp +++ clang/lib/Driver/ToolChains/Solaris.cpp @@ -14,6 +14,8 @@ #include "clang/Driver/Driver.h" #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Options.h" +#include "clang/Driver/SanitizerArgs.h" +#include "clang/Driver/ToolChain.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" @@ -145,8 +147,18 @@ CmdArgs.push_back("-lgcc"); CmdArgs.push_back("-lm"); } - if (NeedsSanitizerDeps) + if (NeedsSanitizerDeps) { linkSanitizerRuntimeDeps(getToolChain(), CmdArgs); + + // Work around Solaris/amd64 ld bug when calling __tls_get_addr directly. + // However, ld -z relax=transtls is available since Solaris 11.2, but not + // in Illumos. + const SanitizerArgs &SA = getToolChain().getSanitizerArgs(Args); + if (getToolChain().getTriple().getArch() == llvm::Triple::x86_64 && + (SA.needsAsanRt() || SA.needsStatsRt() || + (SA.needsUbsanRt() && !SA.requiresMinimalRuntime()))) + CmdArgs.push_back("-zrelax=transtls"); + } } if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits