diff options
-rw-r--r-- | clang/Driver/HTMLPrint.cpp | 2 | ||||
-rw-r--r-- | clang/Driver/clang.cpp | 22 | ||||
-rw-r--r-- | clang/include/clang/Lex/Preprocessor.h | 15 | ||||
-rw-r--r-- | clang/lib/Lex/Preprocessor.cpp | 6 |
4 files changed, 15 insertions, 30 deletions
diff --git a/clang/Driver/HTMLPrint.cpp b/clang/Driver/HTMLPrint.cpp index b1c4c6d998f..e6e6ab7edf7 100644 --- a/clang/Driver/HTMLPrint.cpp +++ b/clang/Driver/HTMLPrint.cpp @@ -67,7 +67,7 @@ HTMLPrinter::~HTMLPrinter() { // for example. if (PP) html::SyntaxHighlight(R, FileID, *PP); - if (PPF) html::HighlightMacros(R, FileID, *PP); + if (PPF) html::HighlightMacros(R, FileID, *PP); html::EscapeText(R, FileID, false, true); // Open the output. diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp index 1a6db481b61..5ff30a4c5ba 100644 --- a/clang/Driver/clang.cpp +++ b/clang/Driver/clang.cpp @@ -588,10 +588,7 @@ static void AddImplicitInclude(std::vector<char> &Buf, const std::string &File){ /// static unsigned InitializePreprocessor(Preprocessor &PP, bool InitializeSourceMgr, - const std::string &InFile, - std::vector<char> &PredefineBuffer) { - - + const std::string &InFile) { FileManager &FileMgr = PP.getFileManager(); // Figure out where to get and map in the main file. @@ -615,6 +612,8 @@ static unsigned InitializePreprocessor(Preprocessor &PP, } } + std::vector<char> PredefineBuffer; + // Add macros from the command line. unsigned d = 0, D = D_macros.size(); unsigned u = 0, U = U_macros.size(); @@ -631,13 +630,9 @@ static unsigned InitializePreprocessor(Preprocessor &PP, for (unsigned i = 0, e = ImplicitIncludes.size(); i != e; ++i) AddImplicitInclude(PredefineBuffer, ImplicitIncludes[i]); - // Null terminate PredefinedBuffer and add it. We actually need to make a - // copy because PP will own the string. + // Null terminate PredefinedBuffer and add it. PredefineBuffer.push_back(0); - - char* predefines = new char[PredefineBuffer.size()]; - std::copy(PredefineBuffer.begin(), PredefineBuffer.end(), predefines); - PP.setPredefines(predefines); + PP.setPredefines(&PredefineBuffer[0]); // Once we've read this, we're done. return SourceMgr.getMainFileID(); @@ -1031,7 +1026,6 @@ class VISIBILITY_HIDDEN DriverPreprocessorFactory : public PreprocessorFactory { TargetInfo &Target; SourceManager &SourceMgr; HeaderSearch &HeaderInfo; - std::vector<char> PredefineBuffer; bool InitializeSourceMgr; public: @@ -1046,19 +1040,15 @@ public: virtual ~DriverPreprocessorFactory() {} virtual Preprocessor* CreatePreprocessor() { - PredefineBuffer.clear(); - Preprocessor* PP = new Preprocessor(Diags, LangInfo, Target, SourceMgr, HeaderInfo); - if (!InitializePreprocessor(*PP, InitializeSourceMgr, InFile, - PredefineBuffer)) { + if (!InitializePreprocessor(*PP, InitializeSourceMgr, InFile)) { delete PP; return NULL; } InitializeSourceMgr = false; - return PP; } }; diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 6a0255e0516..daa9b406623 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -130,9 +130,9 @@ class Preprocessor { unsigned NumFastMacroExpanded, NumTokenPaste, NumFastTokenPaste; unsigned NumSkipped; - /// Predefines - This pointer, if non-null, are the predefined macros that - /// preprocessor should use from the command line etc. - const char *Predefines; + /// Predefines - This string is the predefined macros that preprocessor + /// should use from the command line etc. + std::string Predefines; /// TokenLexerCache - Cache macro expanders to reduce malloc traffic. enum { TokenLexerCacheSize = 8 }; @@ -196,11 +196,10 @@ public: /// void setMacroInfo(IdentifierInfo *II, MacroInfo *MI); - /// setPredefines - Set the predefines for this Preprocessor. - /// The Preprocessor assumes ownership of this pointer. - void setPredefines(const char *P) { - Predefines = P; - } + /// setPredefines - Set the predefines for this Preprocessor. These + /// predefines are automatically injected when parsing the main file. + void setPredefines(const char *P) { Predefines = P; } + void setPredefines(const std::string &P) { Predefines = P; } /// getIdentifierInfo - Return information about the specified preprocessor /// identifier token. The version of this method that takes two character diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 370244b8f6b..9240a0aa7f5 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -72,8 +72,6 @@ Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts, // This gets unpoisoned where it is allowed. (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned(); - Predefines = 0; - // Initialize the pragma handlers. PragmaHandlers = new PragmaNamespace(0); RegisterBuiltinPragmas(); @@ -112,8 +110,6 @@ Preprocessor::~Preprocessor() { delete ScratchBuf; delete Callbacks; - - delete [] Predefines; } /// Diag - Forwarding function for diagnostics. This emits a diagnostic at @@ -463,7 +459,7 @@ void Preprocessor::EnterMainSourceFile() { InitializePredefinedMacros(*this, PrologFile); // Add on the predefines from the driver. - PrologFile.insert(PrologFile.end(), Predefines,Predefines+strlen(Predefines)); + PrologFile.insert(PrologFile.end(), Predefines.begin(), Predefines.end()); // Memory buffer must end with a null byte! PrologFile.push_back(0); |