do a dance with predefines, and finally enable reading of macros from
PCH. This works now, except for limitations not being able to do things with identifiers. The basic example in the testcase works though. llvm-svn: 68832
This commit is contained in:
parent
e49adaf7f2
commit
d959d753bc
|
@ -788,7 +788,7 @@ class PreprocessorFactory {
|
|||
public:
|
||||
virtual ~PreprocessorFactory();
|
||||
virtual Preprocessor* CreatePreprocessor() = 0;
|
||||
virtual bool FinishInitialization(Preprocessor *PP);
|
||||
virtual bool FinishInitialization(Preprocessor *PP, bool usesPCH);
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
|
|
@ -271,11 +271,7 @@ bool PCHReader::ReadPreprocessorBlock() {
|
|||
}
|
||||
|
||||
// Finally, install the macro.
|
||||
II = II;
|
||||
#if 0
|
||||
// FIXME: Do this when predefines buffer is worked out.
|
||||
PP.setMacroInfo(II, MI);
|
||||
#endif
|
||||
|
||||
// Remember that we saw this macro last so that we add the tokens that
|
||||
// form its body to it.
|
||||
|
@ -466,6 +462,12 @@ bool PCHReader::ReadPCH(const std::string &FileName) {
|
|||
// Load the translation unit declaration
|
||||
ReadDeclRecord(DeclOffsets[0], 0);
|
||||
|
||||
// If everything looks like it will be ok, then the PCH file load succeeded.
|
||||
// Since the PCH file contains everything that is in the preprocessor's
|
||||
// predefines buffer (and we validated that they are the same) clear out the
|
||||
// predefines buffer so that it doesn't get processed again.
|
||||
PP.setPredefines("");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ using namespace clang;
|
|||
|
||||
PreprocessorFactory::~PreprocessorFactory() {}
|
||||
|
||||
bool PreprocessorFactory::FinishInitialization(Preprocessor *PP) {
|
||||
bool PreprocessorFactory::FinishInitialization(Preprocessor *PP, bool UsesPCH) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,3 +8,6 @@ double z; // expected-error{{redefinition}}
|
|||
|
||||
//double VeryHappy; // FIXME: xpected-error{{redefinition}}
|
||||
|
||||
|
||||
int Q = A_MACRO_IN_THE_PCH;
|
||||
|
||||
|
|
|
@ -10,3 +10,4 @@ float z;
|
|||
#define MAKE_HAPPY(X) X##Happy
|
||||
int MAKE_HAPPY(Very);
|
||||
|
||||
#define A_MACRO_IN_THE_PCH 492
|
||||
|
|
|
@ -1442,7 +1442,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
|
|||
///
|
||||
static bool InitializePreprocessor(Preprocessor &PP,
|
||||
bool InitializeSourceMgr,
|
||||
const std::string &InFile) {
|
||||
const std::string &InFile, bool UsesPCH) {
|
||||
FileManager &FileMgr = PP.getFileManager();
|
||||
|
||||
// Figure out where to get and map in the main file.
|
||||
|
@ -1476,6 +1476,11 @@ static bool InitializePreprocessor(Preprocessor &PP,
|
|||
}
|
||||
}
|
||||
|
||||
// If the file is using PCH, then the PCH will include all the predefines, no
|
||||
// need to install them now.
|
||||
if (UsesPCH)
|
||||
return false;
|
||||
|
||||
std::vector<char> PredefineBuffer;
|
||||
|
||||
// Install things like __POWERPC__, __GNUC__, etc into the macro table.
|
||||
|
@ -1765,10 +1770,9 @@ public:
|
|||
return PP.take();
|
||||
}
|
||||
|
||||
virtual bool FinishInitialization(Preprocessor *PP) {
|
||||
if (InitializePreprocessor(*PP, InitializeSourceMgr, InFile)) {
|
||||
virtual bool FinishInitialization(Preprocessor *PP, bool UsesPCH) {
|
||||
if (InitializePreprocessor(*PP, InitializeSourceMgr, InFile, UsesPCH))
|
||||
return true;
|
||||
}
|
||||
|
||||
/// FIXME: PP can only handle one callback
|
||||
if (ProgAction != PrintPreprocessedInput) {
|
||||
|
@ -2097,7 +2101,7 @@ static void ProcessInputFile(Preprocessor &PP, PreprocessorFactory &PPF,
|
|||
// than earlier) because this initialization creates new source
|
||||
// location entries in the source manager, which must come after
|
||||
// the source location entries for the PCH file.
|
||||
if (PPF.FinishInitialization(&PP))
|
||||
if (PPF.FinishInitialization(&PP, true /*uses PCH*/))
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2308,7 +2312,7 @@ int main(int argc, char **argv) {
|
|||
continue;
|
||||
|
||||
if (ImplicitIncludePCH.empty()
|
||||
&& PPFactory.FinishInitialization(PP.get()))
|
||||
&& PPFactory.FinishInitialization(PP.get(), false))
|
||||
continue;
|
||||
|
||||
// Create the HTMLDiagnosticsClient if we are using one. Otherwise,
|
||||
|
|
Loading…
Reference in New Issue