r208275 - Driver: parse -mcmodel earlier

Saleem Abdulrasool compnerd at compnerd.org
Thu May 8 09:53:00 PDT 2014


On Thu, May 8, 2014 at 7:39 AM, David Majnemer <david.majnemer at gmail.com>wrote:

>
>
> On Wednesday, May 7, 2014, Saleem Abdulrasool <compnerd at compnerd.org>
> wrote:
>
>> Author: compnerd
>> Date: Wed May  7 21:28:32 2014
>> New Revision: 208275
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=208275&view=rev
>> Log:
>> Driver: parse -mcmodel earlier
>>
>> This addresses an existing FIXME item in the driver.  The code model flag
>> was
>> parsed in the actual tool rather than in the driver.  This was
>> problematic since
>> the value may be invalid.  In that case, we would silently treat it as a
>> default
>> value in non-assert builds, and abort in assert builds.  Add a check in
>> the
>> driver to validate that the value being passed is valid, and if not
>> provide a
>> proper error message.
>>
>> Added:
>>     cfe/trunk/test/Driver/code-model.c
>> Modified:
>>     cfe/trunk/lib/CodeGen/BackendUtil.cpp
>>     cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=208275&r1=208274&r2=208275&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Wed May  7 21:28:32 2014
>> @@ -14,6 +14,7 @@
>>  #include "clang/Frontend/CodeGenOptions.h"
>>  #include "clang/Frontend/FrontendDiagnostic.h"
>>  #include "clang/Frontend/Utils.h"
>> +#include "llvm/ADT/StringSwitch.h"
>>  #include "llvm/Bitcode/BitcodeWriterPass.h"
>>  #include "llvm/CodeGen/RegAllocRegistry.h"
>>  #include "llvm/CodeGen/SchedulerRegistry.h"
>> @@ -378,20 +379,16 @@ TargetMachine *EmitAssemblyHelper::Creat
>>    TargetMachine::setFunctionSections(CodeGenOpts.FunctionSections);
>>    TargetMachine::setDataSections    (CodeGenOpts.DataSections);
>>
>> -  // FIXME: Parse this earlier.
>> -  llvm::CodeModel::Model CM;
>> -  if (CodeGenOpts.CodeModel == "small") {
>> -    CM = llvm::CodeModel::Small;
>> -  } else if (CodeGenOpts.CodeModel == "kernel") {
>> -    CM = llvm::CodeModel::Kernel;
>> -  } else if (CodeGenOpts.CodeModel == "medium") {
>> -    CM = llvm::CodeModel::Medium;
>> -  } else if (CodeGenOpts.CodeModel == "large") {
>> -    CM = llvm::CodeModel::Large;
>> -  } else {
>> -    assert(CodeGenOpts.CodeModel.empty() && "Invalid code model!");
>> -    CM = llvm::CodeModel::Default;
>> -  }
>> +  unsigned CodeModel =
>> +    llvm::StringSwitch<unsigned>(CodeGenOpts.CodeModel)
>> +      .Case("small", llvm::CodeModel::Small)
>> +      .Case("kernel", llvm::CodeModel::Kernel)
>> +      .Case("medium", llvm::CodeModel::Medium)
>> +      .Case("large", llvm::CodeModel::Medium)
>
>
> Doesn't this map large to medium?
>

Yes :-(.  Not intentionally though.  Fixed in SVN r208335.  Thanks for
pointing out this unfixed copypasta.


> +      .Case("default", llvm::CodeModel::Default)
>> +      .Default(~0u);
>> +  assert(CodeModel != ~0u && "invalid code model!");
>> +  llvm::CodeModel::Model CM =
>> static_cast<llvm::CodeModel::Model>(CodeModel);
>>
>>    SmallVector<const char *, 16> BackendArgs;
>>    BackendArgs.push_back("clang"); // Fake program name.
>>
>> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=208275&r1=208274&r2=208275&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
>> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Wed May  7 21:28:32 2014
>> @@ -27,6 +27,7 @@
>>  #include "llvm/Option/ArgList.h"
>>  #include "llvm/Option/OptTable.h"
>>  #include "llvm/Option/Option.h"
>> +#include "llvm/Support/CodeGen.h"
>>  #include "llvm/Support/ErrorHandling.h"
>>  #include "llvm/Support/FileSystem.h"
>>  #include "llvm/Support/Host.h"
>> @@ -295,6 +296,17 @@ static void ParseCommentArgs(CommentOpti
>>    Opts.ParseAllComments = Args.hasArg(OPT_fparse_all_comments);
>>  }
>>
>> +static StringRef getCodeModel(ArgList &Args, DiagnosticsEngine &Diags) {
>> +  if (Arg *A = Args.getLastArg(OPT_mcode_model)) {
>> +    StringRef Value = A->getValue();
>> +    if (Value == "small" || Value == "kernel" || Value == "medium" ||
>> +        Value == "large")
>> +      return Value;
>> +    Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) <<
>> Value;
>> +  }
>> +  return "default";
>> +}
>> +
>>  static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
>> InputKind IK,
>>                               DiagnosticsEngine &Diags,
>>                               const TargetOptions &TargetOpts) {
>> @@ -376,7 +388,7 @@ static bool ParseCodeGenArgs(CodeGenOpti
>>    Opts.CUDAIsDevice = Args.hasArg(OPT_fcuda_is_device);
>>    Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);
>>    Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases);
>> -  Opts.CodeModel = Args.getLastArgValue(OPT_mcode_model);
>> +  Opts.CodeModel = getCodeModel(Args, Diags);
>>    Opts.DebugPass = Args.getLastArgValue(OPT_mdebug_pass);
>>    Opts.DisableFPElim = Args.hasArg(OPT_mdisable_fp_elim);
>>    Opts.DisableFree = Args.hasArg(OPT_disable_free);
>>
>> Added: cfe/trunk/test/Driver/code-model.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/code-model.c?rev=208275&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/test/Driver/code-model.c (added)
>> +++ cfe/trunk/test/Driver/code-model.c Wed May  7 21:28:32 2014
>> @@ -0,0 +1,13 @@
>> +// RUN: %clang -### -c -mcmodel=small %s 2>&1 | FileCheck -check-prefix
>> CHECK-SMALL %s
>> +// RUN: %clang -### -S -mcmodel=kernel %s 2>&1 | FileCheck -check-prefix
>> CHECK-KERNEL %s
>> +// RUN: %clang -### -c -mcmodel=medium %s 2>&1 | FileCheck -check-prefix
>> CHECK-MEDIUM %s
>> +// RUN: %clang -### -S -mcmodel=large %s 2>&1 | FileCheck -check-prefix
>> CHECK-LARGE %s
>> +// RUN: not %clang -c -mcmodel=lager %s 2>&1 | FileCheck -check-prefix
>> CHECK-INVALID %s
>> +
>> +// CHECK-SMALL: "-mcode-model" "small"
>> +// CHECK-KERNEL: "-mcode-model" "kernel"
>> +// CHECK-MEDIUM: "-mcode-model" "medium"
>> +// CHECK-LARGE: "-mcode-model" "large"
>> +
>> +// CHECK-INVALID: error: invalid value 'lager' in '-mcode-model lager'
>> +
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>


-- 
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140508/5c02c4e1/attachment.html>


More information about the cfe-commits mailing list