From 209d093720bddf90e9acb4c27d66a976edc4dfbb Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Sun, 16 Oct 2011 07:59:55 -0400 Subject: [PATCH] Update calls to setup clang::DiagnosticsEngine properly before running preprocessor. This fixes (again) crashes when printing diagnostics when there are errors in preprocessor directives in the program we're compiling. --- module.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/module.cpp b/module.cpp index 1ddeaa55..bdc629b1 100644 --- a/module.cpp +++ b/module.cpp @@ -885,14 +885,22 @@ void Module::execPreprocessor(const char* infilename, llvm::raw_string_ostream* ostream) const { clang::CompilerInstance inst; - std::string error; - inst.createFileManager(); llvm::raw_fd_ostream stderrRaw(2, false); + +#if defined(LLVM_3_0) || defined(LLVM_3_0svn) + clang::TextDiagnosticPrinter *diagPrinter = + new clang::TextDiagnosticPrinter(stderrRaw, clang::DiagnosticOptions()); + llvm::IntrusiveRefCntPtr diagIDs(new clang::DiagnosticIDs); + clang::DiagnosticsEngine *diagEngine = + new clang::DiagnosticsEngine(diagIDs, diagPrinter); + inst.setDiagnostics(diagEngine); +#else clang::TextDiagnosticPrinter *diagPrinter = new clang::TextDiagnosticPrinter(stderrRaw, clang::DiagnosticOptions()); inst.createDiagnostics(0, NULL, diagPrinter); +#endif clang::TargetOptions &options = inst.getTargetOpts(); llvm::Triple triple(module->getTargetTriple());