filter LLVM diagnostics before crossing the rust bridge
this will eliminate many short-lived allocations (e.g. 20% of the memory used building cargo) when unpacking the diagnostic and converting its various C++ strings into rust strings, just to be filtered out most of the time.
This commit is contained in:
parent
598acffa60
commit
77d01103a3
1 changed files with 10 additions and 3 deletions
|
@ -1905,12 +1905,19 @@ extern "C" void LLVMRustContextConfigureDiagnosticHandler(
|
||||||
LlvmRemarkStreamer(std::move(LlvmRemarkStreamer)) {}
|
LlvmRemarkStreamer(std::move(LlvmRemarkStreamer)) {}
|
||||||
|
|
||||||
virtual bool handleDiagnostics(const DiagnosticInfo &DI) override {
|
virtual bool handleDiagnostics(const DiagnosticInfo &DI) override {
|
||||||
if (this->LlvmRemarkStreamer) {
|
// If this diagnostic is one of the optimization remark kinds, we can check if it's enabled
|
||||||
if (auto *OptDiagBase = dyn_cast<DiagnosticInfoOptimizationBase>(&DI)) {
|
// before emitting it. This can avoid many short-lived allocations when unpacking the
|
||||||
if (OptDiagBase->isEnabled()) {
|
// diagnostic and converting its various C++ strings into rust strings.
|
||||||
|
// FIXME: some diagnostic infos still allocate before we get here, and avoiding that would be
|
||||||
|
// good in the future. That will require changing a few call sites in LLVM.
|
||||||
|
if (auto *OptDiagBase = dyn_cast<DiagnosticInfoOptimizationBase>(&DI)) {
|
||||||
|
if (OptDiagBase->isEnabled()) {
|
||||||
|
if (this->LlvmRemarkStreamer) {
|
||||||
this->LlvmRemarkStreamer->emit(*OptDiagBase);
|
this->LlvmRemarkStreamer->emit(*OptDiagBase);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (DiagnosticHandlerCallback) {
|
if (DiagnosticHandlerCallback) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue