Skip to content

Commit 2ca8e66

Browse files
committed
[NFC] Refactor the construction of SILRemarksStreamer
The Remarks Streamer's installation seemed a bit overly complex, so simplify it in a few places: * Refactor sil-opt to install the remarks options into the SILOptions for the SILModule This reduces the parameter bloat in createSILRemarkStreamer. All of this data is freely derivable from the SILModule alone. * Refactor createSILRemarkStreamer into SILRemarkStreamer::create With the new reduction in parameters, we can hide the internal constructor and introduce a smart constructor that vends a unique pointer to clients. * setSILRemarkStreamer -> installSILRemarkStreamer Since the information to create a streamer is now entirely derivable from a module, remove a layer of abstraction and have the module directly construct a streamer for itself. * Give SILRemarkStreamer its own LLVMContext The remarks streamer just needs scratch space. It's not actually "installed" in a given context. There no reason to use Swift's Global Context here. * Give the SILRemarkStreamer ownership of the underlying file stream The SILModule didn't actually use this member, and it seems like somebody needs to own it, so just give it to the remarks streamer directly.
1 parent d03e991 commit 2ca8e66

File tree

5 files changed

+68
-51
lines changed

5 files changed

+68
-51
lines changed

include/swift/SIL/SILRemarkStreamer.h

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,39 @@
2525
namespace swift {
2626

2727
class SILRemarkStreamer {
28-
llvm::remarks::RemarkStreamer &llvmStreamer;
28+
private:
29+
/// The \c LLVMContext the underlying streamer uses for scratch space.
30+
std::unique_ptr<llvm::LLVMContext> streamerContext;
31+
/// The remark output stream used to record SIL remarks to a file.
32+
std::unique_ptr<llvm::raw_fd_ostream> remarkStream;
33+
2934
// Source manager for resolving source locations.
30-
const SourceManager &srcMgr;
35+
const ASTContext &ctx;
3136
/// Convert diagnostics into LLVM remark objects.
3237
/// The lifetime of the members of the result is bound to the lifetime of
3338
/// the SIL remarks.
3439
template <typename RemarkT>
3540
llvm::remarks::Remark
3641
toLLVMRemark(const OptRemark::Remark<RemarkT> &remark) const;
3742

43+
SILRemarkStreamer(std::unique_ptr<llvm::remarks::RemarkStreamer> &&streamer,
44+
std::unique_ptr<llvm::raw_fd_ostream> &&stream,
45+
const ASTContext &Ctx);
46+
47+
public:
48+
static std::unique_ptr<SILRemarkStreamer> create(SILModule &silModule);
49+
3850
public:
39-
SILRemarkStreamer(llvm::remarks::RemarkStreamer &llvmStreamer,
40-
const SourceManager &srcMgr)
41-
: llvmStreamer(llvmStreamer), srcMgr(srcMgr) {}
51+
llvm::remarks::RemarkStreamer &getLLVMStreamer();
52+
const llvm::remarks::RemarkStreamer &getLLVMStreamer() const;
53+
54+
const ASTContext &getASTContext() const { return ctx; }
55+
4256
/// Emit a remark through the streamer.
4357
template <typename RemarkT>
4458
void emit(const OptRemark::Remark<RemarkT> &remark);
4559
};
4660

47-
std::pair<std::unique_ptr<llvm::raw_fd_ostream>,
48-
std::unique_ptr<SILRemarkStreamer>>
49-
createSILRemarkStreamer(SILModule &srcMgr, StringRef filename, StringRef passes,
50-
llvm::remarks::Format format,
51-
DiagnosticEngine &diagEngine, SourceManager &sourceMgr);
52-
5361
// Implementation for template member functions.
5462

5563
// OptRemark type -> llvm::remarks::Type
@@ -80,24 +88,26 @@ llvm::remarks::Remark SILRemarkStreamer::toLLVMRemark(
8088
llvmRemark.PassName = optRemark.getPassName();
8189
llvmRemark.RemarkName = optRemark.getIdentifier();
8290
llvmRemark.FunctionName = optRemark.getDemangledFunctionName();
83-
llvmRemark.Loc = toRemarkLocation(optRemark.getLocation(), srcMgr);
91+
llvmRemark.Loc =
92+
toRemarkLocation(optRemark.getLocation(), getASTContext().SourceMgr);
8493

8594
for (const OptRemark::Argument &arg : optRemark.getArgs()) {
8695
llvmRemark.Args.emplace_back();
8796
llvmRemark.Args.back().Key = arg.key;
8897
llvmRemark.Args.back().Val = arg.val;
89-
llvmRemark.Args.back().Loc = toRemarkLocation(arg.loc, srcMgr);
98+
llvmRemark.Args.back().Loc =
99+
toRemarkLocation(arg.loc, getASTContext().SourceMgr);
90100
}
91101

92102
return llvmRemark;
93103
}
94104

95105
template <typename RemarkT>
96106
void SILRemarkStreamer::emit(const OptRemark::Remark<RemarkT> &optRemark) {
97-
if (!llvmStreamer.matchesFilter(optRemark.getPassName()))
107+
if (!getLLVMStreamer().matchesFilter(optRemark.getPassName()))
98108
return;
99109

100-
return llvmStreamer.getSerializer().emit(toLLVMRemark(optRemark));
110+
return getLLVMStreamer().getSerializer().emit(toLLVMRemark(optRemark));
101111
}
102112

103113
} // namespace swift

