forked from OSchip/llvm-project
Support for the mno-stack-arg-probe flag
Adds support for this flag. There is also another piece for llvm (separate review). More info: https://bugs.llvm.org/show_bug.cgi?id=36221 By Ruslan Nikolaev! Differential Revision: https://reviews.llvm.org/D43108 llvm-svn: 325901
This commit is contained in:
parent
89c35fc44d
commit
d43f40df1c
|
@ -2192,6 +2192,10 @@ Set the stack alignment
|
|||
|
||||
Set the stack probe size
|
||||
|
||||
.. option:: -mstack-arg-probe, -mno-stack-arg-probe
|
||||
|
||||
Disable stack probes
|
||||
|
||||
.. option:: -mstackrealign, -mno-stackrealign
|
||||
|
||||
Force realign the stack at entry to every function
|
||||
|
|
|
@ -1842,6 +1842,10 @@ def mstack_alignment : Joined<["-"], "mstack-alignment=">, Group<m_Group>, Flags
|
|||
HelpText<"Set the stack alignment">;
|
||||
def mstack_probe_size : Joined<["-"], "mstack-probe-size=">, Group<m_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Set the stack probe size">;
|
||||
def mstack_arg_probe : Flag<["-"], "mstack-arg-probe">, Group<m_Group>,
|
||||
HelpText<"Enable stack probes">;
|
||||
def mno_stack_arg_probe : Flag<["-"], "mno-stack-arg-probe">, Group<m_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Disable stack probes which are enabled by default">;
|
||||
def mthread_model : Separate<["-"], "mthread-model">, Group<m_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"The thread model to use, e.g. posix, single (posix by default)">, Values<"posix,single">;
|
||||
def meabi : Separate<["-"], "meabi">, Group<m_Group>, Flags<[CC1Option]>,
|
||||
|
|
|
@ -227,6 +227,7 @@ VALUE_CODEGENOPT(StackAlignment , 32, 0) ///< Overrides default stack
|
|||
///< alignment, if not 0.
|
||||
VALUE_CODEGENOPT(StackProbeSize , 32, 4096) ///< Overrides default stack
|
||||
///< probe size, even if 0.
|
||||
CODEGENOPT(NoStackArgProbe, 1, 0) ///< Set when -mno-stack-arg-probe is used
|
||||
CODEGENOPT(DebugColumnInfo, 1, 0) ///< Whether or not to use column information
|
||||
///< in debug info.
|
||||
|
||||
|
|
|
@ -2351,16 +2351,15 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
static void addStackProbeSizeTargetAttribute(const Decl *D,
|
||||
llvm::GlobalValue *GV,
|
||||
CodeGen::CodeGenModule &CGM) {
|
||||
if (D && isa<FunctionDecl>(D)) {
|
||||
if (CGM.getCodeGenOpts().StackProbeSize != 4096) {
|
||||
llvm::Function *Fn = cast<llvm::Function>(GV);
|
||||
static void addStackProbeTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
|
||||
CodeGen::CodeGenModule &CGM) {
|
||||
if (llvm::Function *Fn = dyn_cast_or_null<llvm::Function>(GV)) {
|
||||
|
||||
if (CGM.getCodeGenOpts().StackProbeSize != 4096)
|
||||
Fn->addFnAttr("stack-probe-size",
|
||||
llvm::utostr(CGM.getCodeGenOpts().StackProbeSize));
|
||||
}
|
||||
if (CGM.getCodeGenOpts().NoStackArgProbe)
|
||||
Fn->addFnAttr("no-stack-arg-probe");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2369,7 +2368,7 @@ void WinX86_32TargetCodeGenInfo::setTargetAttributes(
|
|||
X86_32TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
|
||||
if (GV->isDeclaration())
|
||||
return;
|
||||
addStackProbeSizeTargetAttribute(D, GV, CGM);
|
||||
addStackProbeTargetAttributes(D, GV, CGM);
|
||||
}
|
||||
|
||||
class WinX86_64TargetCodeGenInfo : public TargetCodeGenInfo {
|
||||
|
@ -2429,7 +2428,7 @@ void WinX86_64TargetCodeGenInfo::setTargetAttributes(
|
|||
}
|
||||
}
|
||||
|
||||
addStackProbeSizeTargetAttribute(D, GV, CGM);
|
||||
addStackProbeTargetAttributes(D, GV, CGM);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5622,7 +5621,7 @@ void WindowsARMTargetCodeGenInfo::setTargetAttributes(
|
|||
ARMTargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
|
||||
if (GV->isDeclaration())
|
||||
return;
|
||||
addStackProbeSizeTargetAttribute(D, GV, CGM);
|
||||
addStackProbeTargetAttributes(D, GV, CGM);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4047,6 +4047,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
CmdArgs.push_back("-mstack-probe-size=0");
|
||||
}
|
||||
|
||||
if (!Args.hasFlag(options::OPT_mstack_arg_probe,
|
||||
options::OPT_mno_stack_arg_probe, true))
|
||||
CmdArgs.push_back(Args.MakeArgString("-mno-stack-arg-probe"));
|
||||
|
||||
if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
|
||||
options::OPT_mno_restrict_it)) {
|
||||
if (A->getOption().matches(options::OPT_mrestrict_it)) {
|
||||
|
|
|
@ -923,6 +923,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
Opts.StackProbeSize = StackProbeSize;
|
||||
}
|
||||
|
||||
Opts.NoStackArgProbe = Args.hasArg(OPT_mno_stack_arg_probe);
|
||||
|
||||
if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
|
||||
StringRef Name = A->getValue();
|
||||
unsigned Method = llvm::StringSwitch<unsigned>(Name)
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
// RUN: %clang_cc1 %s -triple=i686-windows-msvc -emit-llvm -o - -mno-stack-arg-probe | FileCheck %s -check-prefix=NO-STACKPROBE
|
||||
// RUN: %clang_cc1 %s -triple=i686-windows-msvc -emit-llvm -o - | FileCheck %s -check-prefix=STACKPROBE
|
||||
|
||||
// NO-STACKPROBE: attributes #{{[0-9]+}} = {{{.*}} "no-stack-arg-probe"
|
||||
// STACKPROBE-NOT: attributes #{{[0-9]+}} = {{{.*}} "no-stack-arg-probe"
|
||||
|
||||
void test1() {
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
// RUN: %clang -### %s 2>&1 | FileCheck %s -check-prefix=STACKPROBE
|
||||
// RUN: %clang -### -mno-stack-arg-probe -mstack-arg-probe %s 2>&1 | FileCheck %s -check-prefix=STACKPROBE
|
||||
// RUN: %clang -### -mstack-arg-probe -mno-stack-arg-probe %s 2>&1 | FileCheck %s -check-prefix=NO-STACKPROBE
|
||||
// REQUIRES: clang-driver
|
||||
|
||||
// NO-STACKPROBE: -mno-stack-arg-probe
|
||||
// STACKPROBE-NOT: -mno-stack-arg-probe
|
Loading…
Reference in New Issue