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 66db65b..e6e63b8 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 <cstdio>
#include <vector>
@@ -372,11 +373,19 @@
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 @@
#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<const char*>::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.