[cfe-commits] r84548 - in /cfe/trunk: include/clang-c/Index.h tools/CIndex/CIndex.cpp tools/c-index-test/c-index-test.c

Daniel Dunbar daniel at zuster.org
Mon Oct 19 17:59:28 PDT 2009


On Mon, Oct 19, 2009 at 3:15 PM, Ted Kremenek <kremenek at apple.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list