mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-01 12:43:47 +00:00
Implement command line options for stack probe space
This code adds the -mstack-probe-size command line option and implements the /Gs compiler switch for clang-cl. This should fix http://llvm.org/bugs/show_bug.cgi?id=21896 Patch by Andrew H! Differential Revision: http://reviews.llvm.org/D6685 llvm-svn: 226601
This commit is contained in:
parent
6b77455f81
commit
77dc236605
@ -62,6 +62,8 @@ def _SLASH_GR : CLFlag<"GR">, HelpText<"Enable emission of RTTI data">;
|
||||
def _SLASH_GR_ : CLFlag<"GR-">, HelpText<"Disable emission of RTTI data">;
|
||||
def _SLASH_GF_ : CLFlag<"GF-">, HelpText<"Disable string pooling">,
|
||||
Alias<fwritable_strings>;
|
||||
def _SLASH_Gs : CLJoined<"Gs">, HelpText<"Set stack probe size">,
|
||||
Alias<mstack_probe_size>;
|
||||
def _SLASH_Gy : CLFlag<"Gy">, HelpText<"Put each function in its own section">,
|
||||
Alias<ffunction_sections>;
|
||||
def _SLASH_Gy_ : CLFlag<"Gy-">, HelpText<"Don't put each function in its own section">,
|
||||
@ -260,7 +262,6 @@ def _SLASH_Gm : CLFlag<"Gm">;
|
||||
def _SLASH_Gm_ : CLFlag<"Gm-">;
|
||||
def _SLASH_Gr : CLFlag<"Gr">;
|
||||
def _SLASH_GS : CLFlag<"GS">;
|
||||
def _SLASH_Gs : CLJoined<"Gs">;
|
||||
def _SLASH_GT : CLFlag<"GT">;
|
||||
def _SLASH_GX : CLFlag<"GX">;
|
||||
def _SLASH_Gv : CLFlag<"Gv">;
|
||||
|
@ -1129,6 +1129,8 @@ def mstackrealign : Flag<["-"], "mstackrealign">, Group<m_Group>, Flags<[CC1Opti
|
||||
HelpText<"Force realign the stack at entry to every function">;
|
||||
def mstack_alignment : Joined<["-"], "mstack-alignment=">, Group<m_Group>, Flags<[CC1Option]>,
|
||||
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 mthread_model : Separate<["-"], "mthread-model">, Group<m_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"The thread model to use, e.g. posix, single (posix by default)">;
|
||||
|
||||
|
@ -138,6 +138,8 @@ CODEGENOPT(UseInitArray , 1, 0) ///< Control whether to use .init_array or
|
||||
///< .ctors.
|
||||
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(DebugColumnInfo, 1, 0) ///< Whether or not to use column information
|
||||
///< in debug info.
|
||||
|
||||
|
@ -1616,6 +1616,9 @@ public:
|
||||
bool d, bool p, bool w, unsigned RegParms)
|
||||
: X86_32TargetCodeGenInfo(CGT, d, p, w, RegParms) {}
|
||||
|
||||
void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
|
||||
CodeGen::CodeGenModule &CGM) const override;
|
||||
|
||||
void getDependentLibraryOption(llvm::StringRef Lib,
|
||||
llvm::SmallString<24> &Opt) const override {
|
||||
Opt = "/DEFAULTLIB:";
|
||||
@ -1629,12 +1632,35 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
static void addStackProbeSizeTargetAttribute(const Decl *D,
|
||||
llvm::GlobalValue *GV,
|
||||
CodeGen::CodeGenModule &CGM) {
|
||||
if (isa<FunctionDecl>(D)) {
|
||||
if (CGM.getCodeGenOpts().StackProbeSize != 4096) {
|
||||
llvm::Function *Fn = cast<llvm::Function>(GV);
|
||||
|
||||
Fn->addFnAttr("stack-probe-size", llvm::utostr(CGM.getCodeGenOpts().StackProbeSize));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WinX86_32TargetCodeGenInfo::SetTargetAttributes(const Decl *D,
|
||||
llvm::GlobalValue *GV,
|
||||
CodeGen::CodeGenModule &CGM) const {
|
||||
X86_32TargetCodeGenInfo::SetTargetAttributes(D, GV, CGM);
|
||||
|
||||
addStackProbeSizeTargetAttribute(D, GV, CGM);
|
||||
}
|
||||
|
||||
class WinX86_64TargetCodeGenInfo : public TargetCodeGenInfo {
|
||||
bool HasAVX;
|
||||
public:
|
||||
WinX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool HasAVX)
|
||||
: TargetCodeGenInfo(new WinX86_64ABIInfo(CGT)), HasAVX(HasAVX) {}
|
||||
|
||||
void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
|
||||
CodeGen::CodeGenModule &CGM) const override;
|
||||
|
||||
int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
|
||||
return 7;
|
||||
}
|
||||
@ -1666,6 +1692,13 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
void WinX86_64TargetCodeGenInfo::SetTargetAttributes(const Decl *D,
|
||||
llvm::GlobalValue *GV,
|
||||
CodeGen::CodeGenModule &CGM) const {
|
||||
TargetCodeGenInfo::SetTargetAttributes(D, GV, CGM);
|
||||
|
||||
addStackProbeSizeTargetAttribute(D, GV, CGM);
|
||||
}
|
||||
}
|
||||
|
||||
void X86_64ABIInfo::postMerge(unsigned AggregateSize, Class &Lo,
|
||||
|
@ -3733,6 +3733,15 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
|
||||
}
|
||||
|
||||
if (Args.hasArg(options::OPT_mstack_probe_size)) {
|
||||
StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
|
||||
|
||||
if (!Size.empty())
|
||||
CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
|
||||
else
|
||||
CmdArgs.push_back("-mstack-probe-size=0");
|
||||
}
|
||||
|
||||
if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
|
||||
getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
|
||||
CmdArgs.push_back("-fallow-half-arguments-and-returns");
|
||||
|
@ -523,6 +523,13 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
||||
Opts.StackAlignment = StackAlignment;
|
||||
}
|
||||
|
||||
if (Arg *A = Args.getLastArg(OPT_mstack_probe_size)) {
|
||||
StringRef Val = A->getValue();
|
||||
unsigned StackProbeSize = Opts.StackProbeSize;
|
||||
Val.getAsInteger(0, StackProbeSize);
|
||||
Opts.StackProbeSize = StackProbeSize;
|
||||
}
|
||||
|
||||
if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
|
||||
StringRef Name = A->getValue();
|
||||
unsigned Method = llvm::StringSwitch<unsigned>(Name)
|
||||
|
@ -42,6 +42,13 @@
|
||||
// RUN: %clang_cl /Gy /Gy- -### -- %s 2>&1 | FileCheck -check-prefix=Gy_ %s
|
||||
// Gy_-NOT: -ffunction-sections
|
||||
|
||||
// RUN: %clang_cl /Gs -### -- %s 2>&1 | FileCheck -check-prefix=Gs %s
|
||||
// Gs: "-mstack-probe-size=0"
|
||||
// RUN: %clang_cl /Gs0 -### -- %s 2>&1 | FileCheck -check-prefix=Gs0 %s
|
||||
// Gs0: "-mstack-probe-size=0"
|
||||
// RUN: %clang_cl /Gs4096 -### -- %s 2>&1 | FileCheck -check-prefix=Gs4096 %s
|
||||
// Gs4096: "-mstack-probe-size=4096"
|
||||
|
||||
// RUN: %clang_cl /Gw -### -- %s 2>&1 | FileCheck -check-prefix=Gw %s
|
||||
// Gw: -fdata-sections
|
||||
|
||||
@ -245,7 +252,6 @@
|
||||
// RUN: /Gm- \
|
||||
// RUN: /Gr \
|
||||
// RUN: /GS \
|
||||
// RUN: /Gs1000 \
|
||||
// RUN: /GT \
|
||||
// RUN: /GX \
|
||||
// RUN: /Gv \
|
||||
|
Loading…
x
Reference in New Issue
Block a user