[preprocessing record] Have the MacroDefinitions map point to the MacroDefinition object instead

its index in the preprocessed entities vector.

This is because the order of the entities in the vector can change in some (uncommon) cases.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175907 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Argyrios Kyrtzidis 2013-02-22 18:35:59 +00:00
Родитель f512acee01
Коммит 0b849d34b3
4 изменённых файлов: 21 добавлений и 13 удалений

Просмотреть файл

@ -325,7 +325,7 @@ namespace clang {
}
/// \brief Mapping from MacroInfo structures to their definitions.
llvm::DenseMap<const MacroInfo *, PPEntityID> MacroDefinitions;
llvm::DenseMap<const MacroInfo *, MacroDefinition *> MacroDefinitions;
/// \brief External source of preprocessed entities.
ExternalPreprocessingRecordSource *ExternalSource;
@ -356,7 +356,7 @@ namespace clang {
unsigned allocateLoadedEntities(unsigned NumEntities);
/// \brief Register a new macro definition.
void RegisterMacroDefinition(MacroInfo *Macro, PPEntityID PPID);
void RegisterMacroDefinition(MacroInfo *Macro, MacroDefinition *Def);
public:
/// \brief Construct a new preprocessing record.

Просмотреть файл

@ -320,8 +320,8 @@ unsigned PreprocessingRecord::allocateLoadedEntities(unsigned NumEntities) {
}
void PreprocessingRecord::RegisterMacroDefinition(MacroInfo *Macro,
PPEntityID PPID) {
MacroDefinitions[Macro] = PPID;
MacroDefinition *Def) {
MacroDefinitions[Macro] = Def;
}
/// \brief Retrieve the preprocessed entity at the given ID.
@ -358,15 +358,12 @@ PreprocessingRecord::getLoadedPreprocessedEntity(unsigned Index) {
}
MacroDefinition *PreprocessingRecord::findMacroDefinition(const MacroInfo *MI) {
llvm::DenseMap<const MacroInfo *, PPEntityID>::iterator Pos
llvm::DenseMap<const MacroInfo *, MacroDefinition *>::iterator Pos
= MacroDefinitions.find(MI);
if (Pos == MacroDefinitions.end())
return 0;
PreprocessedEntity *Entity = getPreprocessedEntity(Pos->second);
if (Entity->isInvalid())
return 0;
return cast<MacroDefinition>(Entity);
return Pos->second;
}
void PreprocessingRecord::addMacroExpansion(const Token &Id,
@ -415,7 +412,8 @@ void PreprocessingRecord::MacroDefined(const Token &Id,
SourceRange R(MI->getDefinitionLoc(), MI->getDefinitionEndLoc());
MacroDefinition *Def
= new (*this) MacroDefinition(Id.getIdentifierInfo(), R);
MacroDefinitions[MI] = addPreprocessedEntity(Def);
addPreprocessedEntity(Def);
MacroDefinitions[MI] = Def;
}
void PreprocessingRecord::MacroUndefined(const Token &Id,

Просмотреть файл

@ -1249,8 +1249,12 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset,
PreprocessedEntityID
GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
PPRec.RegisterMacroDefinition(Macro,
PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true));
PreprocessingRecord::PPEntityID
PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
MacroDefinition *PPDef =
cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
if (PPDef)
PPRec.RegisterMacroDefinition(Macro, PPDef);
}
++NumMacrosRead;

Просмотреть файл

@ -26,3 +26,9 @@ FNM(
#define M2 int
#define FM2(x,y) y x
FM2(M1, M2);
#define FM3(x) x
FM3(
#define M3 int x2
)
M3;