mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-04 00:06:50 +00:00
[modules] When a MacroInfo object is deserialized, allocate and store its submodule ID.
llvm-svn: 177760
This commit is contained in:
parent
ad900f9c85
commit
4f32da1ef5
@ -101,6 +101,9 @@ private:
|
||||
/// \brief Must warn if the macro is unused at the end of translation unit.
|
||||
bool IsWarnIfUnused : 1;
|
||||
|
||||
/// \brief Whether this macro info was loaded from an AST file.
|
||||
unsigned FromASTFile : 1;
|
||||
|
||||
~MacroInfo() {
|
||||
assert(ArgumentList == 0 && "Didn't call destroy before dtor!");
|
||||
}
|
||||
@ -272,8 +275,28 @@ public:
|
||||
IsDisabled = true;
|
||||
}
|
||||
|
||||
/// \brief Determine whether this macro info came from an AST file (such as
|
||||
/// a precompiled header or module) rather than having been parsed.
|
||||
bool isFromASTFile() const { return FromASTFile; }
|
||||
|
||||
/// \brief Retrieve the global ID of the module that owns this particular
|
||||
/// macro info.
|
||||
unsigned getOwningModuleID() const {
|
||||
if (isFromASTFile())
|
||||
return *(const unsigned*)(this+1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned getDefinitionLengthSlow(SourceManager &SM) const;
|
||||
|
||||
void setOwningModuleID(unsigned ID) {
|
||||
assert(isFromASTFile());
|
||||
*(unsigned*)(this+1) = ID;
|
||||
}
|
||||
|
||||
friend class Preprocessor;
|
||||
};
|
||||
|
||||
/// \brief Encapsulates changes to the "macros namespace" (the location where
|
||||
|
@ -1208,6 +1208,10 @@ public:
|
||||
/// \brief Allocate a new MacroInfo object with the provided SourceLocation.
|
||||
MacroInfo *AllocateMacroInfo(SourceLocation L);
|
||||
|
||||
/// \brief Allocate a new MacroInfo object loaded from an AST file.
|
||||
MacroInfo *AllocateDeserializedMacroInfo(SourceLocation L,
|
||||
unsigned SubModuleID);
|
||||
|
||||
/// \brief Turn the specified lexer token into a fully checked and spelled
|
||||
/// filename, e.g. as an operand of \#include.
|
||||
///
|
||||
|
@ -28,7 +28,8 @@ MacroInfo::MacroInfo(SourceLocation DefLoc)
|
||||
IsDisabled(false),
|
||||
IsUsed(false),
|
||||
IsAllowRedefinitionsWithoutWarning(false),
|
||||
IsWarnIfUnused(false) {
|
||||
IsWarnIfUnused(false),
|
||||
FromASTFile(false) {
|
||||
}
|
||||
|
||||
unsigned MacroInfo::getDefinitionLengthSlow(SourceManager &SM) const {
|
||||
|
@ -57,6 +57,19 @@ MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {
|
||||
return MI;
|
||||
}
|
||||
|
||||
MacroInfo *Preprocessor::AllocateDeserializedMacroInfo(SourceLocation L,
|
||||
unsigned SubModuleID) {
|
||||
LLVM_STATIC_ASSERT(llvm::AlignOf<MacroInfo>::Alignment >= sizeof(SubModuleID),
|
||||
"alignment for MacroInfo is less than the ID");
|
||||
MacroInfo *MI =
|
||||
(MacroInfo*)BP.Allocate(sizeof(MacroInfo) + sizeof(SubModuleID),
|
||||
llvm::AlignOf<MacroInfo>::Alignment);
|
||||
new (MI) MacroInfo(L);
|
||||
MI->FromASTFile = true;
|
||||
MI->setOwningModuleID(SubModuleID);
|
||||
return MI;
|
||||
}
|
||||
|
||||
MacroDirective *Preprocessor::AllocateMacroDirective(MacroInfo *MI,
|
||||
SourceLocation Loc,
|
||||
bool isImported) {
|
||||
|
@ -1151,7 +1151,7 @@ void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset,
|
||||
SubmoduleID GlobalSubmoduleID = getGlobalSubmoduleID(F, Record[2]);
|
||||
unsigned NextIndex = 3;
|
||||
SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
|
||||
MacroInfo *MI = PP.AllocateMacroInfo(Loc);
|
||||
MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, GlobalSubmoduleID);
|
||||
// FIXME: Location should be import location in case of module.
|
||||
MacroDirective *MD = PP.AllocateMacroDirective(MI, Loc,
|
||||
/*isImported=*/true);
|
||||
|
Loading…
x
Reference in New Issue
Block a user