forked from OSchip/llvm-project
Modules: Return ModuleFile& from ModuleManager::begin, etc.; NFC
Hide the pointer indirection in ModuleManager::begin, ModuleManager::end, ModuleManager::rbegin, and ModuleManager::rend. Besides tidying up the call sites, this is preparation for making ownership of ModuleFile explicit. llvm-svn: 293394
This commit is contained in:
parent
14afc8e7b8
commit
96a06e0ec0
|
@ -1633,7 +1633,7 @@ public:
|
|||
unsigned Result = 0;
|
||||
for (ModuleConstIterator I = ModuleMgr.begin(),
|
||||
E = ModuleMgr.end(); I != E; ++I) {
|
||||
Result += (*I)->NumPreprocessedEntities;
|
||||
Result += I->NumPreprocessedEntities;
|
||||
}
|
||||
|
||||
return Result;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "clang/Serialization/Module.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/iterator.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
|
@ -111,9 +112,13 @@ class ModuleManager {
|
|||
void returnVisitState(VisitState *State);
|
||||
|
||||
public:
|
||||
typedef SmallVectorImpl<ModuleFile*>::iterator ModuleIterator;
|
||||
typedef SmallVectorImpl<ModuleFile*>::const_iterator ModuleConstIterator;
|
||||
typedef SmallVectorImpl<ModuleFile*>::reverse_iterator ModuleReverseIterator;
|
||||
typedef llvm::pointee_iterator<SmallVectorImpl<ModuleFile *>::iterator>
|
||||
ModuleIterator;
|
||||
typedef llvm::pointee_iterator<SmallVectorImpl<ModuleFile *>::const_iterator>
|
||||
ModuleConstIterator;
|
||||
typedef llvm::pointee_iterator<
|
||||
SmallVectorImpl<ModuleFile *>::reverse_iterator>
|
||||
ModuleReverseIterator;
|
||||
typedef std::pair<uint32_t, StringRef> ModuleOffset;
|
||||
|
||||
explicit ModuleManager(FileManager &FileMgr,
|
||||
|
@ -136,7 +141,8 @@ public:
|
|||
ModuleReverseIterator rend() { return Chain.rend(); }
|
||||
|
||||
/// \brief A range covering the PCH and preamble module files loaded.
|
||||
llvm::iterator_range<ModuleConstIterator> pch_modules() const {
|
||||
llvm::iterator_range<SmallVectorImpl<ModuleFile *>::const_iterator>
|
||||
pch_modules() const {
|
||||
return llvm::make_range(PCHChain.begin(), PCHChain.end());
|
||||
}
|
||||
|
||||
|
|
|
@ -482,7 +482,7 @@ bool PCHValidator::ReadDiagnosticOptions(
|
|||
// Note: ModuleMgr.rbegin() may not be the current module, but it must be in
|
||||
// the transitive closure of its imports, since unrelated modules cannot be
|
||||
// imported until after this module finishes validation.
|
||||
ModuleFile *TopImport = *ModuleMgr.rbegin();
|
||||
ModuleFile *TopImport = &*ModuleMgr.rbegin();
|
||||
while (!TopImport->ImportedBy.empty())
|
||||
TopImport = TopImport->ImportedBy[0];
|
||||
if (TopImport->Kind != MK_ImplicitModule)
|
||||
|
@ -1713,15 +1713,15 @@ void ASTReader::ReadDefinedMacros() {
|
|||
// Note that we are loading defined macros.
|
||||
Deserializing Macros(this);
|
||||
|
||||
for (auto &I : llvm::reverse(ModuleMgr)) {
|
||||
BitstreamCursor &MacroCursor = I->MacroCursor;
|
||||
for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
|
||||
BitstreamCursor &MacroCursor = I.MacroCursor;
|
||||
|
||||
// If there was no preprocessor block, skip this file.
|
||||
if (MacroCursor.getBitcodeBytes().empty())
|
||||
continue;
|
||||
|
||||
BitstreamCursor Cursor = MacroCursor;
|
||||
Cursor.JumpToBit(I->MacroStartOffset);
|
||||
Cursor.JumpToBit(I.MacroStartOffset);
|
||||
|
||||
RecordData Record;
|
||||
while (true) {
|
||||
|
@ -1743,7 +1743,7 @@ void ASTReader::ReadDefinedMacros() {
|
|||
|
||||
case PP_MACRO_OBJECT_LIKE:
|
||||
case PP_MACRO_FUNCTION_LIKE: {
|
||||
IdentifierInfo *II = getLocalIdentifier(*I, Record[0]);
|
||||
IdentifierInfo *II = getLocalIdentifier(I, Record[0]);
|
||||
if (II->isOutOfDate())
|
||||
updateOutOfDateIdentifier(*II);
|
||||
break;
|
||||
|
@ -3351,8 +3351,7 @@ ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
|
|||
// usable header search context.
|
||||
assert(!F.ModuleName.empty() &&
|
||||
"MODULE_NAME should come before MODULE_MAP_FILE");
|
||||
if (F.Kind == MK_ImplicitModule &&
|
||||
(*ModuleMgr.begin())->Kind != MK_MainFile) {
|
||||
if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
|
||||
// An implicitly-loaded module file should have its module listed in some
|
||||
// module map file that we've already loaded.
|
||||
Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
|
||||
|
@ -5300,8 +5299,7 @@ void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
|
|||
using DiagState = DiagnosticsEngine::DiagState;
|
||||
SmallVector<DiagState *, 32> DiagStates;
|
||||
|
||||
for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
|
||||
ModuleFile &F = *(*I);
|
||||
for (ModuleFile &F : ModuleMgr) {
|
||||
unsigned Idx = 0;
|
||||
auto &Record = F.PragmaDiagMappings;
|
||||
if (Record.empty())
|
||||
|
@ -7150,18 +7148,15 @@ LLVM_DUMP_METHOD void ASTReader::dump() {
|
|||
GlobalPreprocessedEntityMap);
|
||||
|
||||
llvm::errs() << "\n*** PCH/Modules Loaded:";
|
||||
for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
|
||||
MEnd = ModuleMgr.end();
|
||||
M != MEnd; ++M)
|
||||
(*M)->dump();
|
||||
for (ModuleFile &M : ModuleMgr)
|
||||
M.dump();
|
||||
}
|
||||
|
||||
/// Return the amount of memory used by memory buffers, breaking down
|
||||
/// by heap-backed versus mmap'ed memory.
|
||||
void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
|
||||
for (ModuleConstIterator I = ModuleMgr.begin(),
|
||||
E = ModuleMgr.end(); I != E; ++I) {
|
||||
if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
|
||||
for (ModuleFile &I : ModuleMgr) {
|
||||
if (llvm::MemoryBuffer *buf = I.Buffer.get()) {
|
||||
size_t bytes = buf->getBufferSize();
|
||||
switch (buf->getBufferKind()) {
|
||||
case llvm::MemoryBuffer::MemoryBuffer_Malloc:
|
||||
|
|
|
@ -1435,17 +1435,17 @@ uint64_t ASTWriter::WriteControlBlock(Preprocessor &PP,
|
|||
serialization::ModuleManager &Mgr = Chain->getModuleManager();
|
||||
Record.clear();
|
||||
|
||||
for (auto *M : Mgr) {
|
||||
for (ModuleFile &M : Mgr) {
|
||||
// Skip modules that weren't directly imported.
|
||||
if (!M->isDirectlyImported())
|
||||
if (!M.isDirectlyImported())
|
||||
continue;
|
||||
|
||||
Record.push_back((unsigned)M->Kind); // FIXME: Stable encoding
|
||||
AddSourceLocation(M->ImportLoc, Record);
|
||||
Record.push_back(M->File->getSize());
|
||||
Record.push_back(getTimestampForOutput(M->File));
|
||||
Record.push_back(M->Signature);
|
||||
AddPath(M->FileName, Record);
|
||||
Record.push_back((unsigned)M.Kind); // FIXME: Stable encoding
|
||||
AddSourceLocation(M.ImportLoc, Record);
|
||||
Record.push_back(M.File->getSize());
|
||||
Record.push_back(getTimestampForOutput(M.File));
|
||||
Record.push_back(M.Signature);
|
||||
AddPath(M.FileName, Record);
|
||||
}
|
||||
Stream.EmitRecord(IMPORTS, Record);
|
||||
}
|
||||
|
@ -4605,10 +4605,10 @@ uint64_t ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot,
|
|||
SmallString<2048> Buffer;
|
||||
{
|
||||
llvm::raw_svector_ostream Out(Buffer);
|
||||
for (ModuleFile *M : Chain->ModuleMgr) {
|
||||
for (ModuleFile &M : Chain->ModuleMgr) {
|
||||
using namespace llvm::support;
|
||||
endian::Writer<little> LE(Out);
|
||||
StringRef FileName = M->FileName;
|
||||
StringRef FileName = M.FileName;
|
||||
LE.write<uint16_t>(FileName.size());
|
||||
Out.write(FileName.data(), FileName.size());
|
||||
|
||||
|
@ -4626,15 +4626,15 @@ uint64_t ASTWriter::WriteASTCore(Sema &SemaRef, StringRef isysroot,
|
|||
|
||||
// These values should be unique within a chain, since they will be read
|
||||
// as keys into ContinuousRangeMaps.
|
||||
writeBaseIDOrNone(M->SLocEntryBaseOffset, M->LocalNumSLocEntries);
|
||||
writeBaseIDOrNone(M->BaseIdentifierID, M->LocalNumIdentifiers);
|
||||
writeBaseIDOrNone(M->BaseMacroID, M->LocalNumMacros);
|
||||
writeBaseIDOrNone(M->BasePreprocessedEntityID,
|
||||
M->NumPreprocessedEntities);
|
||||
writeBaseIDOrNone(M->BaseSubmoduleID, M->LocalNumSubmodules);
|
||||
writeBaseIDOrNone(M->BaseSelectorID, M->LocalNumSelectors);
|
||||
writeBaseIDOrNone(M->BaseDeclID, M->LocalNumDecls);
|
||||
writeBaseIDOrNone(M->BaseTypeIndex, M->LocalNumTypes);
|
||||
writeBaseIDOrNone(M.SLocEntryBaseOffset, M.LocalNumSLocEntries);
|
||||
writeBaseIDOrNone(M.BaseIdentifierID, M.LocalNumIdentifiers);
|
||||
writeBaseIDOrNone(M.BaseMacroID, M.LocalNumMacros);
|
||||
writeBaseIDOrNone(M.BasePreprocessedEntityID,
|
||||
M.NumPreprocessedEntities);
|
||||
writeBaseIDOrNone(M.BaseSubmoduleID, M.LocalNumSubmodules);
|
||||
writeBaseIDOrNone(M.BaseSelectorID, M.LocalNumSelectors);
|
||||
writeBaseIDOrNone(M.BaseDeclID, M.LocalNumDecls);
|
||||
writeBaseIDOrNone(M.BaseTypeIndex, M.LocalNumTypes);
|
||||
}
|
||||
}
|
||||
RecordData::value_type Record[] = {MODULE_OFFSET_MAP};
|
||||
|
|
|
@ -195,7 +195,9 @@ void ModuleManager::removeModules(
|
|||
VisitOrder.clear();
|
||||
|
||||
// Collect the set of module file pointers that we'll be removing.
|
||||
llvm::SmallPtrSet<ModuleFile *, 4> victimSet(first, last);
|
||||
llvm::SmallPtrSet<ModuleFile *, 4> victimSet(
|
||||
(llvm::pointer_iterator<ModuleIterator>(first)),
|
||||
(llvm::pointer_iterator<ModuleIterator>(last)));
|
||||
|
||||
auto IsVictim = [&](ModuleFile *MF) {
|
||||
return victimSet.count(MF);
|
||||
|
@ -209,8 +211,8 @@ void ModuleManager::removeModules(
|
|||
|
||||
// Remove the modules from the PCH chain.
|
||||
for (auto I = first; I != last; ++I) {
|
||||
if (!(*I)->isModule()) {
|
||||
PCHChain.erase(std::find(PCHChain.begin(), PCHChain.end(), *I),
|
||||
if (!I->isModule()) {
|
||||
PCHChain.erase(std::find(PCHChain.begin(), PCHChain.end(), &*I),
|
||||
PCHChain.end());
|
||||
break;
|
||||
}
|
||||
|
@ -218,10 +220,10 @@ void ModuleManager::removeModules(
|
|||
|
||||
// Delete the modules and erase them from the various structures.
|
||||
for (ModuleIterator victim = first; victim != last; ++victim) {
|
||||
Modules.erase((*victim)->File);
|
||||
Modules.erase(victim->File);
|
||||
|
||||
if (modMap) {
|
||||
StringRef ModuleName = (*victim)->ModuleName;
|
||||
StringRef ModuleName = victim->ModuleName;
|
||||
if (Module *mod = modMap->findModule(ModuleName)) {
|
||||
mod->setASTFile(nullptr);
|
||||
}
|
||||
|
@ -230,14 +232,15 @@ void ModuleManager::removeModules(
|
|||
// Files that didn't make it through ReadASTCore successfully will be
|
||||
// rebuilt (or there was an error). Invalidate them so that we can load the
|
||||
// new files that will be renamed over the old ones.
|
||||
if (LoadedSuccessfully.count(*victim) == 0)
|
||||
FileMgr.invalidateCache((*victim)->File);
|
||||
if (LoadedSuccessfully.count(&*victim) == 0)
|
||||
FileMgr.invalidateCache(victim->File);
|
||||
|
||||
delete *victim;
|
||||
delete &*victim;
|
||||
}
|
||||
|
||||
// Remove the modules from the chain.
|
||||
Chain.erase(first, last);
|
||||
Chain.erase(Chain.begin() + (first - begin()),
|
||||
Chain.begin() + (last - begin()));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -317,11 +320,11 @@ void ModuleManager::visit(llvm::function_ref<bool(ModuleFile &M)> Visitor,
|
|||
Queue.reserve(N);
|
||||
llvm::SmallVector<unsigned, 4> UnusedIncomingEdges;
|
||||
UnusedIncomingEdges.resize(size());
|
||||
for (ModuleFile *M : llvm::reverse(*this)) {
|
||||
unsigned Size = M->ImportedBy.size();
|
||||
UnusedIncomingEdges[M->Index] = Size;
|
||||
for (ModuleFile &M : llvm::reverse(*this)) {
|
||||
unsigned Size = M.ImportedBy.size();
|
||||
UnusedIncomingEdges[M.Index] = Size;
|
||||
if (!Size)
|
||||
Queue.push_back(M);
|
||||
Queue.push_back(&M);
|
||||
}
|
||||
|
||||
// Traverse the graph, making sure to visit a module before visiting any
|
||||
|
@ -436,7 +439,7 @@ namespace llvm {
|
|||
struct GraphTraits<ModuleManager> {
|
||||
typedef ModuleFile *NodeRef;
|
||||
typedef llvm::SetVector<ModuleFile *>::const_iterator ChildIteratorType;
|
||||
typedef ModuleManager::ModuleConstIterator nodes_iterator;
|
||||
typedef pointer_iterator<ModuleManager::ModuleConstIterator> nodes_iterator;
|
||||
|
||||
static ChildIteratorType child_begin(NodeRef Node) {
|
||||
return Node->Imports.begin();
|
||||
|
@ -447,11 +450,11 @@ namespace llvm {
|
|||
}
|
||||
|
||||
static nodes_iterator nodes_begin(const ModuleManager &Manager) {
|
||||
return Manager.begin();
|
||||
return nodes_iterator(Manager.begin());
|
||||
}
|
||||
|
||||
static nodes_iterator nodes_end(const ModuleManager &Manager) {
|
||||
return Manager.end();
|
||||
return nodes_iterator(Manager.end());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue