diff options
| author | Dylan Noblesmith <nobled@dreamwidth.org> | 2011-12-23 03:05:38 +0000 |
|---|---|---|
| committer | Dylan Noblesmith <nobled@dreamwidth.org> | 2011-12-23 03:05:38 +0000 |
| commit | e99b27f35e802bb3b7ef40068e75f8fb3378c103 (patch) | |
| tree | 284f9f683aba5f63f5fbc5875a8e8d42981a0c48 /clang/tools | |
| parent | 5d44a4332a7cc34dbbf91df28fe150e605fb89d7 (diff) | |
| download | bcm5719-llvm-e99b27f35e802bb3b7ef40068e75f8fb3378c103.tar.gz bcm5719-llvm-e99b27f35e802bb3b7ef40068e75f8fb3378c103.zip | |
Let CompilerInvocation initialization indicate failure
This fixes the FIXMEs in ParseAnalyzeArgs. (Also a
precursor to moving the analyzer into an AST plugin.)
For consistency, do the same with AssemblerInvocation.
llvm-svn: 147218
Diffstat (limited to 'clang/tools')
| -rw-r--r-- | clang/tools/arcmt-test/arcmt-test.cpp | 8 | ||||
| -rw-r--r-- | clang/tools/driver/cc1_main.cpp | 17 | ||||
| -rw-r--r-- | clang/tools/driver/cc1as_main.cpp | 28 |
3 files changed, 36 insertions, 17 deletions
diff --git a/clang/tools/arcmt-test/arcmt-test.cpp b/clang/tools/arcmt-test/arcmt-test.cpp index 3f91fcf124a..3dc4c116673 100644 --- a/clang/tools/arcmt-test/arcmt-test.cpp +++ b/clang/tools/arcmt-test/arcmt-test.cpp @@ -118,7 +118,8 @@ static bool checkForMigration(StringRef resourcesPath, } CompilerInvocation CI; - CompilerInvocation::CreateFromArgs(CI, Args.begin(), Args.end(), *Diags); + if (!CompilerInvocation::CreateFromArgs(CI, Args.begin(), Args.end(), *Diags)) + return true; if (CI.getFrontendOpts().Inputs.empty()) { llvm::errs() << "error: no input files\n"; @@ -159,8 +160,9 @@ static bool performTransformations(StringRef resourcesPath, new DiagnosticsEngine(DiagID, DiagClient)); CompilerInvocation origCI; - CompilerInvocation::CreateFromArgs(origCI, Args.begin(), Args.end(), - *TopDiags); + if (!CompilerInvocation::CreateFromArgs(origCI, Args.begin(), Args.end(), + *TopDiags)) + return true; if (origCI.getFrontendOpts().Inputs.empty()) { llvm::errs() << "error: no input files\n"; diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp index f1fb68d539b..0a14fdd315d 100644 --- a/clang/tools/driver/cc1_main.cpp +++ b/clang/tools/driver/cc1_main.cpp @@ -77,7 +77,8 @@ static int cc1_test(DiagnosticsEngine &Diags, // Create a compiler invocation. llvm::errs() << "cc1 creating invocation.\n"; CompilerInvocation Invocation; - CompilerInvocation::CreateFromArgs(Invocation, ArgBegin, ArgEnd, Diags); + if (!CompilerInvocation::CreateFromArgs(Invocation, ArgBegin, ArgEnd, Diags)) + return 1; // Convert the invocation back to argument strings. std::vector<std::string> InvocationArgs; @@ -95,8 +96,9 @@ static int cc1_test(DiagnosticsEngine &Diags, // Convert those arguments to another invocation, and check that we got the // same thing. CompilerInvocation Invocation2; - CompilerInvocation::CreateFromArgs(Invocation2, Invocation2Args.begin(), - Invocation2Args.end(), Diags); + if (!CompilerInvocation::CreateFromArgs(Invocation2, Invocation2Args.begin(), + Invocation2Args.end(), Diags)) + return 1; // FIXME: Implement CompilerInvocation comparison. if (true) { @@ -135,8 +137,11 @@ int cc1_main(const char **ArgBegin, const char **ArgEnd, // well formed diagnostic object. TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer; DiagnosticsEngine Diags(DiagID, DiagsBuffer); - CompilerInvocation::CreateFromArgs(Clang->getInvocation(), ArgBegin, ArgEnd, - Diags); + bool Success; + Success = CompilerInvocation::CreateFromArgs(Clang->getInvocation(), + ArgBegin, ArgEnd, Diags); + if (!Success) + return 1; // Infer the builtin include path if unspecified. if (Clang->getHeaderSearchOpts().UseBuiltinIncludes && @@ -157,7 +162,7 @@ int cc1_main(const char **ArgBegin, const char **ArgEnd, DiagsBuffer->FlushDiagnostics(Clang->getDiagnostics()); // Execute the frontend actions. - bool Success = ExecuteCompilerInvocation(Clang.get()); + Success = ExecuteCompilerInvocation(Clang.get()); // If any timers were active but haven't been destroyed yet, print their // results now. This happens in -disable-free mode. diff --git a/clang/tools/driver/cc1as_main.cpp b/clang/tools/driver/cc1as_main.cpp index 9959b0d2965..4591a368730 100644 --- a/clang/tools/driver/cc1as_main.cpp +++ b/clang/tools/driver/cc1as_main.cpp @@ -122,17 +122,19 @@ public: NoExecStack = 0; } - static void CreateFromArgs(AssemblerInvocation &Res, const char **ArgBegin, + static bool CreateFromArgs(AssemblerInvocation &Res, const char **ArgBegin, const char **ArgEnd, DiagnosticsEngine &Diags); }; } -void AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, +bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, const char **ArgBegin, const char **ArgEnd, DiagnosticsEngine &Diags) { using namespace clang::driver::cc1asoptions; + bool Success = true; + // Parse the arguments. OwningPtr<OptTable> OptTbl(createCC1AsOptTable()); unsigned MissingArgIndex, MissingArgCount; @@ -140,14 +142,18 @@ void AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, OptTbl->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount)); // Check for missing argument error. - if (MissingArgCount) + if (MissingArgCount) { Diags.Report(diag::err_drv_missing_argument) << Args->getArgString(MissingArgIndex) << MissingArgCount; + Success = false; + } // Issue errors on unknown arguments. for (arg_iterator it = Args->filtered_begin(cc1asoptions::OPT_UNKNOWN), - ie = Args->filtered_end(); it != ie; ++it) + ie = Args->filtered_end(); it != ie; ++it) { Diags.Report(diag::err_drv_unknown_argument) << (*it) ->getAsString(*Args); + Success = false; + } // Construct the invocation. @@ -171,8 +177,10 @@ void AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, const Arg *A = it; if (First) Opts.InputFile = A->getValue(*Args); - else + else { Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(*Args); + Success = false; + } } } Opts.LLVMArgs = Args->getAllArgValues(OPT_mllvm); @@ -186,10 +194,11 @@ void AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, .Case("null", FT_Null) .Case("obj", FT_Obj) .Default(~0U); - if (OutputType == ~0U) + if (OutputType == ~0U) { Diags.Report(diag::err_drv_invalid_value) << A->getAsString(*Args) << Name; - else + Success = false; + } else Opts.OutputType = FileType(OutputType); } Opts.ShowHelp = Args->hasArg(OPT_help); @@ -204,6 +213,8 @@ void AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, // Assemble Options Opts.RelaxAll = Args->hasArg(OPT_relax_all); Opts.NoExecStack = Args->hasArg(OPT_no_exec_stack); + + return true; } static formatted_raw_ostream *GetOutputStream(AssemblerInvocation &Opts, @@ -374,7 +385,8 @@ int cc1as_main(const char **ArgBegin, const char **ArgEnd, // Parse the arguments. AssemblerInvocation Asm; - AssemblerInvocation::CreateFromArgs(Asm, ArgBegin, ArgEnd, Diags); + if (!AssemblerInvocation::CreateFromArgs(Asm, ArgBegin, ArgEnd, Diags)) + return 1; // Honor -help. if (Asm.ShowHelp) { |

