Skip to content

Commit 6782bb4

Browse files
committed
Address review comments
1 parent adfcae2 commit 6782bb4

File tree

3 files changed

+31
-19
lines changed

3 files changed

+31
-19
lines changed

compiler/rustc_codegen_llvm/src/back/lto.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::back::write::{self, save_temp_bitcode, CodegenDiagnosticsSection, DiagnosticHandlers};
1+
use crate::back::write::{self, save_temp_bitcode, CodegenDiagnosticsStage, DiagnosticHandlers};
22
use crate::errors::{
33
DynamicLinkingWithLTO, LlvmError, LtoBitcodeFromRlib, LtoDisallowed, LtoDylib,
44
};
@@ -307,7 +307,7 @@ fn fat_lto(
307307
diag_handler,
308308
llcx,
309309
&module,
310-
CodegenDiagnosticsSection::LTO,
310+
CodegenDiagnosticsStage::LTO,
311311
);
312312

313313
// For all other modules we codegened we'll need to link them into our own

compiler/rustc_codegen_llvm/src/back/write.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,13 @@ pub(crate) fn save_temp_bitcode(
269269
}
270270

271271
/// In what context is a dignostic handler being attached to a codegen unit?
272-
pub enum CodegenDiagnosticsSection {
273-
Codegen,
272+
pub enum CodegenDiagnosticsStage {
273+
/// Prelink optimization stage.
274274
Opt,
275+
/// LTO/ThinLTO postlink optimization stage.
275276
LTO,
277+
/// Code generation.
278+
Codegen,
276279
}
277280

278281
pub struct DiagnosticHandlers<'a> {
@@ -287,7 +290,7 @@ impl<'a> DiagnosticHandlers<'a> {
287290
handler: &'a Handler,
288291
llcx: &'a llvm::Context,
289292
module: &ModuleCodegen<ModuleLlvm>,
290-
section: CodegenDiagnosticsSection,
293+
section: CodegenDiagnosticsStage,
291294
) -> Self {
292295
let remark_passes_all: bool;
293296
let remark_passes: Vec<CString>;
@@ -307,17 +310,16 @@ impl<'a> DiagnosticHandlers<'a> {
307310
let remark_file = cgcx
308311
.remark_dir
309312
.as_ref()
310-
.and_then(|dir| dir.to_str())
311-
// Use the .opt.yaml file pattern, which is supported by LLVM's opt-viewer.
313+
// Use the .opt.yaml file suffix, which is supported by LLVM's opt-viewer.
312314
.map(|dir| {
313315
let section = match section {
314-
CodegenDiagnosticsSection::Codegen => "codegen",
315-
CodegenDiagnosticsSection::Opt => "opt",
316-
CodegenDiagnosticsSection::LTO => "lto",
316+
CodegenDiagnosticsStage::Codegen => "codegen",
317+
CodegenDiagnosticsStage::Opt => "opt",
318+
CodegenDiagnosticsStage::LTO => "lto",
317319
};
318-
format!("{dir}/{}.{section}.opt.yaml", module.name)
320+
dir.join(format!("{}.{section}.opt.yaml", module.name))
319321
})
320-
.map(|dir| CString::new(dir).unwrap());
322+
.and_then(|dir| dir.to_str().and_then(|p| CString::new(p).ok()));
321323

322324
let data = Box::into_raw(Box::new((cgcx, handler)));
323325
unsafe {
@@ -551,7 +553,7 @@ pub(crate) unsafe fn optimize(
551553
let llmod = module.module_llvm.llmod();
552554
let llcx = &*module.module_llvm.llcx;
553555
let _handlers =
554-
DiagnosticHandlers::new(cgcx, diag_handler, llcx, module, CodegenDiagnosticsSection::Opt);
556+
DiagnosticHandlers::new(cgcx, diag_handler, llcx, module, CodegenDiagnosticsStage::Opt);
555557

556558
let module_name = module.name.clone();
557559
let module_name = Some(&module_name[..]);
@@ -615,7 +617,7 @@ pub(crate) unsafe fn codegen(
615617
diag_handler,
616618
llcx,
617619
&module,
618-
CodegenDiagnosticsSection::Codegen,
620+
CodegenDiagnosticsStage::Codegen,
619621
);
620622

621623
if cgcx.msvc_imps_needed {

compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1878,21 +1878,24 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
18781878
bool RemarkAllPasses,
18791879
std::vector<std::string> RemarkPasses,
18801880
std::unique_ptr<llvm::remarks::RemarkStreamer> RemarkStreamer,
1881+
std::unique_ptr<LLVMRemarkStreamer> LlvmRemarkStreamer,
18811882
std::unique_ptr<ToolOutputFile> RemarksFile
18821883
)
18831884
: DiagnosticHandlerCallback(DiagnosticHandlerCallback),
18841885
DiagnosticHandlerContext(DiagnosticHandlerContext),
18851886
RemarkAllPasses(RemarkAllPasses),
18861887
RemarkPasses(std::move(RemarkPasses)),
18871888
RemarkStreamer(std::move(RemarkStreamer)),
1889+
LlvmRemarkStreamer(std::move(LlvmRemarkStreamer)),
18881890
RemarksFile(std::move(RemarksFile)) {}
18891891

18901892
virtual bool handleDiagnostics(const DiagnosticInfo &DI) override {
1891-
if (this->RemarkStreamer) {
1893+
if (this->LlvmRemarkStreamer) {
18921894
if (auto *OptDiagBase = dyn_cast<DiagnosticInfoOptimizationBase>(&DI)) {
1893-
LLVMRemarkStreamer Streamer(*this->RemarkStreamer);
1894-
Streamer.emit(*OptDiagBase);
1895-
return true;
1895+
if (OptDiagBase->isEnabled()) {
1896+
this->LlvmRemarkStreamer->emit(*OptDiagBase);
1897+
return true;
1898+
}
18961899
}
18971900
}
18981901
if (DiagnosticHandlerCallback) {
@@ -1935,7 +1938,11 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
19351938

19361939
bool RemarkAllPasses = false;
19371940
std::vector<std::string> RemarkPasses;
1941+
1942+
// Since LlvmRemarkStreamer contains a pointer to RemarkStreamer, the ordering of the two
1943+
// members below is important.
19381944
std::unique_ptr<llvm::remarks::RemarkStreamer> RemarkStreamer;
1945+
std::unique_ptr<LLVMRemarkStreamer> LlvmRemarkStreamer;
19391946
std::unique_ptr<ToolOutputFile> RemarksFile;
19401947
};
19411948

@@ -1945,8 +1952,9 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
19451952
Passes.push_back(RemarkPasses[I]);
19461953
}
19471954

1948-
// We need to hold onto both the streamer and the opened file
1955+
// We need to hold onto both the streamers and the opened file
19491956
std::unique_ptr<llvm::remarks::RemarkStreamer> RemarkStreamer;
1957+
std::unique_ptr<LLVMRemarkStreamer> LlvmRemarkStreamer;
19501958
std::unique_ptr<ToolOutputFile> RemarkFile;
19511959

19521960
if (RemarkFilePath != nullptr) {
@@ -1970,6 +1978,7 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
19701978
report_fatal_error("Cannot create remark serializer");
19711979
}
19721980
RemarkStreamer = std::make_unique<llvm::remarks::RemarkStreamer>(std::move(*RemarkSerializer));
1981+
LlvmRemarkStreamer = std::make_unique<LLVMRemarkStreamer>(*RemarkStreamer);
19731982
}
19741983

19751984
unwrap(C)->setDiagnosticHandler(std::make_unique<RustDiagnosticHandler>(
@@ -1978,6 +1987,7 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
19781987
RemarkAllPasses,
19791988
Passes,
19801989
std::move(RemarkStreamer),
1990+
std::move(LlvmRemarkStreamer),
19811991
std::move(RemarkFile)
19821992
));
19831993
}

0 commit comments

Comments
 (0)