Driver/IRgen: Add support for -momit-leaf-frame-pointer.
llvm-svn: 107367
This commit is contained in:
@@ -149,6 +149,8 @@ def mlimit_float_precision : Separate<"-mlimit-float-precision">,
|
|||||||
HelpText<"Limit float precision to the given value">;
|
HelpText<"Limit float precision to the given value">;
|
||||||
def mno_zero_initialized_in_bss : Flag<"-mno-zero-initialized-in-bss">,
|
def mno_zero_initialized_in_bss : Flag<"-mno-zero-initialized-in-bss">,
|
||||||
HelpText<"Do not put zero initialized data in the BSS">;
|
HelpText<"Do not put zero initialized data in the BSS">;
|
||||||
|
def momit_leaf_frame_pointer : Flag<"-momit-leaf-frame-pointer">,
|
||||||
|
HelpText<"Omit frame pointer setup for leaf functions.">;
|
||||||
def msoft_float : Flag<"-msoft-float">,
|
def msoft_float : Flag<"-msoft-float">,
|
||||||
HelpText<"Use software floating point">;
|
HelpText<"Use software floating point">;
|
||||||
def mrelax_all : Flag<"-mrelax-all">,
|
def mrelax_all : Flag<"-mrelax-all">,
|
||||||
|
|||||||
@@ -462,6 +462,8 @@ def mno_thumb : Flag<"-mno-thumb">, Group<m_Group>;
|
|||||||
def marm : Flag<"-marm">, Alias<mno_thumb>;
|
def marm : Flag<"-marm">, Alias<mno_thumb>;
|
||||||
|
|
||||||
def mno_warn_nonportable_cfstrings : Flag<"-mno-warn-nonportable-cfstrings">, Group<m_Group>;
|
def mno_warn_nonportable_cfstrings : Flag<"-mno-warn-nonportable-cfstrings">, Group<m_Group>;
|
||||||
|
def mno_omit_leaf_frame_pointer : Flag<"-mno-omit-leaf-frame-pointer">, Group<f_Group>;
|
||||||
|
def momit_leaf_frame_pointer : Flag<"-momit-leaf-frame-pointer">, Group<f_Group>;
|
||||||
def mpascal_strings : Flag<"-mpascal-strings">, Group<m_Group>;
|
def mpascal_strings : Flag<"-mpascal-strings">, Group<m_Group>;
|
||||||
def mred_zone : Flag<"-mred-zone">, Group<m_Group>;
|
def mred_zone : Flag<"-mred-zone">, Group<m_Group>;
|
||||||
def mrelax_all : Flag<"-mrelax-all">, Group<m_Group>;
|
def mrelax_all : Flag<"-mrelax-all">, Group<m_Group>;
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ public:
|
|||||||
unsigned NoImplicitFloat : 1; /// Set when -mno-implicit-float is enabled.
|
unsigned NoImplicitFloat : 1; /// Set when -mno-implicit-float is enabled.
|
||||||
unsigned NoZeroInitializedInBSS : 1; /// -fno-zero-initialized-in-bss
|
unsigned NoZeroInitializedInBSS : 1; /// -fno-zero-initialized-in-bss
|
||||||
unsigned ObjCDispatchMethod : 2; /// Method of Objective-C dispatch to use.
|
unsigned ObjCDispatchMethod : 2; /// Method of Objective-C dispatch to use.
|
||||||
|
unsigned OmitLeafFramePointer : 1; /// Set when -momit-leaf-frame-pointer is
|
||||||
|
/// enabled.
|
||||||
unsigned OptimizationLevel : 3; /// The -O[0-4] option specified.
|
unsigned OptimizationLevel : 3; /// The -O[0-4] option specified.
|
||||||
unsigned OptimizeSize : 1; /// If -Os is specified.
|
unsigned OptimizeSize : 1; /// If -Os is specified.
|
||||||
unsigned RelaxAll : 1; /// Relax all machine code instructions.
|
unsigned RelaxAll : 1; /// Relax all machine code instructions.
|
||||||
@@ -109,6 +111,7 @@ public:
|
|||||||
NoImplicitFloat = 0;
|
NoImplicitFloat = 0;
|
||||||
NoZeroInitializedInBSS = 0;
|
NoZeroInitializedInBSS = 0;
|
||||||
ObjCDispatchMethod = Legacy;
|
ObjCDispatchMethod = Legacy;
|
||||||
|
OmitLeafFramePointer = 0;
|
||||||
OptimizationLevel = 0;
|
OptimizationLevel = 0;
|
||||||
OptimizeSize = 0;
|
OptimizeSize = 0;
|
||||||
RelaxAll = 0;
|
RelaxAll = 0;
|
||||||
|
|||||||
@@ -160,7 +160,20 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action,
|
|||||||
// FIXME: Expose these capabilities via actual APIs!!!! Aside from just
|
// FIXME: Expose these capabilities via actual APIs!!!! Aside from just
|
||||||
// being gross, this is also totally broken if we ever care about
|
// being gross, this is also totally broken if we ever care about
|
||||||
// concurrency.
|
// concurrency.
|
||||||
llvm::NoFramePointerElim = CodeGenOpts.DisableFPElim;
|
|
||||||
|
// Set frame pointer elimination mode.
|
||||||
|
if (!CodeGenOpts.DisableFPElim) {
|
||||||
|
llvm::NoFramePointerElim = false;
|
||||||
|
llvm::NoFramePointerElimNonLeaf = false;
|
||||||
|
} else if (CodeGenOpts.OmitLeafFramePointer) {
|
||||||
|
llvm::NoFramePointerElim = false;
|
||||||
|
llvm::NoFramePointerElimNonLeaf = true;
|
||||||
|
} else {
|
||||||
|
llvm::NoFramePointerElim = true;
|
||||||
|
llvm::NoFramePointerElimNonLeaf = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set float ABI type.
|
||||||
if (CodeGenOpts.FloatABI == "soft")
|
if (CodeGenOpts.FloatABI == "soft")
|
||||||
llvm::FloatABIType = llvm::FloatABI::Soft;
|
llvm::FloatABIType = llvm::FloatABI::Soft;
|
||||||
else if (CodeGenOpts.FloatABI == "hard")
|
else if (CodeGenOpts.FloatABI == "hard")
|
||||||
@@ -169,6 +182,7 @@ bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action,
|
|||||||
assert(CodeGenOpts.FloatABI.empty() && "Invalid float abi!");
|
assert(CodeGenOpts.FloatABI.empty() && "Invalid float abi!");
|
||||||
llvm::FloatABIType = llvm::FloatABI::Default;
|
llvm::FloatABIType = llvm::FloatABI::Default;
|
||||||
}
|
}
|
||||||
|
|
||||||
NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
|
NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
|
||||||
llvm::UseSoftFloat = CodeGenOpts.SoftFloat;
|
llvm::UseSoftFloat = CodeGenOpts.SoftFloat;
|
||||||
UnwindTablesMandatory = CodeGenOpts.UnwindTables;
|
UnwindTablesMandatory = CodeGenOpts.UnwindTables;
|
||||||
|
|||||||
@@ -999,6 +999,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -mno-omit-leaf-frame-pointer is default.
|
||||||
|
if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
|
||||||
|
options::OPT_mno_omit_leaf_frame_pointer, false))
|
||||||
|
CmdArgs.push_back("-momit-leaf-frame-pointer");
|
||||||
|
|
||||||
// -fno-math-errno is default.
|
// -fno-math-errno is default.
|
||||||
if (Args.hasFlag(options::OPT_fmath_errno,
|
if (Args.hasFlag(options::OPT_fmath_errno,
|
||||||
options::OPT_fno_math_errno,
|
options::OPT_fno_math_errno,
|
||||||
|
|||||||
@@ -132,6 +132,8 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
|
|||||||
Res.push_back("-fno-common");
|
Res.push_back("-fno-common");
|
||||||
if (Opts.NoImplicitFloat)
|
if (Opts.NoImplicitFloat)
|
||||||
Res.push_back("-no-implicit-float");
|
Res.push_back("-no-implicit-float");
|
||||||
|
if (Opts.OmitLeafFramePointer)
|
||||||
|
Res.push_back("-momit-leaf-frame-pointer");
|
||||||
if (Opts.OptimizeSize) {
|
if (Opts.OptimizeSize) {
|
||||||
assert(Opts.OptimizationLevel == 2 && "Invalid options!");
|
assert(Opts.OptimizationLevel == 2 && "Invalid options!");
|
||||||
Res.push_back("-Os");
|
Res.push_back("-Os");
|
||||||
@@ -833,6 +835,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
|
|||||||
Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision);
|
Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision);
|
||||||
Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
|
Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
|
||||||
Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
|
Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
|
||||||
|
Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer);
|
||||||
Opts.SoftFloat = Args.hasArg(OPT_msoft_float);
|
Opts.SoftFloat = Args.hasArg(OPT_msoft_float);
|
||||||
Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
|
Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
|
||||||
Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic");
|
Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic");
|
||||||
|
|||||||
29
clang/test/CodeGen/frame-pointer-elim.c
Normal file
29
clang/test/CodeGen/frame-pointer-elim.c
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
// RUN: %clang -ccc-host-triple i386 -S -o - %s | \
|
||||||
|
// RUN: FileCheck --check-prefix=DEFAULT %s
|
||||||
|
// DEFAULT: f0:
|
||||||
|
// DEFAULT: pushl %ebp
|
||||||
|
// DEFAULT: ret
|
||||||
|
// DEFAULT: f1:
|
||||||
|
// DEFAULT: pushl %ebp
|
||||||
|
// DEFAULT: ret
|
||||||
|
|
||||||
|
// RUN: %clang -ccc-host-triple i386 -S -o - -fomit-frame-pointer %s | \
|
||||||
|
// RUN: FileCheck --check-prefix=OMIT_ALL %s
|
||||||
|
// OMIT_ALL: f0:
|
||||||
|
// OMIT_ALL-NOT: pushl %ebp
|
||||||
|
// OMIT_ALL: ret
|
||||||
|
// OMIT_ALL: f1:
|
||||||
|
// OMIT_ALL-NOT: pushl %ebp
|
||||||
|
// OMIT_ALL: ret
|
||||||
|
|
||||||
|
// RUN: %clang -ccc-host-triple i386 -S -o - -momit-leaf-frame-pointer %s | \
|
||||||
|
// RUN: FileCheck --check-prefix=OMIT_LEAF %s
|
||||||
|
// OMIT_LEAF: f0:
|
||||||
|
// OMIT_LEAF-NOT: pushl %ebp
|
||||||
|
// OMIT_LEAF: ret
|
||||||
|
// OMIT_LEAF: f1:
|
||||||
|
// OMIT_LEAF: pushl %ebp
|
||||||
|
// OMIT_LEAF: ret
|
||||||
|
|
||||||
|
void f0() {}
|
||||||
|
void f1() { f0(); }
|
||||||
Reference in New Issue
Block a user