forked from OSchip/llvm-project
parent
8b4e283bfb
commit
0bb0331d95
|
@ -177,6 +177,8 @@ def momit_leaf_frame_pointer : Flag<"-momit-leaf-frame-pointer">,
|
|||
HelpText<"Omit frame pointer setup for leaf functions.">;
|
||||
def msoft_float : Flag<"-msoft-float">,
|
||||
HelpText<"Use software floating point">;
|
||||
def mregparm : Separate<"-mregparm">,
|
||||
HelpText<"Limit the number of registers available for integer arguments">;
|
||||
def mrelax_all : Flag<"-mrelax-all">,
|
||||
HelpText<"Relax all machine instructions">;
|
||||
def mrelocation_model : Separate<"-mrelocation-model">,
|
||||
|
|
|
@ -505,6 +505,7 @@ def mno_omit_leaf_frame_pointer : Flag<"-mno-omit-leaf-frame-pointer">, Group<f_
|
|||
def momit_leaf_frame_pointer : Flag<"-momit-leaf-frame-pointer">, Group<f_Group>;
|
||||
def mpascal_strings : Flag<"-mpascal-strings">, Group<m_Group>;
|
||||
def mred_zone : Flag<"-mred-zone">, Group<m_Group>;
|
||||
def mregparm_EQ : Joined<"-mregparm=">, Group<m_Group>;
|
||||
def mrelax_all : Flag<"-mrelax-all">, Group<m_Group>;
|
||||
def msoft_float : Flag<"-msoft-float">, Group<m_Group>;
|
||||
def msse2 : Flag<"-msse2">, Group<m_x86_Features_Group>;
|
||||
|
|
|
@ -111,6 +111,10 @@ public:
|
|||
/// The name of the relocation model to use.
|
||||
std::string RelocationModel;
|
||||
|
||||
/// The user specified number of registers to be used for integral arguments,
|
||||
/// or 0 if unspecified.
|
||||
unsigned NumRegisterParameters;
|
||||
|
||||
public:
|
||||
CodeGenOptions() {
|
||||
AsmVerbose = 0;
|
||||
|
@ -134,6 +138,7 @@ public:
|
|||
NoInfsFPMath = 0;
|
||||
NoNaNsFPMath = 0;
|
||||
NoZeroInitializedInBSS = 0;
|
||||
NumRegisterParameters = 0;
|
||||
ObjCDispatchMethod = Legacy;
|
||||
OmitLeafFramePointer = 0;
|
||||
OptimizationLevel = 0;
|
||||
|
|
|
@ -755,10 +755,10 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
|
|||
if (RetAttrs)
|
||||
PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
|
||||
|
||||
// FIXME: we need to honor command line settings also.
|
||||
// FIXME: RegParm should be reduced in case of nested functions and/or global
|
||||
// register variable.
|
||||
// FIXME: RegParm should be reduced in case of global register variable.
|
||||
signed RegParm = FI.getRegParm();
|
||||
if (!RegParm)
|
||||
RegParm = CodeGenOpts.NumRegisterParameters;
|
||||
|
||||
unsigned PointerWidth = getContext().Target.getPointerWidth(0);
|
||||
for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
|
||||
|
|
|
@ -1012,6 +1012,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
|
||||
// LLVM Code Generator Options.
|
||||
|
||||
if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
|
||||
CmdArgs.push_back("-mregparm");
|
||||
CmdArgs.push_back(A->getValue(Args));
|
||||
}
|
||||
|
||||
// FIXME: Set --enable-unsafe-fp-math.
|
||||
if (Args.hasFlag(options::OPT_fno_omit_frame_pointer,
|
||||
options::OPT_fomit_frame_pointer))
|
||||
|
|
|
@ -202,6 +202,10 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
|
|||
Res.push_back("-fobjc-dispatch-method=non-legacy");
|
||||
break;
|
||||
}
|
||||
if (Opts.NumRegisterParameters) {
|
||||
Res.push_back("-mregparm");
|
||||
Res.push_back(llvm::utostr(Opts.NumRegisterParameters));
|
||||
}
|
||||
if (Opts.RelaxAll)
|
||||
Res.push_back("-mrelax-all");
|
||||
if (Opts.SoftFloat)
|
||||
|
@ -928,6 +932,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
Opts.NoInfsFPMath = Opts.NoNaNsFPMath = Args.hasArg(OPT_cl_finite_math_only)||
|
||||
Args.hasArg(OPT_cl_fast_relaxed_math);
|
||||
Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
|
||||
Opts.NumRegisterParameters = Args.getLastArgIntValue(OPT_mregparm, 0, Diags);
|
||||
Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
|
||||
Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer);
|
||||
Opts.SoftFloat = Args.hasArg(OPT_msoft_float);
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
// RUN: %clang_cc1 -triple i386-unknown-unknown -mregparm 4 %s -emit-llvm -o %t
|
||||
// RUN: FileCheck < %t %s
|
||||
|
||||
void f1(int a, int b, int c, int d,
|
||||
int e, int f, int g, int h);
|
||||
|
||||
void f0() {
|
||||
// CHECK: call void @f1(i32 inreg 1, i32 inreg 2, i32 inreg 3, i32 inreg 4,
|
||||
// CHECK: i32 5, i32 6, i32 7, i32 8)
|
||||
f1(1, 2, 3, 4, 5, 6, 7, 8);
|
||||
}
|
||||
|
||||
// CHECK: declare void @f1(i32 inreg, i32 inreg, i32 inreg, i32 inreg,
|
||||
// CHECK: i32, i32, i32, i32)
|
||||
|
Loading…
Reference in New Issue