mirror of
https://github.com/intel/llvm.git
synced 2026-02-05 04:04:23 +08:00
DiagnosticHandler: refactor error checking (#75889)
In LLVMContext::diagnose, set `HasErrors` for `DS_Error` so that all derived `DiagnosticHandler` have correct `HasErrors` information. An alternative is to set `HasErrors` in `DiagnosticHandler::handleDiagnostics`, but all derived `handleDiagnostics` would have to call the base function.
This commit is contained in:
@@ -418,8 +418,6 @@ void BackendConsumer::anchor() { }
|
||||
} // namespace clang
|
||||
|
||||
bool ClangDiagnosticHandler::handleDiagnostics(const DiagnosticInfo &DI) {
|
||||
if (DI.getSeverity() == DS_Error)
|
||||
HasErrors = true;
|
||||
BackendCon->DiagnosticHandlerImpl(DI);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -256,10 +256,13 @@ void LLVMContext::diagnose(const DiagnosticInfo &DI) {
|
||||
RS->emit(*OptDiagBase);
|
||||
|
||||
// If there is a report handler, use it.
|
||||
if (pImpl->DiagHandler &&
|
||||
(!pImpl->RespectDiagnosticFilters || isDiagnosticEnabled(DI)) &&
|
||||
pImpl->DiagHandler->handleDiagnostics(DI))
|
||||
return;
|
||||
if (pImpl->DiagHandler) {
|
||||
if (DI.getSeverity() == DS_Error)
|
||||
pImpl->DiagHandler->HasErrors = true;
|
||||
if ((!pImpl->RespectDiagnosticFilters || isDiagnosticEnabled(DI)) &&
|
||||
pImpl->DiagHandler->handleDiagnostics(DI))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isDiagnosticEnabled(DI))
|
||||
return;
|
||||
|
||||
@@ -307,16 +307,12 @@ static std::unique_ptr<ToolOutputFile> GetOutputStream(const char *TargetName,
|
||||
}
|
||||
|
||||
struct LLCDiagnosticHandler : public DiagnosticHandler {
|
||||
bool *HasError;
|
||||
LLCDiagnosticHandler(bool *HasErrorPtr) : HasError(HasErrorPtr) {}
|
||||
bool handleDiagnostics(const DiagnosticInfo &DI) override {
|
||||
DiagnosticHandler::handleDiagnostics(DI);
|
||||
if (DI.getKind() == llvm::DK_SrcMgr) {
|
||||
const auto &DISM = cast<DiagnosticInfoSrcMgr>(DI);
|
||||
const SMDiagnostic &SMD = DISM.getSMDiag();
|
||||
|
||||
if (SMD.getKind() == SourceMgr::DK_Error)
|
||||
*HasError = true;
|
||||
|
||||
SMD.print(nullptr, errs());
|
||||
|
||||
// For testing purposes, we print the LocCookie here.
|
||||
@@ -326,9 +322,6 @@ struct LLCDiagnosticHandler : public DiagnosticHandler {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (DI.getSeverity() == DS_Error)
|
||||
*HasError = true;
|
||||
|
||||
if (auto *Remark = dyn_cast<DiagnosticInfoOptimizationBase>(&DI))
|
||||
if (!Remark->isEnabled())
|
||||
return true;
|
||||
@@ -413,9 +406,7 @@ int main(int argc, char **argv) {
|
||||
Context.setDiscardValueNames(DiscardValueNames);
|
||||
|
||||
// Set a diagnostic handler that doesn't exit on the first error
|
||||
bool HasError = false;
|
||||
Context.setDiagnosticHandler(
|
||||
std::make_unique<LLCDiagnosticHandler>(&HasError));
|
||||
Context.setDiagnosticHandler(std::make_unique<LLCDiagnosticHandler>());
|
||||
|
||||
Expected<std::unique_ptr<ToolOutputFile>> RemarksFileOrErr =
|
||||
setupLLVMOptimizationRemarks(Context, RemarksFilename, RemarksPasses,
|
||||
@@ -757,9 +748,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
|
||||
|
||||
PM.run(*M);
|
||||
|
||||
auto HasError =
|
||||
((const LLCDiagnosticHandler *)(Context.getDiagHandlerPtr()))->HasError;
|
||||
if (*HasError)
|
||||
if (Context.getDiagHandlerPtr()->HasErrors)
|
||||
return 1;
|
||||
|
||||
// Compare the two outputs and make sure they're the same
|
||||
|
||||
Reference in New Issue
Block a user