Driver/IRgen: Add support for -momit-leaf-frame-pointer.

llvm-svn: 107367
This commit is contained in:
Daniel Dunbar
2010-07-01 01:31:45 +00:00
parent 54b8b8c1a7
commit bb7ac52e02
7 changed files with 59 additions and 1 deletions

View File

@@ -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">,

View File

@@ -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>;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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,

View File

@@ -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");

View 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(); }