diff options
-rw-r--r-- | include/clang/Basic/DiagnosticFrontendKinds.td | 2 | ||||
-rw-r--r-- | lib/Frontend/HeaderIncludeGen.cpp | 36 |
2 files changed, 24 insertions, 14 deletions
diff --git a/include/clang/Basic/DiagnosticFrontendKinds.td b/include/clang/Basic/DiagnosticFrontendKinds.td index 819f5f0867..c12efd7271 100644 --- a/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/include/clang/Basic/DiagnosticFrontendKinds.td @@ -77,6 +77,8 @@ def err_fe_pth_file_has_no_source_header : Error< "PTH file '%0' does not designate an original source header file for -include-pth">; def warn_fe_macro_contains_embedded_newline : Warning< "macro '%0' contains embedded newline, text after the newline is ignored.">; +def warn_fe_cc_print_header_failure : Warning< + "unable to open CC_PRINT_HEADERS file: %0 (using stderr)">; def err_verify_missing_start : Error< "cannot find start ('{{') of expected %0">; diff --git a/lib/Frontend/HeaderIncludeGen.cpp b/lib/Frontend/HeaderIncludeGen.cpp index 0d478d7065..45ff1d2e41 100644 --- a/lib/Frontend/HeaderIncludeGen.cpp +++ b/lib/Frontend/HeaderIncludeGen.cpp @@ -9,14 +9,15 @@ #include "clang/Frontend/Utils.h" #include "clang/Basic/SourceManager.h" +#include "clang/Frontend/FrontendDiagnostic.h" #include "clang/Lex/Preprocessor.h" -#include <cstdio> +#include "llvm/Support/raw_ostream.h" using namespace clang; namespace { class HeaderIncludesCallback : public PPCallbacks { SourceManager &SM; - FILE *OutputFile; + llvm::raw_ostream *OutputFile; unsigned CurrentIncludeDepth; bool HasProcessedPredefines; bool OwnsOutputFile; @@ -24,14 +25,14 @@ class HeaderIncludesCallback : public PPCallbacks { public: HeaderIncludesCallback(const Preprocessor *PP, bool ShowAllHeaders_, - FILE *OutputFile_, bool OwnsOutputFile_) + llvm::raw_ostream *OutputFile_, bool OwnsOutputFile_) : SM(PP->getSourceManager()), OutputFile(OutputFile_), CurrentIncludeDepth(0), HasProcessedPredefines(false), OwnsOutputFile(OwnsOutputFile_), ShowAllHeaders(ShowAllHeaders_) {} ~HeaderIncludesCallback() { if (OwnsOutputFile) - fclose(OutputFile); + delete OutputFile; } virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason, @@ -41,16 +42,24 @@ public: void clang::AttachHeaderIncludeGen(Preprocessor &PP, bool ShowAllHeaders, llvm::StringRef OutputPath) { - FILE *OutputFile; - bool OwnsOutputFile; + llvm::raw_ostream *OutputFile = &llvm::errs(); + bool OwnsOutputFile = false; // Open the output file, if used. - if (OutputPath.empty()) { - OutputFile = stderr; - OwnsOutputFile = false; - } else { - OutputFile = fopen(OutputPath.str().c_str(), "a"); - OwnsOutputFile = true; + if (!OutputPath.empty()) { + std::string Error; + llvm::raw_fd_ostream *OS = new llvm::raw_fd_ostream( + OutputPath.str().c_str(), Error, llvm::raw_fd_ostream::F_Append); + if (!Error.empty()) { + PP.getDiagnostics().Report( + clang::diag::warn_fe_cc_print_header_failure) << Error; + delete OS; + } else { + OS->SetUnbuffered(); + OS->SetUseAtomicWrites(true); + OutputFile = OS; + OwnsOutputFile = true; + } } PP.addPPCallbacks(new HeaderIncludesCallback(&PP, ShowAllHeaders, @@ -99,7 +108,6 @@ void HeaderIncludesCallback::FileChanged(SourceLocation Loc, Msg += Filename; Msg += '\n'; - fwrite(Msg.data(), Msg.size(), 1, OutputFile); + OutputFile->write(Msg.data(), Msg.size()); } } - |