Author: akirtzidis Date: Mon Jan 30 00:05:58 2017 New Revision: 293461 URL: http://llvm.org/viewvc/llvm-project?rev=293461&view=rev Log: [c-index-test] Provide capability to index module file imports and dump their input files.
This ensures the capability to index a module file using an existing ASTReader from a compiler instance or ASTUnit. Modified: cfe/trunk/include/clang/Frontend/ASTUnit.h cfe/trunk/include/clang/Index/IndexingAction.h cfe/trunk/include/clang/Serialization/ASTReader.h cfe/trunk/include/clang/Serialization/Module.h cfe/trunk/lib/Frontend/ASTUnit.cpp cfe/trunk/lib/Index/IndexingAction.cpp cfe/trunk/lib/Serialization/ASTReader.cpp cfe/trunk/test/Index/Core/index-with-module.m cfe/trunk/tools/c-index-test/core_main.cpp Modified: cfe/trunk/include/clang/Frontend/ASTUnit.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/ASTUnit.h?rev=293461&r1=293460&r2=293461&view=diff ============================================================================== --- cfe/trunk/include/clang/Frontend/ASTUnit.h (original) +++ cfe/trunk/include/clang/Frontend/ASTUnit.h Mon Jan 30 00:05:58 2017 @@ -519,6 +519,8 @@ public: const FileSystemOptions &getFileSystemOpts() const { return FileSystemOpts; } + IntrusiveRefCntPtr<ASTReader> getASTReader() const; + StringRef getOriginalSourceFileName() { return OriginalSourceFile; } Modified: cfe/trunk/include/clang/Index/IndexingAction.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexingAction.h?rev=293461&r1=293460&r2=293461&view=diff ============================================================================== --- cfe/trunk/include/clang/Index/IndexingAction.h (original) +++ cfe/trunk/include/clang/Index/IndexingAction.h Mon Jan 30 00:05:58 2017 @@ -14,9 +14,14 @@ #include <memory> namespace clang { + class ASTReader; class ASTUnit; class FrontendAction; +namespace serialization { + class ModuleFile; +} + namespace index { class IndexDataConsumer; @@ -42,6 +47,11 @@ void indexASTUnit(ASTUnit &Unit, std::shared_ptr<IndexDataConsumer> DataConsumer, IndexingOptions Opts); +void indexModuleFile(serialization::ModuleFile &Mod, + ASTReader &Reader, + std::shared_ptr<IndexDataConsumer> DataConsumer, + IndexingOptions Opts); + } // namespace index } // namespace clang Modified: cfe/trunk/include/clang/Serialization/ASTReader.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=293461&r1=293460&r2=293461&view=diff ============================================================================== --- cfe/trunk/include/clang/Serialization/ASTReader.h (original) +++ cfe/trunk/include/clang/Serialization/ASTReader.h Mon Jan 30 00:05:58 2017 @@ -1270,6 +1270,7 @@ private: llvm::iterator_range<PreprocessingRecord::iterator> getModulePreprocessedEntities(ModuleFile &Mod) const; +public: class ModuleDeclIterator : public llvm::iterator_adaptor_base< ModuleDeclIterator, const serialization::LocalDeclID *, @@ -1300,6 +1301,7 @@ private: llvm::iterator_range<ModuleDeclIterator> getModuleFileLevelDecls(ModuleFile &Mod); +private: void PassInterestingDeclsToConsumer(); void PassInterestingDeclToConsumer(Decl *D); @@ -2192,6 +2194,12 @@ public: /// \brief Loads comments ranges. void ReadComments() override; + /// Visit all the input files of the given module file. + void visitInputFiles(serialization::ModuleFile &MF, + bool IncludeSystem, bool Complain, + llvm::function_ref<void(const serialization::InputFile &IF, + bool isSystem)> Visitor); + bool isProcessingUpdateRecords() { return ProcessingUpdateRecords; } }; Modified: cfe/trunk/include/clang/Serialization/Module.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/Module.h?rev=293461&r1=293460&r2=293461&view=diff ============================================================================== --- cfe/trunk/include/clang/Serialization/Module.h (original) +++ cfe/trunk/include/clang/Serialization/Module.h Mon Jan 30 00:05:58 2017 @@ -211,6 +211,10 @@ public: /// \brief The input files that have been loaded from this AST file. std::vector<InputFile> InputFilesLoaded; + // All user input files reside at the index range [0, NumUserInputFiles), and + // system input files reside at [NumUserInputFiles, InputFilesLoaded.size()). + unsigned NumUserInputFiles = 0; + /// \brief If non-zero, specifies the time when we last validated input /// files. Zero means we never validated them. /// Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=293461&r1=293460&r2=293461&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original) +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Mon Jan 30 00:05:58 2017 @@ -619,6 +619,10 @@ void StoredDiagnosticConsumer::HandleDia StoredDiags.emplace_back(Level, Info); } +IntrusiveRefCntPtr<ASTReader> ASTUnit::getASTReader() const { + return Reader; +} + ASTMutationListener *ASTUnit::getASTMutationListener() { if (WriterData) return &WriterData->Writer; Modified: cfe/trunk/lib/Index/IndexingAction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexingAction.cpp?rev=293461&r1=293460&r2=293461&view=diff ============================================================================== --- cfe/trunk/lib/Index/IndexingAction.cpp (original) +++ cfe/trunk/lib/Index/IndexingAction.cpp Mon Jan 30 00:05:58 2017 @@ -13,6 +13,7 @@ #include "clang/Frontend/FrontendAction.h" #include "clang/Frontend/MultiplexConsumer.h" #include "clang/Lex/Preprocessor.h" +#include "clang/Serialization/ASTReader.h" using namespace clang; using namespace clang::index; @@ -173,4 +174,20 @@ void index::indexASTUnit(ASTUnit &Unit, IndexCtx.setASTContext(Unit.getASTContext()); DataConsumer->initialize(Unit.getASTContext()); indexTranslationUnit(Unit, IndexCtx); + DataConsumer->finish(); +} + +void index::indexModuleFile(serialization::ModuleFile &Mod, + ASTReader &Reader, + std::shared_ptr<IndexDataConsumer> DataConsumer, + IndexingOptions Opts) { + ASTContext &Ctx = Reader.getContext(); + IndexingContext IndexCtx(Opts, *DataConsumer); + IndexCtx.setASTContext(Ctx); + DataConsumer->initialize(Ctx); + + for (const Decl *D :Reader.getModuleFileLevelDecls(Mod)) { + IndexCtx.indexTopLevelDecl(D); + } + DataConsumer->finish(); } Modified: cfe/trunk/lib/Serialization/ASTReader.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=293461&r1=293460&r2=293461&view=diff ============================================================================== --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) +++ cfe/trunk/lib/Serialization/ASTReader.cpp Mon Jan 30 00:05:58 2017 @@ -2519,6 +2519,7 @@ ASTReader::ReadControlBlock(ModuleFile & F.InputFileOffsets = (const llvm::support::unaligned_uint64_t *)Blob.data(); F.InputFilesLoaded.resize(NumInputs); + F.NumUserInputFiles = NumUserInputs; break; } } @@ -8569,6 +8570,21 @@ void ASTReader::ReadComments() { } } +void ASTReader::visitInputFiles(serialization::ModuleFile &MF, + bool IncludeSystem, bool Complain, + llvm::function_ref<void(const serialization::InputFile &IF, + bool isSystem)> Visitor) { + unsigned NumUserInputs = MF.NumUserInputFiles; + unsigned NumInputs = MF.InputFilesLoaded.size(); + assert(NumUserInputs <= NumInputs); + unsigned N = IncludeSystem ? NumInputs : NumUserInputs; + for (unsigned I = 0; I < N; ++I) { + bool IsSystem = I >= NumUserInputs; + InputFile IF = getInputFile(MF, I+1, Complain); + Visitor(IF, IsSystem); + } +} + std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { // If we know the owning module, use it. if (Module *M = D->getImportedOwningModule()) Modified: cfe/trunk/test/Index/Core/index-with-module.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index-with-module.m?rev=293461&r1=293460&r2=293461&view=diff ============================================================================== --- cfe/trunk/test/Index/Core/index-with-module.m (original) +++ cfe/trunk/test/Index/Core/index-with-module.m Mon Jan 30 00:05:58 2017 @@ -1,5 +1,5 @@ // RUN: rm -rf %t.mcp -// RUN: c-index-test core -print-source-symbols -- %s -I %S/Inputs/module -fmodules -fmodules-cache-path=%t.mcp | FileCheck %s +// RUN: c-index-test core -print-source-symbols -dump-imported-module-files -- %s -I %S/Inputs/module -fmodules -fmodules-cache-path=%t.mcp | FileCheck %s // CHECK: [[@LINE+1]]:9 | module/C | ModA | Decl | @import ModA; @@ -10,3 +10,9 @@ void foo() { // CHECK: [[@LINE+1]]:3 | function/C | ModA_func | c:@F@ModA_func | {{.*}} | Ref,Call,RelCall,RelCont | rel: 1 ModA_func(); } + +// CHECK: ==== Module ModA ==== +// CHECK: 2:6 | function/C | ModA_func | c:@F@ModA_func | {{.*}} | Decl | rel: 0 +// CHECK: ---- Module Inputs ---- +// CHECK: user | {{.*}}ModA.h +// CHECK: user | {{.*}}module.modulemap Modified: cfe/trunk/tools/c-index-test/core_main.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/core_main.cpp?rev=293461&r1=293460&r2=293461&view=diff ============================================================================== --- cfe/trunk/tools/c-index-test/core_main.cpp (original) +++ cfe/trunk/tools/c-index-test/core_main.cpp Mon Jan 30 00:05:58 2017 @@ -16,6 +16,7 @@ #include "clang/Index/IndexDataConsumer.h" #include "clang/Index/USRGeneration.h" #include "clang/Index/CodegenNameGenerator.h" +#include "clang/Serialization/ASTReader.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Signals.h" #include "llvm/Support/raw_ostream.h" @@ -50,6 +51,10 @@ static cl::extrahelp MoreHelp( "invocation\n" ); +static cl::opt<bool> +DumpModuleImports("dump-imported-module-files", + cl::desc("Print symbols and input files from imported modules")); + static cl::opt<std::string> ModuleFilePath("module-file", cl::desc("Path to module file to print symbols from")); @@ -142,7 +147,19 @@ public: // Print Source Symbols //===----------------------------------------------------------------------===// -static bool printSourceSymbols(ArrayRef<const char *> Args) { +static void dumpModuleFileInputs(serialization::ModuleFile &Mod, + ASTReader &Reader, + raw_ostream &OS) { + OS << "---- Module Inputs ----\n"; + Reader.visitInputFiles(Mod, /*IncludeSystem=*/true, /*Complain=*/false, + [&](const serialization::InputFile &IF, bool isSystem) { + OS << (isSystem ? "system" : "user") << " | "; + OS << IF.getFile()->getName() << '\n'; + }); +} + +static bool printSourceSymbols(ArrayRef<const char *> Args, + bool dumpModuleImports) { SmallVector<const char *, 4> ArgsWithProgName; ArgsWithProgName.push_back("clang"); ArgsWithProgName.append(Args.begin(), Args.end()); @@ -152,7 +169,8 @@ static bool printSourceSymbols(ArrayRef< if (!CInvok) return true; - auto DataConsumer = std::make_shared<PrintIndexDataConsumer>(outs()); + raw_ostream &OS = outs(); + auto DataConsumer = std::make_shared<PrintIndexDataConsumer>(OS); IndexingOptions IndexOpts; std::unique_ptr<FrontendAction> IndexAction; IndexAction = createIndexingAction(DataConsumer, IndexOpts, @@ -165,6 +183,17 @@ static bool printSourceSymbols(ArrayRef< if (!Unit) return true; + if (dumpModuleImports) { + if (auto Reader = Unit->getASTReader()) { + Reader->getModuleManager().visit([&](serialization::ModuleFile &Mod) -> bool { + OS << "==== Module " << Mod.ModuleName << " ====\n"; + indexModuleFile(Mod, *Reader, DataConsumer, IndexOpts); + dumpModuleFileInputs(Mod, *Reader, OS); + return true; // skip module dependencies. + }); + } + } + return false; } @@ -268,7 +297,7 @@ int indextest_core_main(int argc, const errs() << "error: missing compiler args; pass '-- <compiler arguments>'\n"; return 1; } - return printSourceSymbols(CompArgs); + return printSourceSymbols(CompArgs, options::DumpModuleImports); } return 0; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits