mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Move imported entities into DwarfCompilationUnit to speed up LTO linking.
Summary: In particular, this CL speeds up the official Chrome linking with LTO by 1.8x. See more details in https://crbug.com/542426 Reviewers: dblaikie Subscribers: jevinskie Differential Revision: http://reviews.llvm.org/D13918 llvm-svn: 251353
This commit is contained in:
parent
e8b9c50ed7
commit
01683c7544
@ -342,9 +342,9 @@ void DwarfCompileUnit::constructScopeDIE(
|
||||
// Skip imported directives in gmlt-like data.
|
||||
if (!includeMinimalInlineScopes()) {
|
||||
// There is no need to emit empty lexical block DIE.
|
||||
for (const auto &E : DD->findImportedEntitiesForScope(DS))
|
||||
for (const auto *IE : ImportedEntities[DS])
|
||||
Children.push_back(
|
||||
constructImportedEntityDIE(cast<DIImportedEntity>(E.second)));
|
||||
constructImportedEntityDIE(cast<DIImportedEntity>(IE)));
|
||||
}
|
||||
|
||||
// If there are only other scopes as children, put them directly in the
|
||||
|
@ -39,6 +39,12 @@ class DwarfCompileUnit : public DwarfUnit {
|
||||
/// The start of the unit within its section.
|
||||
MCSymbol *LabelBegin;
|
||||
|
||||
typedef llvm::SmallVector<const MDNode *, 8> ImportedEntityList;
|
||||
typedef llvm::DenseMap<const MDNode *, ImportedEntityList>
|
||||
ImportedEntityMap;
|
||||
|
||||
ImportedEntityMap ImportedEntities;
|
||||
|
||||
/// GlobalNames - A map of globally visible named entities for this unit.
|
||||
StringMap<const DIE *> GlobalNames;
|
||||
|
||||
@ -98,6 +104,10 @@ public:
|
||||
|
||||
unsigned getOrCreateSourceID(StringRef FileName, StringRef DirName) override;
|
||||
|
||||
void addImportedEntity(const DIImportedEntity* IE) {
|
||||
ImportedEntities[IE->getScope()].push_back(IE);
|
||||
}
|
||||
|
||||
/// addRange - Add an address range to the list of ranges for this unit.
|
||||
void addRange(RangeSpan Range);
|
||||
|
||||
|
@ -489,12 +489,7 @@ void DwarfDebug::beginModule() {
|
||||
auto *CUNode = cast<DICompileUnit>(N);
|
||||
DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
|
||||
for (auto *IE : CUNode->getImportedEntities())
|
||||
ScopesWithImportedEntities.push_back(std::make_pair(IE->getScope(), IE));
|
||||
// Stable sort to preserve the order of appearance of imported entities.
|
||||
// This is to avoid out-of-order processing of interdependent declarations
|
||||
// within the same scope, e.g. { namespace A = base; namespace B = A; }
|
||||
std::stable_sort(ScopesWithImportedEntities.begin(),
|
||||
ScopesWithImportedEntities.end(), less_first());
|
||||
CU.addImportedEntity(IE);
|
||||
for (auto *GV : CUNode->getGlobalVariables())
|
||||
CU.getOrCreateGlobalVariableDIE(GV);
|
||||
for (auto *SP : CUNode->getSubprograms())
|
||||
|
@ -289,11 +289,6 @@ class DwarfDebug : public AsmPrinterHandler {
|
||||
/// Holders for the various debug information flags that we might need to
|
||||
/// have exposed. See accessor functions below for description.
|
||||
|
||||
/// Holder for imported entities.
|
||||
typedef SmallVector<std::pair<const MDNode *, const MDNode *>, 32>
|
||||
ImportedEntityMap;
|
||||
ImportedEntityMap ScopesWithImportedEntities;
|
||||
|
||||
/// Map from MDNodes for user-defined types to the type units that
|
||||
/// describe them.
|
||||
DenseMap<const MDNode *, const DwarfTypeUnit *> DwarfTypeUnits;
|
||||
@ -626,14 +621,6 @@ public:
|
||||
|
||||
const MachineFunction *getCurrentFunction() const { return CurFn; }
|
||||
|
||||
iterator_range<ImportedEntityMap::const_iterator>
|
||||
findImportedEntitiesForScope(const MDNode *Scope) const {
|
||||
return make_range(std::equal_range(
|
||||
ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
|
||||
std::pair<const MDNode *, const MDNode *>(Scope, nullptr),
|
||||
less_first()));
|
||||
}
|
||||
|
||||
/// A helper function to check whether the DIE for a given Scope is
|
||||
/// going to be null.
|
||||
bool isLexicalScopeDIENull(LexicalScope *Scope);
|
||||
|
Loading…
Reference in New Issue
Block a user