[cfe-commits] r136902 - in /cfe/trunk: include/clang/Serialization/ASTBitCodes.h include/clang/Serialization/ASTReader.h include/clang/Serialization/ContinuousRangeMap.h lib/Serialization/ASTReader.cpp lib/Serialization/ASTWriter.cpp
Douglas Gregor
dgregor at apple.com
Thu Aug 4 11:56:47 PDT 2011
Author: dgregor
Date: Thu Aug 4 13:56:47 2011
New Revision: 136902
URL: http://llvm.org/viewvc/llvm-project?rev=136902&view=rev
Log:
Introduce local -> global mapping for preprocessed entity IDs. This is
the last of the ID/offset/index mappings that I know
of. Unfortunately, the "gap" method of testing doesn't work here due
to the way the preprocessing record performs iteration. We'll do more
testing once multi-AST loading is possible.
Modified:
cfe/trunk/include/clang/Serialization/ASTBitCodes.h
cfe/trunk/include/clang/Serialization/ASTReader.h
cfe/trunk/include/clang/Serialization/ContinuousRangeMap.h
cfe/trunk/lib/Serialization/ASTReader.cpp
cfe/trunk/lib/Serialization/ASTWriter.cpp
Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=136902&r1=136901&r2=136902&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Thu Aug 4 13:56:47 2011
@@ -141,7 +141,10 @@
/// \brief An ID number that refers to an entity in the detailed
/// preprocessing record.
typedef uint32_t PreprocessedEntityID;
-
+
+ /// \brief The number of predefined preprocessed entity IDs.
+ const unsigned int NUM_PREDEF_PP_ENTITY_IDS = 1;
+
/// \brief Describes the various kinds of blocks that occur within
/// an AST file.
enum BlockIDs {
Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=136902&r1=136901&r2=136902&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTReader.h Thu Aug 4 13:56:47 2011
@@ -290,6 +290,9 @@
/// this module.
serialization::PreprocessedEntityID BasePreprocessedEntityID;
+ /// \brief Remapping table for preprocessed entity IDs in this module.
+ ContinuousRangeMap<uint32_t, int, 2> PreprocessedEntityRemap;
+
/// \brief The number of macro definitions in this file.
unsigned LocalNumMacroDefinitions;
Modified: cfe/trunk/include/clang/Serialization/ContinuousRangeMap.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ContinuousRangeMap.h?rev=136902&r1=136901&r2=136902&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ContinuousRangeMap.h (original)
+++ cfe/trunk/include/clang/Serialization/ContinuousRangeMap.h Thu Aug 4 13:56:47 2011
@@ -61,6 +61,9 @@
public:
void insert(const value_type &Val) {
+ if (!Rep.empty() && Rep.back() == Val)
+ return;
+
assert((Rep.empty() || Rep.back().first < Val.first) &&
"Must insert keys in order.");
Rep.push_back(Val);
Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=136902&r1=136901&r2=136902&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Thu Aug 4 13:56:47 2011
@@ -1643,8 +1643,12 @@
PreprocessedEntityID
ASTReader::getGlobalPreprocessedEntityID(Module &M, unsigned LocalID) {
- // FIXME: Local-to-global mapping
- return LocalID;
+ ContinuousRangeMap<uint32_t, int, 2>::iterator
+ I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
+ assert(I != M.PreprocessedEntityRemap.end()
+ && "Invalid index into preprocessed entity index remap");
+
+ return LocalID + I->second;
}
namespace {
@@ -2323,6 +2327,8 @@
ContinuousRangeMap<uint32_t, int, 2>::Builder
IdentifierRemap(F.IdentifierRemap);
ContinuousRangeMap<uint32_t, int, 2>::Builder
+ PreprocessedEntityRemap(F.PreprocessedEntityRemap);
+ ContinuousRangeMap<uint32_t, int, 2>::Builder
MacroDefinitionRemap(F.MacroDefinitionRemap);
ContinuousRangeMap<uint32_t, int, 2>::Builder
SelectorRemap(F.SelectorRemap);
@@ -2350,12 +2356,12 @@
// Source location offset is mapped to OM->SLocEntryBaseOffset.
SLocRemap.insert(std::make_pair(SLocOffset,
static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset)));
-
- // FIXME: Map other locations
IdentifierRemap.insert(
std::make_pair(IdentifierIDOffset,
OM->BaseIdentifierID - IdentifierIDOffset));
- (void)PreprocessedEntityIDOffset;
+ PreprocessedEntityRemap.insert(
+ std::make_pair(PreprocessedEntityIDOffset,
+ OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset));
MacroDefinitionRemap.insert(
std::make_pair(MacroDefinitionIDOffset,
OM->BaseMacroDefinitionID - MacroDefinitionIDOffset));
@@ -2485,11 +2491,10 @@
case MACRO_DEFINITION_OFFSETS: {
F.MacroDefinitionOffsets = (const uint32_t *)BlobStart;
F.NumPreallocatedPreprocessingEntities = Record[0];
- F.LocalNumMacroDefinitions = Record[1];
- unsigned LocalBaseMacroID = Record[2];
+ unsigned LocalBasePreprocessedEntityID = Record[1];
+ F.LocalNumMacroDefinitions = Record[2];
+ unsigned LocalBaseMacroID = Record[3];
- // Introduce the global -> local mapping for preprocessed entities within
- // this AST file.
unsigned StartingID;
if (PP) {
if (!PP->getPreprocessingRecord())
@@ -2502,13 +2507,25 @@
} else {
// FIXME: We'll eventually want to kill this path, since it assumes
// a particular allocation strategy in the preprocessing record.
- StartingID = getTotalNumPreprocessedEntities();
+ StartingID = getTotalNumPreprocessedEntities()
+ - F.NumPreallocatedPreprocessingEntities;
}
- GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
-
F.BaseMacroDefinitionID = getTotalNumMacroDefinitions();
F.BasePreprocessedEntityID = StartingID;
+ if (F.NumPreallocatedPreprocessingEntities > 0) {
+ // Introduce the global -> local mapping for preprocessed entities in
+ // this module.
+ GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
+
+ // Introduce the local -> global mapping for preprocessed entities in
+ // this module.
+ F.PreprocessedEntityRemap.insert(
+ std::make_pair(LocalBasePreprocessedEntityID,
+ F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
+ }
+
+
if (F.LocalNumMacroDefinitions > 0) {
// Introduce the global -> local mapping for macro definitions within
// this module.
@@ -5606,8 +5623,13 @@
<< '\n';
dumpLocalRemap("Source location offset map", SLocRemap);
llvm::errs() << " Base identifier ID: " << BaseIdentifierID << '\n'
- << "Number of identifiers: " << LocalNumIdentifiers << '\n';
+ << " Number of identifiers: " << LocalNumIdentifiers << '\n';
dumpLocalRemap("Identifier ID map", IdentifierRemap);
+ llvm::errs() << " Base preprocessed entity ID: " << BasePreprocessedEntityID
+ << '\n'
+ << "Number of preprocessed entities: "
+ << NumPreallocatedPreprocessingEntities << '\n';
+ dumpLocalRemap("Preprocessed entity ID map", PreprocessedEntityRemap);
llvm::errs() << " Base type index: " << BaseTypeIndex << '\n'
<< " Number of types: " << LocalNumTypes << '\n';
dumpLocalRemap("Type index map", TypeRemap);
Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=136902&r1=136901&r2=136902&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Thu Aug 4 13:56:47 2011
@@ -1796,8 +1796,10 @@
InclusionAbbrev = Stream.EmitAbbrev(Abbrev);
}
- unsigned IndexBase = Chain ? PPRec.getNumLoadedPreprocessedEntities() : 0;
- unsigned NextPreprocessorEntityID = IndexBase + 1;
+ unsigned FirstPreprocessorEntityID
+ = (Chain ? PPRec.getNumLoadedPreprocessedEntities() : 0)
+ + NUM_PREDEF_PP_ENTITY_IDS;
+ unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
RecordData Record;
uint64_t BitsInChain = Chain? Chain->TotalModulesSizeInBits : 0;
for (PreprocessingRecord::iterator E = PPRec.begin(Chain),
@@ -1879,6 +1881,7 @@
BitCodeAbbrev *Abbrev = new BitCodeAbbrev();
Abbrev->Add(BitCodeAbbrevOp(MACRO_DEFINITION_OFFSETS));
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of records
+ Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first pp entity
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // # of macro defs
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // first macro def
Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
@@ -1887,6 +1890,7 @@
Record.clear();
Record.push_back(MACRO_DEFINITION_OFFSETS);
Record.push_back(NumPreprocessingRecords);
+ Record.push_back(FirstPreprocessorEntityID - NUM_PREDEF_PP_ENTITY_IDS);
Record.push_back(MacroDefinitionOffsets.size());
Record.push_back(FirstMacroID - NUM_PREDEF_MACRO_IDS);
Stream.EmitRecordWithBlob(MacroDefOffsetAbbrev, Record,
More information about the cfe-commits
mailing list