aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2011-02-03 03:45:00 +0000
committerDaniel Dunbar <daniel@zuster.org>2011-02-03 03:45:00 +0000
commitf704c61b3c88659a0c9946ea26d1bbff99803792 (patch)
treebc30d9f980c7d6f84a3feeb36244e87287ada052
parentaedd9d5ad3cc776fd61457050bcd54cac4c5ea66 (diff)
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
-rw-r--r--include/clang/Basic/DiagnosticFrontendKinds.td2
-rw-r--r--lib/Frontend/HeaderIncludeGen.cpp36
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());
}
}
-