diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-11-15 18:57:22 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-11-15 18:57:22 +0000 |
commit | 958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286 (patch) | |
tree | 06acea85709186f96a465759b27b9f59526820a3 | |
parent | b164af6ae6f2338cc8e685740960715858bfa134 (diff) |
[modules] Setup the import location of a module file and use it
as the include location of the main file of an imported module.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@168061 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Serialization/ASTReader.h | 21 | ||||
-rw-r--r-- | include/clang/Serialization/Module.h | 1 | ||||
-rw-r--r-- | lib/Frontend/ASTUnit.cpp | 2 | ||||
-rw-r--r-- | lib/Frontend/ChainedIncludesSource.cpp | 2 | ||||
-rw-r--r-- | lib/Frontend/CompilerInstance.cpp | 5 | ||||
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 38 | ||||
-rw-r--r-- | lib/Serialization/ASTWriter.cpp | 2 |
7 files changed, 54 insertions, 17 deletions
diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index e23ea5cca7..14550baf8d 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -895,12 +895,23 @@ private: void MaybeAddSystemRootToFilename(ModuleFile &M, std::string &Filename); + struct ImportedModule { + ModuleFile *Mod; + ModuleFile *ImportedBy; + SourceLocation ImportLoc; + + ImportedModule(ModuleFile *Mod, + ModuleFile *ImportedBy, + SourceLocation ImportLoc) + : Mod(Mod), ImportedBy(ImportedBy), ImportLoc(ImportLoc) { } + }; + ASTReadResult ReadASTCore(StringRef FileName, ModuleKind Type, - ModuleFile *ImportedBy, - llvm::SmallVectorImpl<ModuleFile *> &Loaded, + SourceLocation ImportLoc, ModuleFile *ImportedBy, + llvm::SmallVectorImpl<ImportedModule> &Loaded, unsigned ClientLoadCapabilities); ASTReadResult ReadControlBlock(ModuleFile &F, - llvm::SmallVectorImpl<ModuleFile *> &Loaded, + llvm::SmallVectorImpl<ImportedModule> &Loaded, unsigned ClientLoadCapabilities); bool ReadASTBlock(ModuleFile &F); bool ParseLineTable(ModuleFile &F, SmallVectorImpl<uint64_t> &Record); @@ -1100,10 +1111,14 @@ public: /// \param Type The kind of AST being loaded, e.g., PCH, module, main file, /// or preamble. /// + /// \param ImportLoc the location where the module file will be considered as + /// imported from. For non-module AST types it should be invalid. + /// /// \param ClientLoadCapabilities The set of client load-failure /// capabilities, represented as a bitset of the enumerators of /// LoadFailureCapabilities. ASTReadResult ReadAST(const std::string &FileName, ModuleKind Type, + SourceLocation ImportLoc, unsigned ClientLoadCapabilities); /// \brief Make the entities in the given module and any of its (non-explicit) diff --git a/include/clang/Serialization/Module.h b/include/clang/Serialization/Module.h index 39fa3d90ce..45e006a2f3 100644 --- a/include/clang/Serialization/Module.h +++ b/include/clang/Serialization/Module.h @@ -122,7 +122,6 @@ public: llvm::BitstreamCursor Stream; /// \brief The source location where this module was first imported. - /// FIXME: This is not properly initialized yet. SourceLocation ImportLoc; /// \brief The first source location in this module. diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index bc29c66bba..553fb21a68 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -791,7 +791,7 @@ ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, Counter)); switch (Reader->ReadAST(Filename, serialization::MK_MainFile, - ASTReader::ARR_None)) { + SourceLocation(), ASTReader::ARR_None)) { case ASTReader::Success: break; diff --git a/lib/Frontend/ChainedIncludesSource.cpp b/lib/Frontend/ChainedIncludesSource.cpp index 2d586400ec..94d950f189 100644 --- a/lib/Frontend/ChainedIncludesSource.cpp +++ b/lib/Frontend/ChainedIncludesSource.cpp @@ -39,7 +39,7 @@ static ASTReader *createASTReader(CompilerInstance &CI, Reader->addInMemoryBuffer(sr, memBufs[ti]); } Reader->setDeserializationListener(deserialListener); - switch (Reader->ReadAST(pchFile, serialization::MK_PCH, + switch (Reader->ReadAST(pchFile, serialization::MK_PCH, SourceLocation(), ASTReader::ARR_None)) { case ASTReader::Success: // Set the predefines buffer as suggested by the PCH reader. diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 22a74fcc35..8282a9c9c3 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -342,6 +342,7 @@ CompilerInstance::createPCHExternalASTSource(StringRef Path, switch (Reader->ReadAST(Path, Preamble ? serialization::MK_Preamble : serialization::MK_PCH, + SourceLocation(), ASTReader::ARR_None)) { case ASTReader::Success: // Set the predefines buffer as suggested by the PCH reader. Typically, the @@ -989,7 +990,7 @@ Module *CompilerInstance::loadModule(SourceLocation ImportLoc, if (Module) ARRFlags |= ASTReader::ARR_OutOfDate; switch (ModuleManager->ReadAST(ModuleFile->getName(), - serialization::MK_Module, + serialization::MK_Module, ImportLoc, ARRFlags)) { case ASTReader::Success: break; @@ -1005,7 +1006,7 @@ Module *CompilerInstance::loadModule(SourceLocation ImportLoc, ModuleFile = FileMgr->getFile(ModuleFileName); if (!ModuleFile || ModuleManager->ReadAST(ModuleFileName, - serialization::MK_Module, + serialization::MK_Module, ImportLoc, ASTReader::ARR_None) != ASTReader::Success) { KnownModules[Path[0].first] = 0; return 0; diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index f64962e341..cd15e212dd 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -964,6 +964,9 @@ bool ASTReader::ReadSLocEntry(int ID) { SrcMgr::CharacteristicKind FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); + if (IncludeLoc.isInvalid() && F->Kind == MK_Module) { + IncludeLoc = getImportLocation(F); + } unsigned Code = SLocEntryCursor.ReadCode(); Record.clear(); unsigned RecCode @@ -1611,7 +1614,7 @@ void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M, ASTReader::ASTReadResult ASTReader::ReadControlBlock(ModuleFile &F, - llvm::SmallVectorImpl<ModuleFile *> &Loaded, + llvm::SmallVectorImpl<ImportedModule> &Loaded, unsigned ClientLoadCapabilities) { llvm::BitstreamCursor &Stream = F.Stream; @@ -1706,13 +1709,18 @@ ASTReader::ReadControlBlock(ModuleFile &F, while (Idx < N) { // Read information about the AST file. ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; + // The import location will be the local one for now; we will adjust + // all import locations of module imports after the global source + // location info are setup. + SourceLocation ImportLoc = + SourceLocation::getFromRawEncoding(Record[Idx++]); unsigned Length = Record[Idx++]; SmallString<128> ImportedFile(Record.begin() + Idx, Record.begin() + Idx + Length); Idx += Length; // Load the AST file. - switch(ReadASTCore(ImportedFile, ImportedKind, &F, Loaded, + switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded, ClientLoadCapabilities)) { case Failure: return Failure; // If we have to ignore the dependency, we'll have to ignore this too. @@ -2675,13 +2683,14 @@ void ASTReader::makeModuleVisible(Module *Mod, ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, ModuleKind Type, + SourceLocation ImportLoc, unsigned ClientLoadCapabilities) { // Bump the generation number. unsigned PreviousGeneration = CurrentGeneration++; unsigned NumModules = ModuleMgr.size(); - llvm::SmallVector<ModuleFile *, 4> Loaded; - switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, + llvm::SmallVector<ImportedModule, 4> Loaded; + switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc, /*ImportedBy=*/0, Loaded, ClientLoadCapabilities)) { case Failure: @@ -2699,10 +2708,10 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, // Here comes stuff that we only do once the entire chain is loaded. // Load the AST blocks of all of the modules that we loaded. - for (llvm::SmallVectorImpl<ModuleFile *>::iterator M = Loaded.begin(), + for (llvm::SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), MEnd = Loaded.end(); M != MEnd; ++M) { - ModuleFile &F = **M; + ModuleFile &F = *M->Mod; // Read the AST block. if (ReadASTBlock(F)) @@ -2725,6 +2734,18 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, } } + // Setup the import locations. + for (llvm::SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), + MEnd = Loaded.end(); + M != MEnd; ++M) { + ModuleFile &F = *M->Mod; + if (!M->ImportedBy) + F.ImportLoc = M->ImportLoc; + else + F.ImportLoc = ReadSourceLocation(*M->ImportedBy, + M->ImportLoc.getRawEncoding()); + } + // Mark all of the identifiers in the identifier table as being out of date, // so that various accessors know to check the loaded modules when the // identifier is used. @@ -2786,8 +2807,9 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, ASTReader::ASTReadResult ASTReader::ReadASTCore(StringRef FileName, ModuleKind Type, + SourceLocation ImportLoc, ModuleFile *ImportedBy, - llvm::SmallVectorImpl<ModuleFile *> &Loaded, + llvm::SmallVectorImpl<ImportedModule> &Loaded, unsigned ClientLoadCapabilities) { ModuleFile *M; bool NewModule; @@ -2861,7 +2883,7 @@ ASTReader::ReadASTCore(StringRef FileName, break; case AST_BLOCK_ID: // Record that we've loaded this module. - Loaded.push_back(M); + Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); return Success; default: diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index a34244d3f3..f06b428019 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -1030,7 +1030,7 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context, continue; Record.push_back((unsigned)(*M)->Kind); // FIXME: Stable encoding - // FIXME: Write import location, once it matters. + AddSourceLocation((*M)->ImportLoc, Record); // FIXME: This writes the absolute path for AST files we depend on. const std::string &FileName = (*M)->FileName; Record.push_back(FileName.size()); |