Add support for -mno-tls-direct-seg-refs to Clang
This patch exposes functionality added in rL344723 to the Clang driver/frontend as a flag and adds appropriate metadata. Driver tests pass: ``` ninja check-clang-driver -snip- Expected Passes : 472 Expected Failures : 3 Unsupported Tests : 65 ``` Odd failure in CodeGen tests but unrelated to this: ``` ninja check-clang-codegen -snip- /SourceCache/llvm-trunk-8.0/tools/clang/test/CodeGen/builtins-wasm.c:87:10: error: cannot compile this builtin function yet -snip- Failing Tests (1): Clang :: CodeGen/builtins-wasm.c Expected Passes : 1250 Expected Failures : 2 Unsupported Tests : 120 Unexpected Failures: 1 ``` Original commit: [X86] Support for the mno-tls-direct-seg-refs flag Allows to disable direct TLS segment access (%fs or %gs). GCC supports a similar flag, it can be useful in some circumstances, e.g. when a thread context block needs to be updated directly from user space. More info and specific use cases: https://bugs.llvm.org/show_bug.cgi?id=16145 Patch by nruslan (Ruslan Nikolaev). Differential Revision: https://reviews.llvm.org/D53102 llvm-svn: 344739
This commit is contained in:
parent
7052cb35a1
commit
7f569b7c4f
|
@ -2011,6 +2011,8 @@ def mno_global_merge : Flag<["-"], "mno-global-merge">, Group<m_Group>, Flags<[C
|
|||
def mno_pascal_strings : Flag<["-"], "mno-pascal-strings">,
|
||||
Alias<fno_pascal_strings>;
|
||||
def mno_red_zone : Flag<["-"], "mno-red-zone">, Group<m_Group>;
|
||||
def mno_tls_direct_seg_refs : Flag<["-"], "mno-tls-direct-seg-refs">, Group<m_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Disable direct TLS access through segment registers">;
|
||||
def mno_relax_all : Flag<["-"], "mno-relax-all">, Group<m_Group>;
|
||||
def mno_rtd: Flag<["-"], "mno-rtd">, Group<m_Group>;
|
||||
def mno_soft_float : Flag<["-"], "mno-soft-float">, Group<m_Group>;
|
||||
|
@ -2171,6 +2173,8 @@ def momit_leaf_frame_pointer : Flag<["-"], "momit-leaf-frame-pointer">, Group<m_
|
|||
def moslib_EQ : Joined<["-"], "moslib=">, Group<m_Group>;
|
||||
def mpascal_strings : Flag<["-"], "mpascal-strings">, Alias<fpascal_strings>;
|
||||
def mred_zone : Flag<["-"], "mred-zone">, Group<m_Group>;
|
||||
def mtls_direct_seg_refs : Flag<["-"], "mtls-direct-seg-refs">, Group<m_Group>,
|
||||
HelpText<"Enable direct TLS access through segment registers (default)">;
|
||||
def mregparm_EQ : Joined<["-"], "mregparm=">, Group<m_Group>;
|
||||
def mrelax_all : Flag<["-"], "mrelax-all">, Group<m_Group>, Flags<[CC1Option,CC1AsOption]>,
|
||||
HelpText<"(integrated-as) Relax all machine instructions">;
|
||||
|
|
|
@ -62,6 +62,8 @@ CODEGENOPT(ExperimentalNewPassManager, 1, 0) ///< Enables the new, experimental
|
|||
CODEGENOPT(DebugPassManager, 1, 0) ///< Prints debug information for the new
|
||||
///< pass manager.
|
||||
CODEGENOPT(DisableRedZone , 1, 0) ///< Set when -mno-red-zone is enabled.
|
||||
CODEGENOPT(IndirectTlsSegRefs, 1, 0) ///< Set when -mno-tls-direct-seg-refs
|
||||
///< is specified.
|
||||
CODEGENOPT(DisableTailCalls , 1, 0) ///< Do not emit tail calls.
|
||||
CODEGENOPT(NoEscapingBlockTailCalls, 1, 0) ///< Do not emit tail calls from
|
||||
///< escaping blocks.
|
||||
|
|
|
@ -1709,6 +1709,8 @@ void CodeGenModule::ConstructDefaultFnAttrList(StringRef Name, bool HasOptnone,
|
|||
|
||||
if (CodeGenOpts.DisableRedZone)
|
||||
FuncAttrs.addAttribute(llvm::Attribute::NoRedZone);
|
||||
if (CodeGenOpts.IndirectTlsSegRefs)
|
||||
FuncAttrs.addAttribute("indirect-tls-seg-refs");
|
||||
if (CodeGenOpts.NoImplicitFloat)
|
||||
FuncAttrs.addAttribute(llvm::Attribute::NoImplicitFloat);
|
||||
|
||||
|
|
|
@ -1739,6 +1739,10 @@ void Clang::AddX86TargetArgs(const ArgList &Args,
|
|||
Args.hasArg(options::OPT_fapple_kext))
|
||||
CmdArgs.push_back("-disable-red-zone");
|
||||
|
||||
if (!Args.hasFlag(options::OPT_mtls_direct_seg_refs,
|
||||
options::OPT_mno_tls_direct_seg_refs, true))
|
||||
CmdArgs.push_back("-mno-tls-direct-seg-refs");
|
||||
|
||||
// Default to avoid implicit floating-point for kernel/kext code, but allow
|
||||
// that to be overridden with -mno-soft-float.
|
||||
bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
|
||||
|
|
|
@ -614,6 +614,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
Opts.DisableLifetimeMarkers = Args.hasArg(OPT_disable_lifetimemarkers);
|
||||
Opts.DisableO0ImplyOptNone = Args.hasArg(OPT_disable_O0_optnone);
|
||||
Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
|
||||
Opts.IndirectTlsSegRefs = Args.hasArg(OPT_mno_tls_direct_seg_refs);
|
||||
Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables);
|
||||
Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(
|
||||
OPT_fuse_register_sized_bitfield_access);
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
// RUN: %clang_cc1 %s -emit-llvm -o - -mno-tls-direct-seg-refs | FileCheck %s -check-prefix=NO-TLSDIRECT
|
||||
// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s -check-prefix=TLSDIRECT
|
||||
|
||||
// NO-TLSDIRECT: attributes #{{[0-9]+}} = {{{.*}} "indirect-tls-seg-refs"
|
||||
// TLSDIRECT-NOT: attributes #{{[0-9]+}} = {{{.*}} "indirect-tls-seg-refs"
|
||||
|
||||
void test1() {
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
// RUN: %clang -### %s 2>&1 | FileCheck %s -check-prefix=TLSDIRECT
|
||||
// RUN: %clang -### -mno-tls-direct-seg-refs -mtls-direct-seg-refs %s 2>&1 | FileCheck %s -check-prefix=TLSDIRECT
|
||||
// RUN: %clang -### -mtls-direct-seg-refs -mno-tls-direct-seg-refs %s 2>&1 | FileCheck %s -check-prefix=NO-TLSDIRECT
|
||||
// REQUIRES: clang-driver
|
||||
|
||||
// NO-TLSDIRECT: -mno-tls-direct-seg-refs
|
||||
// TLSDIRECT-NOT: -mno-tls-direct-seg-refs
|
Loading…
Reference in New Issue