From e9512e2c275bf24295202443452da314fb77270f Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Fri, 26 Jul 2013 15:32:04 +0000 Subject: [PATCH] [frontend] '-frewrite-includes' should not ignore headers included from command-line. rdar://14556182 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187207 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Rewrite/Frontend/InclusionRewriter.cpp | 13 ++++++++++++- test/Frontend/rewrite-includes-header-cmd-line.c | 7 +++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 test/Frontend/rewrite-includes-header-cmd-line.c diff --git a/lib/Rewrite/Frontend/InclusionRewriter.cpp b/lib/Rewrite/Frontend/InclusionRewriter.cpp index 93ad9b88d6..a2297f9179 100644 --- a/lib/Rewrite/Frontend/InclusionRewriter.cpp +++ b/lib/Rewrite/Frontend/InclusionRewriter.cpp @@ -40,6 +40,7 @@ class InclusionRewriter : public PPCallbacks { Preprocessor &PP; ///< Used to find inclusion directives. SourceManager &SM; ///< Used to read and manage source files. raw_ostream &OS; ///< The destination stream for rewritten contents. + const llvm::MemoryBuffer *PredefinesBuffer; ///< The preprocessor predefines. bool ShowLineMarkers; ///< Show #line markers. bool UseLineDirective; ///< Use of line directives or line markers. typedef std::map FileChangeMap; @@ -50,6 +51,9 @@ class InclusionRewriter : public PPCallbacks { public: InclusionRewriter(Preprocessor &PP, raw_ostream &OS, bool ShowLineMarkers); bool Process(FileID FileId, SrcMgr::CharacteristicKind FileType); + void setPredefinesBuffer(const llvm::MemoryBuffer *Buf) { + PredefinesBuffer = Buf; + } private: virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason, SrcMgr::CharacteristicKind FileType, @@ -89,7 +93,7 @@ private: /// Initializes an InclusionRewriter with a \p PP source and \p OS destination. InclusionRewriter::InclusionRewriter(Preprocessor &PP, raw_ostream &OS, bool ShowLineMarkers) - : PP(PP), SM(PP.getSourceManager()), OS(OS), + : PP(PP), SM(PP.getSourceManager()), OS(OS), PredefinesBuffer(0), ShowLineMarkers(ShowLineMarkers), LastInsertedFileChange(FileChanges.end()) { // If we're in microsoft mode, use normal #line instead of line markers. @@ -214,6 +218,11 @@ void InclusionRewriter::OutputContentUpTo(const MemoryBuffer &FromFile, bool EnsureNewline) { if (WriteTo <= WriteFrom) return; + if (&FromFile == PredefinesBuffer) { + // Ignore the #defines of the predefines buffer. + WriteFrom = WriteTo; + return; + } OS.write(FromFile.getBufferStart() + WriteFrom, WriteTo - WriteFrom); // count lines manually, it's faster than getPresumedLoc() Line += std::count(FromFile.getBufferStart() + WriteFrom, @@ -525,6 +534,8 @@ void clang::RewriteIncludesInInput(Preprocessor &PP, raw_ostream *OS, do { PP.Lex(Tok); } while (Tok.isNot(tok::eof)); + Rewrite->setPredefinesBuffer(SM.getBuffer(PP.getPredefinesFileID())); + Rewrite->Process(PP.getPredefinesFileID(), SrcMgr::C_User); Rewrite->Process(SM.getMainFileID(), SrcMgr::C_User); OS->flush(); } diff --git a/test/Frontend/rewrite-includes-header-cmd-line.c b/test/Frontend/rewrite-includes-header-cmd-line.c new file mode 100644 index 0000000000..dffaf28fe2 --- /dev/null +++ b/test/Frontend/rewrite-includes-header-cmd-line.c @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -E -frewrite-includes -include rewrite-includes2.h -I %S/Inputs %s -o - | FileCheck -strict-whitespace %s + +// STARTMAIN + +// CHECK-NOT: {{^}}#define +// CHECK: included_line2 +// CHECK: {{^}}// STARTMAIN{{$}} -- 2.40.0