lib/FrontendTool/FrontendTool.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
#include "swift/Basic/Edit.h"
4242
#include "swift/Basic/FileSystem.h"
4343
#include "swift/Basic/JSONSerialization.h"
44-
#include "swift/Basic/LLVMContext.h"
4544
#include "swift/Basic/LLVMInitialize.h"
4645
#include "swift/Basic/Platform.h"
4746
#include "swift/Basic/PrettyStackTrace.h"
@@ -1557,7 +1556,6 @@ static bool performCompileStepsPostSILGen(
15571556
FrontendOptions opts = Invocation.getFrontendOptions();
15581557
FrontendOptions::ActionType Action = opts.RequestedAction;
15591558
const ASTContext &Context = Instance.getASTContext();
1560-
const SILOptions &SILOpts = Invocation.getSILOptions();
15611559
const IRGenOptions &IRGenOpts = Invocation.getIRGenOptions();
15621560

15631561
Optional<BufferIndirectlyCausingDiagnosticRAII> ricd;
@@ -1581,10 +1579,7 @@ static bool performCompileStepsPostSILGen(
15811579
return Context.hadError();
15821580
}
15831581

1584-
auto pair = createSILRemarkStreamer(
1585-
*SM, SILOpts.OptRecordFile, SILOpts.OptRecordPasses,
1586-
SILOpts.OptRecordFormat, Instance.getDiags(), Instance.getSourceMgr());
1587-
SM->setSILRemarkStreamer(std::move(pair.first), std::move(pair.second));
1582+
SM->installSILRemarkStreamer();
15881583

15891584
// This is the action to be used to serialize SILModule.
15901585
// It may be invoked multiple times, but it will perform

lib/SIL/IR/SILModule.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "llvm/ADT/SmallString.h"
2929
#include "llvm/ADT/Statistic.h"
3030
#include "llvm/ADT/StringSwitch.h"
31+
#include "llvm/IR/LLVMContext.h"
3132
#include "llvm/Support/Debug.h"
3233
#include "llvm/Support/YAMLTraits.h"
3334
#include <functional>
@@ -698,11 +699,9 @@ void SILModule::serialize() {
698699
setSerialized();
699700
}
700701

701-
void SILModule::setSILRemarkStreamer(
702-
std::unique_ptr<llvm::raw_fd_ostream> &&remarkStream,
703-
std::unique_ptr<swift::SILRemarkStreamer> &&remarkStreamer) {
704-
silRemarkStream = std::move(remarkStream);
705-
silRemarkStreamer = std::move(remarkStreamer);
702+
void SILModule::installSILRemarkStreamer() {
703+
assert(!silRemarkStreamer && "SIL Remark Streamer is already installed!");
704+
silRemarkStreamer = SILRemarkStreamer::create(*this);
706705
}
707706

708707
bool SILModule::isStdlibModule() const {

lib/SIL/Utils/SILRemarkStreamer.cpp

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,42 @@
1212

1313
#include "swift/SIL/SILRemarkStreamer.h"
1414
#include "swift/AST/DiagnosticsFrontend.h"
15-
#include "swift/Basic/LLVMContext.h"
1615
#include "llvm/IR/LLVMContext.h"
1716

1817
using namespace swift;
1918

20-
std::pair<std::unique_ptr<llvm::raw_fd_ostream>,
21-
std::unique_ptr<SILRemarkStreamer>>
22-
swift::createSILRemarkStreamer(SILModule &silModule, StringRef filename,
23-
StringRef passes, llvm::remarks::Format format,
24-
DiagnosticEngine &diagEngine,
25-
SourceManager &sourceMgr) {
19+
SILRemarkStreamer::SILRemarkStreamer(
20+
std::unique_ptr<llvm::remarks::RemarkStreamer> &&streamer,
21+
std::unique_ptr<llvm::raw_fd_ostream> &&stream, const ASTContext &Ctx)
22+
: streamerContext(std::make_unique<llvm::LLVMContext>()),
23+
remarkStream(std::move(stream)), ctx(Ctx) {
24+
streamerContext->setMainRemarkStreamer(std::move(streamer));
25+
}
26+
27+
llvm::remarks::RemarkStreamer &SILRemarkStreamer::getLLVMStreamer() {
28+
return *streamerContext->getMainRemarkStreamer();
29+
}
30+
31+
const llvm::remarks::RemarkStreamer &
32+
SILRemarkStreamer::getLLVMStreamer() const {
33+
return *streamerContext->getMainRemarkStreamer();
34+
}
35+
36+
std::unique_ptr<SILRemarkStreamer>
37+
SILRemarkStreamer::create(SILModule &silModule) {
38+
StringRef filename = silModule.getOptions().OptRecordFile;
39+
const auto format = silModule.getOptions().OptRecordFormat;
2640
if (filename.empty())
27-
return {nullptr, nullptr};
41+
return nullptr;
2842

43+
auto &diagEngine = silModule.getASTContext().Diags;
2944
std::error_code errorCode;
3045
auto file = std::make_unique<llvm::raw_fd_ostream>(filename, errorCode,
3146
llvm::sys::fs::F_None);
3247
if (errorCode) {
3348
diagEngine.diagnose(SourceLoc(), diag::cannot_open_file, filename,
3449
errorCode.message());
35-
return {nullptr, nullptr};
50+
return nullptr;
3651
}
3752

3853
llvm::Expected<std::unique_ptr<llvm::remarks::RemarkSerializer>>
@@ -41,23 +56,24 @@ swift::createSILRemarkStreamer(SILModule &silModule, StringRef filename,
4156
if (llvm::Error err = remarkSerializerOrErr.takeError()) {
4257
diagEngine.diagnose(SourceLoc(), diag::error_creating_remark_serializer,
4358
toString(std::move(err)));
44-
return {nullptr, nullptr};
59+
return nullptr;
4560
}
4661

4762
auto mainRS = std::make_unique<llvm::remarks::RemarkStreamer>(
4863
std::move(*remarkSerializerOrErr), filename);
49-
llvm::remarks::RemarkStreamer &mainRemarkStreamer = *mainRS;
50-
getGlobalLLVMContext().setMainRemarkStreamer(std::move(mainRS));
5164

65+
const auto passes = silModule.getOptions().OptRecordPasses;
5266
if (!passes.empty()) {
53-
if (llvm::Error err = mainRemarkStreamer.setFilter(passes)) {
67+
if (llvm::Error err = mainRS->setFilter(passes)) {
5468
diagEngine.diagnose(SourceLoc(), diag::error_creating_remark_serializer,
5569
toString(std::move(err)));
56-
return {nullptr, nullptr};
70+
return nullptr;
5771
}
5872
}
5973

60-
auto remarkStreamer =
61-
std::make_unique<SILRemarkStreamer>(mainRemarkStreamer, sourceMgr);
62-
return {std::move(file), std::move(remarkStreamer)};
74+
// N.B. We should be able to use std::make_unique here, but I prefer correctly
75+
// encapsulating the constructor over elegance.
76+
// Besides, this isn't going to throw an exception.
77+
return std::unique_ptr<SILRemarkStreamer>(new SILRemarkStreamer(
78+
std::move(mainRS), std::move(file), silModule.getASTContext()));
6379
}

tools/sil-opt/SILOpt.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include "swift/AST/SILOptions.h"
2121
#include "swift/Basic/FileTypes.h"
2222
#include "swift/Basic/LLVMInitialize.h"
23-
#include "swift/Basic/LLVMContext.h"
2423
#include "swift/Frontend/DiagnosticVerifier.h"
2524
#include "swift/Frontend/Frontend.h"
2625
#include "swift/Frontend/PrintingDiagnosticConsumer.h"
@@ -363,6 +362,8 @@ int main(int argc, char **argv) {
363362
SILOpts.VerifySILOwnership = !DisableSILOwnershipVerifier;
364363
SILOpts.StripOwnershipAfterSerialization =
365364
EnableOwnershipLoweringAfterDiagnostics;
365+
SILOpts.OptRecordFile = RemarksFilename;
366+
SILOpts.OptRecordPasses = RemarksPasses;
366367

367368
SILOpts.VerifyExclusivity = VerifyExclusivity;
368369
if (EnforceExclusivity.getNumOccurrences() != 0) {
@@ -461,23 +462,19 @@ int main(int argc, char **argv) {
461462
CI.getSILModule()->setSerializeSILAction([]{});
462463

463464
if (RemarksFilename != "") {
464-
llvm::remarks::Format remarksFormat = llvm::remarks::Format::YAML;
465465
llvm::Expected<llvm::remarks::Format> formatOrErr =
466466
llvm::remarks::parseFormat(RemarksFormat);
467467
if (llvm::Error E = formatOrErr.takeError()) {
468468
CI.getDiags().diagnose(SourceLoc(),
469469
diag::error_creating_remark_serializer,
470470
toString(std::move(E)));
471471
HadError = true;
472+
SILOpts.OptRecordFormat = llvm::remarks::Format::YAML;
472473
} else {
473-
remarksFormat = *formatOrErr;
474+
SILOpts.OptRecordFormat = *formatOrErr;
474475
}
475476

476-
auto Pair = createSILRemarkStreamer(*CI.getSILModule(), RemarksFilename,
477-
RemarksPasses, remarksFormat,
478-
CI.getDiags(), CI.getSourceMgr());
479-
CI.getSILModule()->setSILRemarkStreamer(std::move(Pair.first),
480-
std::move(Pair.second));
477+
CI.getSILModule()->installSILRemarkStreamer();
481478
}
482479

483480
if (OptimizationGroup == OptGroup::Diagnostics) {

0 commit comments

Comments
 (0)