diff options
author | Daniel Dunbar <daniel@zuster.org> | 2011-02-03 03:45:00 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2011-02-03 03:45:00 +0000 |
commit | f704c61b3c88659a0c9946ea26d1bbff99803792 (patch) | |
tree | bc30d9f980c7d6f84a3feeb36244e87287ada052 /lib/Frontend/HeaderIncludeGen.cpp | |
parent | aedd9d5ad3cc776fd61457050bcd54cac4c5ea66 (diff) | |
download | clang-f704c61b3c88659a0c9946ea26d1bbff99803792.tar.gz |
Frontend: Switch -header-include-file output to use unbuffered raw_ostreams with
the atomic writes option, since the intent is that this option be set for an
entire build, which may have any number of compiler instances writing to the
same output file.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124772 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/HeaderIncludeGen.cpp')
-rw-r--r-- | lib/Frontend/HeaderIncludeGen.cpp | 36 |
1 files changed, 22 insertions, 14 deletions
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()); } } - |