llvm-svn: 313389
This commit is contained in:
Vivek Pandya 2017-09-15 20:09:55 +00:00
parent 1be19e6f5b
commit 1dee3be51b

View File

@ -46,6 +46,31 @@ using namespace clang;
using namespace llvm; using namespace llvm;
namespace clang { namespace clang {
class BackendConsumer;
class ClangDiagnosticHandler final : public DiagnosticHandler {
public:
ClangDiagnosticHandler(const CodeGenOptions &CGOpts, BackendConsumer *BCon)
: CodeGenOpts(CGOpts), BackendCon(BCon) {}
bool handleDiagnostics(const DiagnosticInfo &DI) override;
bool isAnalysisRemarkEnable(const std::string &PassName) {
return (CodeGenOpts.OptimizationRemarkAnalysisPattern &&
CodeGenOpts.OptimizationRemarkAnalysisPattern->match(PassName));
}
bool isMissedOptRemarkEnable(const std::string &PassName) {
return (CodeGenOpts.OptimizationRemarkMissedPattern &&
CodeGenOpts.OptimizationRemarkMissedPattern->match(PassName));
}
bool isPassedOptRemarkEnable(const std::string &PassName) {
return (CodeGenOpts.OptimizationRemarkPattern &&
CodeGenOpts.OptimizationRemarkPattern->match(PassName));
}
private:
const CodeGenOptions &CodeGenOpts;
BackendConsumer *BackendCon;
};
class BackendConsumer : public ASTConsumer { class BackendConsumer : public ASTConsumer {
using LinkModule = CodeGenAction::LinkModule; using LinkModule = CodeGenAction::LinkModule;
@ -224,10 +249,10 @@ namespace clang {
void *OldContext = Ctx.getInlineAsmDiagnosticContext(); void *OldContext = Ctx.getInlineAsmDiagnosticContext();
Ctx.setInlineAsmDiagnosticHandler(InlineAsmDiagHandler, this); Ctx.setInlineAsmDiagnosticHandler(InlineAsmDiagHandler, this);
LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler = std::unique_ptr<DiagnosticHandler> OldDiagnosticHandler =
Ctx.getDiagnosticHandler(); Ctx.getDiagnosticHandler();
void *OldDiagnosticContext = Ctx.getDiagnosticContext(); Ctx.setDiagnosticHandler(llvm::make_unique<ClangDiagnosticHandler>(
Ctx.setDiagnosticHandler(DiagnosticHandler, this); CodeGenOpts, this));
Ctx.setDiagnosticsHotnessRequested(CodeGenOpts.DiagnosticsWithHotness); Ctx.setDiagnosticsHotnessRequested(CodeGenOpts.DiagnosticsWithHotness);
if (CodeGenOpts.DiagnosticsHotnessThreshold != 0) if (CodeGenOpts.DiagnosticsHotnessThreshold != 0)
Ctx.setDiagnosticsHotnessThreshold( Ctx.setDiagnosticsHotnessThreshold(
@ -264,7 +289,7 @@ namespace clang {
Ctx.setInlineAsmDiagnosticHandler(OldHandler, OldContext); Ctx.setInlineAsmDiagnosticHandler(OldHandler, OldContext);
Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext); Ctx.setDiagnosticHandler(std::move(OldDiagnosticHandler));
if (OptRecordFile) if (OptRecordFile)
OptRecordFile->keep(); OptRecordFile->keep();
@ -299,11 +324,6 @@ namespace clang {
((BackendConsumer*)Context)->InlineAsmDiagHandler2(SM, Loc); ((BackendConsumer*)Context)->InlineAsmDiagHandler2(SM, Loc);
} }
static void DiagnosticHandler(const llvm::DiagnosticInfo &DI,
void *Context) {
((BackendConsumer *)Context)->DiagnosticHandlerImpl(DI);
}
/// Get the best possible source location to represent a diagnostic that /// Get the best possible source location to represent a diagnostic that
/// may have associated debug info. /// may have associated debug info.
const FullSourceLoc const FullSourceLoc
@ -343,6 +363,11 @@ namespace clang {
void BackendConsumer::anchor() {} void BackendConsumer::anchor() {}
} }
bool ClangDiagnosticHandler::handleDiagnostics(const DiagnosticInfo &DI) {
BackendCon->DiagnosticHandlerImpl(DI);
return true;
}
/// ConvertBackendLocation - Convert a location in a temporary llvm::SourceMgr /// ConvertBackendLocation - Convert a location in a temporary llvm::SourceMgr
/// buffer to be a valid FullSourceLoc. /// buffer to be a valid FullSourceLoc.
static FullSourceLoc ConvertBackendLocation(const llvm::SMDiagnostic &D, static FullSourceLoc ConvertBackendLocation(const llvm::SMDiagnostic &D,