It enables OptimizationRemarkEmitter::allowExtraAnalysis and MachineOptimizationRemarkEmitter::allowExtraAnalysis to return true not only for -fsave-optimization-record but when specific remarks are requested with
command line options.
The diagnostic handler used to be callback now this patch adds a class
DiagnosticHandler. It has virtual method to provide custom diagnostic handler
and methods to control which particular remarks are enabled. 
However LLVM-C API users can still provide callback function for diagnostic handler.

llvm-svn: 313382
This commit is contained in:
Vivek Pandya
2017-09-15 19:30:59 +00:00
parent aff1c4df25
commit 00d887447b
23 changed files with 415 additions and 246 deletions

View File

@@ -622,12 +622,8 @@ void LTOCodeGenerator::parseCodeGenDebugOptions() {
}
}
void LTOCodeGenerator::DiagnosticHandler(const DiagnosticInfo &DI,
void *Context) {
((LTOCodeGenerator *)Context)->DiagnosticHandler2(DI);
}
void LTOCodeGenerator::DiagnosticHandler2(const DiagnosticInfo &DI) {
void LTOCodeGenerator::DiagnosticHandler(const DiagnosticInfo &DI) {
// Map the LLVM internal diagnostic severity to the LTO diagnostic severity.
lto_codegen_diagnostic_severity_t Severity;
switch (DI.getSeverity()) {
@@ -657,17 +653,29 @@ void LTOCodeGenerator::DiagnosticHandler2(const DiagnosticInfo &DI) {
(*DiagHandler)(Severity, MsgStorage.c_str(), DiagContext);
}
namespace {
struct LTODiagnosticHandler : public DiagnosticHandler {
LTOCodeGenerator *CodeGenerator;
LTODiagnosticHandler(LTOCodeGenerator *CodeGenPtr)
: CodeGenerator(CodeGenPtr) {}
bool handleDiagnostics(const DiagnosticInfo &DI) override {
CodeGenerator->DiagnosticHandler(DI);
return true;
}
};
}
void
LTOCodeGenerator::setDiagnosticHandler(lto_diagnostic_handler_t DiagHandler,
void *Ctxt) {
this->DiagHandler = DiagHandler;
this->DiagContext = Ctxt;
if (!DiagHandler)
return Context.setDiagnosticHandler(nullptr, nullptr);
return Context.setDiagnosticHandler(nullptr);
// Register the LTOCodeGenerator stub in the LLVMContext to forward the
// diagnostic to the external DiagHandler.
Context.setDiagnosticHandler(LTOCodeGenerator::DiagnosticHandler, this,
/* RespectFilters */ true);
Context.setDiagnosticHandler(llvm::make_unique<LTODiagnosticHandler>(this),
true);
}
namespace {