Skip to content

Commit 0cd27bf

Browse files
committed
IRGen: Add a FrontendStatsTracer
We didn't measure time spent in IRGen in multi-threaded mode previously.
1 parent 34def0e commit 0cd27bf

File tree

1 file changed

+94
-90
lines changed

1 file changed

+94
-90
lines changed

lib/IRGen/IRGen.cpp

Lines changed: 94 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,123 +1450,127 @@ static void performParallelIRGeneration(IRGenDescriptor desc) {
14501450
IGM->addLinkLibraries();
14511451
IGMcreated = true;
14521452
}
1453-
1453+
14541454
if (!IGMcreated) {
14551455
// TODO: Check this already at argument parsing.
14561456
Ctx.Diags.diagnose(SourceLoc(), diag::no_input_files_for_mt);
14571457
return;
14581458
}
14591459

1460-
// Emit the module contents.
1461-
irgen.emitGlobalTopLevel(desc.getLinkerDirectives());
1460+
{
1461+
FrontendStatsTracer tracer(Ctx.Stats, "IRGen");
14621462

1463-
for (auto *File : M->getFiles()) {
1464-
if (auto *SF = dyn_cast<SourceFile>(File)) {
1465-
{
1466-
CurrentIGMPtr IGM = irgen.getGenModule(SF);
1467-
IGM->emitSourceFile(*SF);
1468-
}
1469-
1470-
if (auto *synthSFU = File->getSynthesizedFile()) {
1471-
CurrentIGMPtr IGM = irgen.getGenModule(synthSFU);
1472-
IGM->emitSynthesizedFileUnit(*synthSFU);
1463+
// Emit the module contents.
1464+
irgen.emitGlobalTopLevel(desc.getLinkerDirectives());
1465+
1466+
for (auto *File : M->getFiles()) {
1467+
if (auto *SF = dyn_cast<SourceFile>(File)) {
1468+
{
1469+
CurrentIGMPtr IGM = irgen.getGenModule(SF);
1470+
IGM->emitSourceFile(*SF);
1471+
}
1472+
1473+
if (auto *synthSFU = File->getSynthesizedFile()) {
1474+
CurrentIGMPtr IGM = irgen.getGenModule(synthSFU);
1475+
IGM->emitSynthesizedFileUnit(*synthSFU);
1476+
}
14731477
}
14741478
}
1475-
}
1476-
1477-
// Okay, emit any definitions that we suddenly need.
1478-
irgen.emitLazyDefinitions();
14791479

1480-
irgen.emitSwiftProtocols();
1480+
// Okay, emit any definitions that we suddenly need.
1481+
irgen.emitLazyDefinitions();
1482+
1483+
irgen.emitSwiftProtocols();
14811484

1482-
irgen.emitDynamicReplacements();
1485+
irgen.emitDynamicReplacements();
14831486

1484-
irgen.emitProtocolConformances();
1487+
irgen.emitProtocolConformances();
14851488

1486-
irgen.emitTypeMetadataRecords();
1489+
irgen.emitTypeMetadataRecords();
14871490

1488-
irgen.emitAccessibleFunctions();
1491+
irgen.emitAccessibleFunctions();
14891492

1490-
irgen.emitReflectionMetadataVersion();
1493+
irgen.emitReflectionMetadataVersion();
14911494

1492-
irgen.emitEagerClassInitialization();
1493-
irgen.emitObjCActorsNeedingSuperclassSwizzle();
1495+
irgen.emitEagerClassInitialization();
1496+
irgen.emitObjCActorsNeedingSuperclassSwizzle();
14941497

1495-
// Emit reflection metadata for builtin and imported types.
1496-
irgen.emitBuiltinReflectionMetadata();
1498+
// Emit reflection metadata for builtin and imported types.
1499+
irgen.emitBuiltinReflectionMetadata();
1500+
1501+
// Emit coverage mapping info. This needs to happen after we've emitted
1502+
// any lazy definitions, as we need to know whether or not we emitted a
1503+
// profiler increment for a given coverage map.
1504+
irgen.emitCoverageMapping();
14971505

1498-
// Emit coverage mapping info. This needs to happen after we've emitted
1499-
// any lazy definitions, as we need to know whether or not we emitted a
1500-
// profiler increment for a given coverage map.
1501-
irgen.emitCoverageMapping();
1506+
IRGenModule *PrimaryGM = irgen.getPrimaryIGM();
15021507

1503-
IRGenModule *PrimaryGM = irgen.getPrimaryIGM();
1508+
// Emit symbols for eliminated dead methods.
1509+
PrimaryGM->emitVTableStubs();
15041510

1505-
// Emit symbols for eliminated dead methods.
1506-
PrimaryGM->emitVTableStubs();
1511+
// Verify type layout if we were asked to.
1512+
if (!Opts.VerifyTypeLayoutNames.empty())
1513+
PrimaryGM->emitTypeVerifier();
15071514

1508-
// Verify type layout if we were asked to.
1509-
if (!Opts.VerifyTypeLayoutNames.empty())
1510-
PrimaryGM->emitTypeVerifier();
1511-
1512-
std::for_each(Opts.LinkLibraries.begin(), Opts.LinkLibraries.end(),
1513-
[&](LinkLibrary linkLib) {
1514-
PrimaryGM->addLinkLibrary(linkLib);
1515-
});
1516-
1517-
llvm::DenseSet<StringRef> referencedGlobals;
1518-
1519-
for (auto it = irgen.begin(); it != irgen.end(); ++it) {
1520-
IRGenModule *IGM = it->second;
1521-
llvm::Module *M = IGM->getModule();
1522-
auto collectReference = [&](llvm::GlobalValue &G) {
1523-
if (G.isDeclaration()
1524-
&& (G.getLinkage() == GlobalValue::LinkOnceODRLinkage ||
1525-
G.getLinkage() == GlobalValue::ExternalLinkage)) {
1526-
referencedGlobals.insert(G.getName());
1527-
G.setLinkage(GlobalValue::ExternalLinkage);
1515+
std::for_each(Opts.LinkLibraries.begin(), Opts.LinkLibraries.end(),
1516+
[&](LinkLibrary linkLib) {
1517+
PrimaryGM->addLinkLibrary(linkLib);
1518+
});
1519+
1520+
llvm::DenseSet<StringRef> referencedGlobals;
1521+
1522+
for (auto it = irgen.begin(); it != irgen.end(); ++it) {
1523+
IRGenModule *IGM = it->second;
1524+
llvm::Module *M = IGM->getModule();
1525+
auto collectReference = [&](llvm::GlobalValue &G) {
1526+
if (G.isDeclaration()
1527+
&& (G.getLinkage() == GlobalValue::LinkOnceODRLinkage ||
1528+
G.getLinkage() == GlobalValue::ExternalLinkage)) {
1529+
referencedGlobals.insert(G.getName());
1530+
G.setLinkage(GlobalValue::ExternalLinkage);
1531+
}
1532+
};
1533+
for (llvm::GlobalVariable &G : M->globals()) {
1534+
collectReference(G);
1535+
}
1536+
for (llvm::Function &F : M->getFunctionList()) {
1537+
collectReference(F);
1538+
}
1539+
for (llvm::GlobalAlias &A : M->aliases()) {
1540+
collectReference(A);
15281541
}
1529-
};
1530-
for (llvm::GlobalVariable &G : M->globals()) {
1531-
collectReference(G);
1532-
}
1533-
for (llvm::Function &F : M->getFunctionList()) {
1534-
collectReference(F);
1535-
}
1536-
for (llvm::GlobalAlias &A : M->aliases()) {
1537-
collectReference(A);
15381542
}
1539-
}
15401543

1541-
for (auto it = irgen.begin(); it != irgen.end(); ++it) {
1542-
IRGenModule *IGM = it->second;
1543-
llvm::Module *M = IGM->getModule();
1544-
1545-
// Update the linkage of shared functions/globals.
1546-
// If a shared function/global is referenced from another file it must have
1547-
// weak instead of linkonce linkage. Otherwise LLVM would remove the
1548-
// definition (if it's not referenced in the same file).
1549-
auto updateLinkage = [&](llvm::GlobalValue &G) {
1550-
if (!G.isDeclaration()
1551-
&& G.getLinkage() == GlobalValue::LinkOnceODRLinkage
1552-
&& referencedGlobals.count(G.getName()) != 0) {
1553-
G.setLinkage(GlobalValue::WeakODRLinkage);
1544+
for (auto it = irgen.begin(); it != irgen.end(); ++it) {
1545+
IRGenModule *IGM = it->second;
1546+
llvm::Module *M = IGM->getModule();
1547+
1548+
// Update the linkage of shared functions/globals.
1549+
// If a shared function/global is referenced from another file it must have
1550+
// weak instead of linkonce linkage. Otherwise LLVM would remove the
1551+
// definition (if it's not referenced in the same file).
1552+
auto updateLinkage = [&](llvm::GlobalValue &G) {
1553+
if (!G.isDeclaration()
1554+
&& G.getLinkage() == GlobalValue::LinkOnceODRLinkage
1555+
&& referencedGlobals.count(G.getName()) != 0) {
1556+
G.setLinkage(GlobalValue::WeakODRLinkage);
1557+
}
1558+
};
1559+
for (llvm::GlobalVariable &G : M->globals()) {
1560+
updateLinkage(G);
1561+
}
1562+
for (llvm::Function &F : M->getFunctionList()) {
1563+
updateLinkage(F);
1564+
}
1565+
for (llvm::GlobalAlias &A : M->aliases()) {
1566+
updateLinkage(A);
15541567
}
1555-
};
1556-
for (llvm::GlobalVariable &G : M->globals()) {
1557-
updateLinkage(G);
1558-
}
1559-
for (llvm::Function &F : M->getFunctionList()) {
1560-
updateLinkage(F);
1561-
}
1562-
for (llvm::GlobalAlias &A : M->aliases()) {
1563-
updateLinkage(A);
1564-
}
15651568

1566-
if (!IGM->finalize())
1567-
return;
1569+
if (!IGM->finalize())
1570+
return;
15681571

1569-
setModuleFlags(*IGM);
1572+
setModuleFlags(*IGM);
1573+
}
15701574
}
15711575

15721576
// Bail out if there are any errors.

0 commit comments

Comments
 (0)