clang-cc: Factor CreateDiagnosticEngine out of main.

llvm-svn: 86963
This commit is contained in:
Daniel Dunbar 2009-11-12 06:48:31 +00:00
parent 0d1defd4cd
commit ec256a921f
1 changed files with 50 additions and 36 deletions

View File

@ -1069,6 +1069,35 @@ static void ConstructCompilerInvocation(CompilerInvocation &Opts,
FinalizeCompileOptions(Opts.getCompileOpts(), Opts.getLangOpts());
}
static Diagnostic *CreateDiagnosticEngine(const DiagnosticOptions &Opts,
int argc, char **argv) {
// Create the diagnostic client for reporting errors or for
// implementing -verify.
llvm::OwningPtr<DiagnosticClient> DiagClient;
if (VerifyDiagnostics) {
// When checking diagnostics, just buffer them up.
DiagClient.reset(new TextDiagnosticBuffer());
} else {
DiagClient.reset(new TextDiagnosticPrinter(llvm::errs(), Opts));
}
if (!DumpBuildInformation.empty())
SetUpBuildDumpLog(Opts, argc, argv, DiagClient);
// Configure our handling of diagnostics.
Diagnostic *Diags = new Diagnostic(DiagClient.take());
if (ProcessWarningOptions(*Diags, OptWarnings, OptPedantic, OptPedanticErrors,
OptNoWarnings))
return 0;
// Set an error handler, so that any LLVM backend diagnostics go through our
// error handler.
llvm::llvm_install_error_handler(LLVMErrorHandler,
static_cast<void*>(Diags));
return Diags;
}
int main(int argc, char **argv) {
llvm::sys::PrintStackTraceOnErrorSignal();
llvm::PrettyStackTraceProgram X(argc, argv);
@ -1081,6 +1110,11 @@ int main(int argc, char **argv) {
llvm::cl::ParseCommandLineOptions(argc, argv,
"LLVM 'Clang' Compiler: http://clang.llvm.org\n");
if (VerifyDiagnostics && InputFilenames.size() > 1) {
fprintf(stderr, "-verify only works on single input files.\n");
return 1;
}
if (TimeReport)
ClangFrontendTimer = new llvm::Timer("Clang front-end time");
@ -1093,38 +1127,18 @@ int main(int argc, char **argv) {
if (InputFilenames.empty())
InputFilenames.push_back("-");
// Construct the diagnostic options first, which cannot fail, so that we can
// build a diagnostic client to use for any errors during option handling.
// Construct the diagnostic engine first, so that we can build a diagnostic
// client to use for any errors during option handling.
DiagnosticOptions DiagOpts;
InitializeDiagnosticOptions(DiagOpts);
// Create the diagnostic client for reporting errors or for
// implementing -verify.
llvm::OwningPtr<DiagnosticClient> DiagClient;
if (VerifyDiagnostics) {
// When checking diagnostics, just buffer them up.
DiagClient.reset(new TextDiagnosticBuffer());
if (InputFilenames.size() != 1) {
fprintf(stderr, "-verify only works on single input files.\n");
return 1;
}
} else {
DiagClient.reset(new TextDiagnosticPrinter(llvm::errs(), DiagOpts));
}
if (!DumpBuildInformation.empty())
SetUpBuildDumpLog(DiagOpts, argc, argv, DiagClient);
// Configure our handling of diagnostics.
Diagnostic Diags(DiagClient.get());
if (ProcessWarningOptions(Diags, OptWarnings, OptPedantic, OptPedanticErrors,
OptNoWarnings))
llvm::OwningPtr<Diagnostic>
Diags(CreateDiagnosticEngine(DiagOpts, argc, argv));
if (!Diags)
return 1;
// Set an error handler, so that any LLVM backend diagnostics go through our
// error handler.
llvm::llvm_install_error_handler(LLVMErrorHandler,
static_cast<void*>(&Diags));
// FIXME: Hack to make sure we release the diagnostic client, the engine
// should (optionally?) take ownership of it.
llvm::OwningPtr<DiagnosticClient> DiagClient(Diags->getClient());
// Initialize base triple. If a -triple option has been specified, use
// that triple. Otherwise, default to the host triple.
@ -1137,14 +1151,14 @@ int main(int argc, char **argv) {
Target(TargetInfo::CreateTargetInfo(Triple.getTriple()));
if (Target == 0) {
Diags.Report(diag::err_fe_unknown_triple) << Triple.getTriple().c_str();
Diags->Report(diag::err_fe_unknown_triple) << Triple.getTriple().c_str();
return 1;
}
// Set the target ABI if specified.
if (!TargetABI.empty()) {
if (!Target->setABI(TargetABI)) {
Diags.Report(diag::err_fe_unknown_target_abi) << TargetABI;
Diags->Report(diag::err_fe_unknown_target_abi) << TargetABI;
return 1;
}
}
@ -1174,7 +1188,7 @@ int main(int argc, char **argv) {
// AST inputs are handled specially.
if (LK == langkind_ast) {
ProcessASTInputFile(CompOpts, InFile, ProgAction, Diags, FileMgr,
ProcessASTInputFile(CompOpts, InFile, ProgAction, *Diags, FileMgr,
Context);
continue;
}
@ -1185,20 +1199,20 @@ int main(int argc, char **argv) {
// Set up the preprocessor with these options.
llvm::OwningPtr<Preprocessor>
PP(CreatePreprocessor(Diags, CompOpts.getLangOpts(),
PP(CreatePreprocessor(*Diags, CompOpts.getLangOpts(),
CompOpts.getPreprocessorOpts(),
CompOpts.getHeaderSearchOpts(),
CompOpts.getDependencyOutputOpts(),
*Target, SourceMgr, FileMgr));
// Process the source file.
Diags.getClient()->BeginSourceFile(CompOpts.getLangOpts());
Diags->getClient()->BeginSourceFile(CompOpts.getLangOpts());
ProcessInputFile(CompOpts, *PP, InFile, ProgAction, Context);
Diags.getClient()->EndSourceFile();
Diags->getClient()->EndSourceFile();
}
if (CompOpts.getDiagnosticOpts().ShowCarets)
if (unsigned NumDiagnostics = Diags.getNumDiagnostics())
if (unsigned NumDiagnostics = Diags->getNumDiagnostics())
fprintf(stderr, "%d diagnostic%s generated.\n", NumDiagnostics,
(NumDiagnostics == 1 ? "" : "s"));
@ -1217,5 +1231,5 @@ int main(int argc, char **argv) {
// -time-passes usable.
llvm::llvm_shutdown();
return (Diags.getNumErrors() != 0);
return (Diags->getNumErrors() != 0);
}