From 17d3fea677753e6e3e82ffe2cbdeccbf5f2e7497 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 9 Feb 2011 17:54:19 +0000 Subject: [PATCH] Driver/Frontend: Wire up -mregparm=. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125201 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/CC1Options.td | 2 ++ include/clang/Driver/Options.td | 1 + include/clang/Frontend/CodeGenOptions.h | 5 +++++ lib/CodeGen/CGCall.cpp | 6 +++--- lib/Driver/Tools.cpp | 5 +++++ lib/Frontend/CompilerInvocation.cpp | 5 +++++ test/CodeGen/regparm-flag.c | 15 +++++++++++++++ 7 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 test/CodeGen/regparm-flag.c diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index 097a0301e1..3160e96339 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -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">, diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 735bb2d6f3..ffeb2c9bb5 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -505,6 +505,7 @@ def mno_omit_leaf_frame_pointer : Flag<"-mno-omit-leaf-frame-pointer">, Group, Group; def mpascal_strings : Flag<"-mpascal-strings">, Group; def mred_zone : Flag<"-mred-zone">, Group; +def mregparm_EQ : Joined<"-mregparm=">, Group; def mrelax_all : Flag<"-mrelax-all">, Group; def msoft_float : Flag<"-msoft-float">, Group; def msse2 : Flag<"-msse2">, Group; diff --git a/include/clang/Frontend/CodeGenOptions.h b/include/clang/Frontend/CodeGenOptions.h index 216743d5b1..66c9409fe5 100644 --- a/include/clang/Frontend/CodeGenOptions.h +++ b/include/clang/Frontend/CodeGenOptions.h @@ -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; diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 60a138c419..cc8dbcb1df 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -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(), diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index f0a142fe0e..fdc2b82cb8 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -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)) diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 6fc7373822..3108477e3a 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -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); diff --git a/test/CodeGen/regparm-flag.c b/test/CodeGen/regparm-flag.c new file mode 100644 index 0000000000..f37239e473 --- /dev/null +++ b/test/CodeGen/regparm-flag.c @@ -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) + -- 2.40.0