From: Ted Kremenek Date: Thu, 22 Oct 2009 03:24:01 +0000 (+0000) Subject: Add some explanatory diagnostics when clang_createTranslationUnitFromSource fails. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=379afec20ce8fd419551874daf3a1e683547575e;p=clang Add some explanatory diagnostics when clang_createTranslationUnitFromSource fails. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84825 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 66db65b009..e6e63b8ef1 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -27,6 +27,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/System/Path.h" #include "llvm/System/Program.h" +#include "llvm/Support/raw_ostream.h" #include #include @@ -372,11 +373,19 @@ CXTranslationUnit clang_createTranslationUnit( std::string astName(ast_filename); std::string ErrMsg; - return ASTUnit::LoadFromPCHFile(astName, &ErrMsg, - CXXIdx->getDisplayDiagnostics() ? - NULL : new IgnoreDiagnosticsClient(), - CXXIdx->getOnlyLocalDecls(), - /* UseBumpAllocator = */ true); + CXTranslationUnit TU = + ASTUnit::LoadFromPCHFile(astName, &ErrMsg, + CXXIdx->getDisplayDiagnostics() ? + NULL : new IgnoreDiagnosticsClient(), + CXXIdx->getOnlyLocalDecls(), + /* UseBumpAllocator = */ true); + + if (CXXIdx->getDisplayDiagnostics() && !ErrMsg.empty()) { + (llvm::errs() << "clang_createTranslationUnit: " << ErrMsg + << '\n').flush(); + } + + return TU; } CXTranslationUnit clang_createTranslationUnitFromSourceFile( @@ -429,10 +438,21 @@ CXTranslationUnit clang_createTranslationUnitFromSourceFile( #ifndef LLVM_ON_WIN32 llvm::sys::Path DevNull("/dev/null"); + std::string ErrMsg; const llvm::sys::Path *Redirects[] = { &DevNull, &DevNull, &DevNull, NULL }; - llvm::sys::Program::ExecuteAndWait(ClangPath, &argv[0], NULL, - !CXXIdx->getDisplayDiagnostics() ? - &Redirects[0] : NULL); + llvm::sys::Program::ExecuteAndWait(ClangPath, &argv[0], /* env */ NULL, + /* redirects */ !CXXIdx->getDisplayDiagnostics() ? &Redirects[0] : NULL, + /* secondsToWait */ 0, /* memoryLimits */ 0, &ErrMsg); + + if (CXXIdx->getDisplayDiagnostics() && !ErrMsg.empty()) { + llvm::errs() << "clang_createTranslationUnitFromSourceFile: " << ErrMsg + << '\n' << "Arguments: \n"; + for (std::vector::iterator I = argv.begin(), E = argv.end(); + I!=E; ++I) + if (*I) llvm::errs() << ' ' << *I << '\n'; + + (llvm::errs() << '\n').flush(); + } #else // FIXME: I don't know what is the equivalent '/dev/null' redirect for // Windows for this API.