Similar to previous no transitive changes to decls, types, identifiers and source locations ( https://github.com/llvm/llvm-project/pull/92083 https://github.com/llvm/llvm-project/pull/92085 https://github.com/llvm/llvm-project/pull/92511 https://github.com/llvm/llvm-project/pull/86912 ) This patch does the same thing for MacroID and PreprocessedEntityID. --- ### Some background Previously we record different IDs linearly. That is, when writing a module, if we have 17 decls in imported modules, the ID of decls in the module will start from 18. This makes the contents of the BMI changes if the we add/remove any decls, types, identifiers and source locations in the imported modules. This makes it hard for us to reduce recompilations with modules. We want to skip recompilations as we think the modules can help us to remove fake dependencies. This can be done by split the ID into <ModuleIndex, LocalIndex> pairs. This is ALREADY done for several different ID above. We call it non-casacading changes (https://clang.llvm.org/docs/StandardCPlusPlusModules.html#experimental-non-cascading-changes). Our internal users have already used this feature and it works well for years. Now we want to extend this to MacroID and PreprocessedEntityID. This is helpful for us in the downstream as we allowed named modules to export macros. But I believe this is also helpful for header-like modules if you'd like to explore the area. And also I think this is a nice cleanup too. --- Given the use of MacroID and PreprocessedEntityID are not as complicated as other IDs in the above series, I feel the patch itself should be good. I hope the vendors can test the patch to make sure it won't affect existing users.
88 lines
3.2 KiB
C++
88 lines
3.2 KiB
C++
//===- ModuleFile.cpp - Module description --------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the ModuleFile class, which describes a module that
|
|
// has been loaded from an AST file.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "clang/Serialization/ModuleFile.h"
|
|
#include "ASTReaderInternals.h"
|
|
#include "clang/Serialization/ContinuousRangeMap.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace clang;
|
|
using namespace serialization;
|
|
using namespace reader;
|
|
|
|
ModuleFile::~ModuleFile() {
|
|
delete static_cast<ASTIdentifierLookupTable *>(IdentifierLookupTable);
|
|
delete static_cast<HeaderFileInfoLookupTable *>(HeaderFileInfoTable);
|
|
delete static_cast<ASTSelectorLookupTable *>(SelectorLookupTable);
|
|
}
|
|
|
|
template<typename Key, typename Offset, unsigned InitialCapacity>
|
|
static void
|
|
dumpLocalRemap(StringRef Name,
|
|
const ContinuousRangeMap<Key, Offset, InitialCapacity> &Map) {
|
|
if (Map.begin() == Map.end())
|
|
return;
|
|
|
|
using MapType = ContinuousRangeMap<Key, Offset, InitialCapacity>;
|
|
|
|
llvm::errs() << " " << Name << ":\n";
|
|
for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
|
|
I != IEnd; ++I) {
|
|
llvm::errs() << " " << I->first << " -> " << I->second << "\n";
|
|
}
|
|
}
|
|
|
|
LLVM_DUMP_METHOD void ModuleFile::dump() {
|
|
llvm::errs() << "\nModule: " << FileName << "\n";
|
|
if (!Imports.empty()) {
|
|
llvm::errs() << " Imports: ";
|
|
for (unsigned I = 0, N = Imports.size(); I != N; ++I) {
|
|
if (I)
|
|
llvm::errs() << ", ";
|
|
llvm::errs() << Imports[I]->FileName;
|
|
}
|
|
llvm::errs() << "\n";
|
|
}
|
|
|
|
// Remapping tables.
|
|
llvm::errs() << " Base source location offset: " << SLocEntryBaseOffset
|
|
<< '\n';
|
|
|
|
llvm::errs() << " Base identifier ID: " << BaseIdentifierID << '\n'
|
|
<< " Number of identifiers: " << LocalNumIdentifiers << '\n';
|
|
|
|
llvm::errs() << " Base macro ID: " << BaseMacroID << '\n'
|
|
<< " Number of macros: " << LocalNumMacros << '\n';
|
|
|
|
llvm::errs() << " Base submodule ID: " << BaseSubmoduleID << '\n'
|
|
<< " Number of submodules: " << LocalNumSubmodules << '\n';
|
|
dumpLocalRemap("Submodule ID local -> global map", SubmoduleRemap);
|
|
|
|
llvm::errs() << " Base selector ID: " << BaseSelectorID << '\n'
|
|
<< " Number of selectors: " << LocalNumSelectors << '\n';
|
|
dumpLocalRemap("Selector ID local -> global map", SelectorRemap);
|
|
|
|
llvm::errs() << " Base preprocessed entity ID: " << BasePreprocessedEntityID
|
|
<< '\n'
|
|
<< " Number of preprocessed entities: "
|
|
<< NumPreprocessedEntities << '\n';
|
|
|
|
llvm::errs() << " Base type index: " << BaseTypeIndex << '\n'
|
|
<< " Number of types: " << LocalNumTypes << '\n';
|
|
|
|
llvm::errs() << " Base decl index: " << BaseDeclIndex << '\n'
|
|
<< " Number of decls: " << LocalNumDecls << '\n';
|
|
}
|