On Mon, Oct 19, 2009 at 3:15 PM, Ted Kremenek <[email protected]> wrote: > Author: kremenek > Date: Mon Oct 19 17:15:09 2009 > New Revision: 84548 > > URL: http://llvm.org/viewvc/llvm-project?rev=84548&view=rev > Log: > Really fix <rdar://problem/7312058> by adding a 'displayDiagnostics' option to > clang_createTranslationUnit() and > clang_createTranslationUnitFromSourceFile(). The user can now > specify if the diagnostics from Clang are printed to stderr or are silenced > completely. We can > obviously evolve this API to be more general in the future. > > Note: Added a FIXME since I wasn't certain what was the best way to redirect > to something analogous > to '/dev/null' on Windows.
I wouldn't worry about it. Eventually we will presumably integrate this with clang-cc instead of fork/exec, at which point we should get complete control of the diagnostic client. Then we won't need to bother with any redirection. - Daniel > Modified: > cfe/trunk/include/clang-c/Index.h > cfe/trunk/tools/CIndex/CIndex.cpp > cfe/trunk/tools/c-index-test/c-index-test.c > > Modified: cfe/trunk/include/clang-c/Index.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=84548&r1=84547&r2=84548&view=diff > > ============================================================================== > --- cfe/trunk/include/clang-c/Index.h (original) > +++ cfe/trunk/include/clang-c/Index.h Mon Oct 19 17:15:09 2009 > @@ -107,15 +107,26 @@ > const char *clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit); > > CXTranslationUnit clang_createTranslationUnit( > - CXIndex, const char *ast_filename > + CXIndex, const char *ast_filename, > + int displayDiagnostics > ); > + > +/** > + * \brief Destroy the specified CXTranslationUnit object. > + */ > +void clang_disposeTranslationUnit(CXTranslationUnit); > + > +/** > + * \brief Return the CXTranslationUnit for a given source file and the > provided command line > + * arguments one would pass to the compiler. > + */ > CXTranslationUnit clang_createTranslationUnitFromSourceFile( > CXIndex CIdx, > const char *source_filename, > int num_clang_command_line_args, > - const char **clang_command_line_args > + const char **clang_command_line_args, > + int displayDiagnostics > ); > -void clang_disposeTranslationUnit(CXTranslationUnit); > > /** > * \brief Indicate to Clang that it should only enumerate "local" declarations > > Modified: cfe/trunk/tools/CIndex/CIndex.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.cpp?rev=84548&r1=84547&r2=84548&view=diff > > ============================================================================== > --- cfe/trunk/tools/CIndex/CIndex.cpp (original) > +++ cfe/trunk/tools/CIndex/CIndex.cpp Mon Oct 19 17:15:09 2009 > @@ -350,15 +350,16 @@ > > // FIXME: need to pass back error info. > CXTranslationUnit clang_createTranslationUnit( > - CXIndex CIdx, const char *ast_filename) > + CXIndex CIdx, const char *ast_filename, int displayDiagnostics) > { > assert(CIdx && "Passed null CXIndex"); > CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); > std::string astName(ast_filename); > std::string ErrMsg; > + DiagnosticClient *diagClient = displayDiagnostics > + ? NULL : new IgnoreDiagnosticsClient(); > > - return ASTUnit::LoadFromPCHFile(astName, &ErrMsg, > - new IgnoreDiagnosticsClient(), > + return ASTUnit::LoadFromPCHFile(astName, &ErrMsg, diagClient, > CXXIdx->getOnlyLocalDecls(), > /* UseBumpAllocator = */ true); > } > @@ -366,8 +367,8 @@ > CXTranslationUnit clang_createTranslationUnitFromSourceFile( > CXIndex CIdx, > const char *source_filename, > - int num_command_line_args, const char **command_line_args) > -{ > + int num_command_line_args, const char **command_line_args, > + int displayDiagnostics) { > // Build up the arguments for involing clang. > llvm::sys::Path ClangPath = static_cast<CIndexer *>(CIdx)->getClangPath(); > std::vector<const char *> argv; > @@ -383,11 +384,21 @@ > argv.push_back(NULL); > > // Generate the AST file in a separate process. > +#ifdef LLVM_ON_WIN32 > + llvm::sys::Path DevNull("/dev/null") > + llvm::sys::Path *Redirects[] = { &DevNull, &DevNull, &DevNull, NULL }; > + llvm::sys::Program::ExecuteAndWait(ClangPath, &argv[0], > + !displayDiagnostics ? Redirects : NULL); > +#else > + // FIXME: I don't know what is the equivalent '/dev/null' redirect for > + // Windows for this API. > llvm::sys::Program::ExecuteAndWait(ClangPath, &argv[0]); > +#endif > > // Finally, we create the translation unit from the ast file. > ASTUnit *ATU = static_cast<ASTUnit *>( > - clang_createTranslationUnit(CIdx, astTmpFile)); > + clang_createTranslationUnit(CIdx, astTmpFile, > + displayDiagnostics)); > ATU->unlinkTemporaryFile(); > return ATU; > } > > Modified: cfe/trunk/tools/c-index-test/c-index-test.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=84548&r1=84547&r2=84548&view=diff > > ============================================================================== > --- cfe/trunk/tools/c-index-test/c-index-test.c (original) > +++ cfe/trunk/tools/c-index-test/c-index-test.c Mon Oct 19 17:15:09 2009 > @@ -96,7 +96,7 @@ > if (!strcmp(argv[2], "local")) > clang_wantOnlyLocalDeclarations(Idx); > > - TU = clang_createTranslationUnit(Idx, argv[1]); > + TU = clang_createTranslationUnit(Idx, argv[1], /* displayDiagnostics= */ > 1); > > if (!TU) { > fprintf(stderr, "Unable to load translation unit!\n"); > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
