https://github.com/anonymouspc updated https://github.com/llvm/llvm-project/pull/170415
>From 2151f3b413f839dd8e17acf3e9f718772bb5a770 Mon Sep 17 00:00:00 2001 From: anonymouspc <[email protected]> Date: Wed, 3 Dec 2025 11:27:53 +0800 Subject: [PATCH 1/3] [Clang][Diagnose] Minimal support on emit-include-location in sarif mode --- clang/include/clang/Basic/Sarif.h | 13 +++++ .../include/clang/Frontend/SARIFDiagnostic.h | 10 +++- clang/lib/Basic/Sarif.cpp | 8 +++ clang/lib/Frontend/SARIFDiagnostic.cpp | 55 ++++++++++++++----- 4 files changed, 71 insertions(+), 15 deletions(-) diff --git a/clang/include/clang/Basic/Sarif.h b/clang/include/clang/Basic/Sarif.h index a88d1ee2965a9..154b72d7aa520 100644 --- a/clang/include/clang/Basic/Sarif.h +++ b/clang/include/clang/Basic/Sarif.h @@ -325,6 +325,7 @@ class SarifResult { std::string HostedViewerURI; llvm::SmallDenseMap<StringRef, std::string, 4> PartialFingerprints; llvm::SmallVector<CharSourceRange, 8> Locations; + llvm::SmallVector<CharSourceRange, 8> RelatedLocations; llvm::SmallVector<ThreadFlow, 8> ThreadFlows; std::optional<SarifResultLevel> LevelOverride; @@ -364,6 +365,18 @@ class SarifResult { Locations.assign(DiagLocs.begin(), DiagLocs.end()); return *this; } + + SarifResult setRelatedLocations(llvm::ArrayRef<CharSourceRange> DiagLocs) { +#ifndef NDEBUG + for (const auto &Loc : DiagLocs) { + assert(Loc.isCharRange() && + "SARIF Results require character granular source ranges!"); + } +#endif + RelatedLocations.assign(DiagLocs.begin(), DiagLocs.end()); + return *this; + } + SarifResult setThreadFlows(llvm::ArrayRef<ThreadFlow> ThreadFlowResults) { ThreadFlows.assign(ThreadFlowResults.begin(), ThreadFlowResults.end()); return *this; diff --git a/clang/include/clang/Frontend/SARIFDiagnostic.h b/clang/include/clang/Frontend/SARIFDiagnostic.h index 780f36c874109..5efe665b05ba9 100644 --- a/clang/include/clang/Frontend/SARIFDiagnostic.h +++ b/clang/include/clang/Frontend/SARIFDiagnostic.h @@ -58,15 +58,23 @@ class SARIFDiagnostic : public DiagnosticRenderer { // Shared between SARIFDiagnosticPrinter and this renderer. SarifDocumentWriter *Writer; - SarifResult addLocationToResult(SarifResult Result, FullSourceLoc Loc, + SarifResult addLocationToResult(SarifResult Result, FullSourceLoc Loc, PresumedLoc PLoc, ArrayRef<CharSourceRange> Ranges, const Diagnostic &Diag); + SarifResult addRelatedLocationToResult(SarifResult Result, + FullSourceLoc Loc, PresumedLoc PLoc); + + llvm::SmallVector<CharSourceRange> getSarifLocation(FullSourceLoc Loc, PresumedLoc PLoc, + ArrayRef<CharSourceRange> Ranges); + SarifRule addDiagnosticLevelToRule(SarifRule Rule, DiagnosticsEngine::Level Level); llvm::StringRef emitFilename(StringRef Filename, const SourceManager &SM); + + llvm::SmallVector<std::pair<FullSourceLoc, PresumedLoc>> RelatedLocationsCache; }; } // end namespace clang diff --git a/clang/lib/Basic/Sarif.cpp b/clang/lib/Basic/Sarif.cpp index b3fb9a21249e9..448de96d474af 100644 --- a/clang/lib/Basic/Sarif.cpp +++ b/clang/lib/Basic/Sarif.cpp @@ -404,6 +404,14 @@ void SarifDocumentWriter::appendResult(const SarifResult &Result) { Ret["locations"] = std::move(Locs); } + if (!Result.RelatedLocations.empty()) { + json::Array ReLocs; + for (auto &Range : Result.RelatedLocations) { + ReLocs.emplace_back(createLocation(createPhysicalLocation(Range))); + } + Ret["relatedLocations"] = std::move(ReLocs); + } + if (!Result.PartialFingerprints.empty()) { json::Object fingerprints = {}; for (auto &pair : Result.PartialFingerprints) { diff --git a/clang/lib/Frontend/SARIFDiagnostic.cpp b/clang/lib/Frontend/SARIFDiagnostic.cpp index ac27d7480de3e..33c3b83496a1b 100644 --- a/clang/lib/Frontend/SARIFDiagnostic.cpp +++ b/clang/lib/Frontend/SARIFDiagnostic.cpp @@ -58,12 +58,47 @@ void SARIFDiagnostic::emitDiagnosticMessage( if (Loc.isValid()) Result = addLocationToResult(Result, Loc, PLoc, Ranges, *Diag); + for (auto& [RelLoc, RelPLoc] : RelatedLocationsCache) + Result = addRelatedLocationToResult(Result, RelLoc, RelPLoc); + RelatedLocationsCache.clear(); + Writer->appendResult(Result); } +void SARIFDiagnostic::emitIncludeLocation(FullSourceLoc Loc, PresumedLoc PLoc) { + // We always emit include location before results, for example: + // + // In file included from ... + // In file included from ... + // error: ... + // + // At this time We cannot peek the SarifRule. But what we + // do is to push it into a cache and wait for next time + // \ref SARIFDiagnostic::emitDiagnosticMessage to pick it up. + RelatedLocationsCache.push_back({Loc, PLoc}); +} + +void SARIFDiagnostic::emitImportLocation(FullSourceLoc Loc, PresumedLoc PLoc, + StringRef ModuleName) { + RelatedLocationsCache.push_back({Loc, PLoc}); +} + SarifResult SARIFDiagnostic::addLocationToResult( SarifResult Result, FullSourceLoc Loc, PresumedLoc PLoc, - ArrayRef<CharSourceRange> Ranges, const Diagnostic &Diag) { + ArrayRef<CharSourceRange> Ranges, + const Diagnostic& Diag) { + auto Locations = getSarifLocation(Loc, PLoc, Ranges); + return Result.setLocations(Locations); +} + +SarifResult SARIFDiagnostic::addRelatedLocationToResult( + SarifResult Result, FullSourceLoc Loc, PresumedLoc PLoc) { + auto Locations = getSarifLocation(Loc, PLoc, {}); + return Result.setRelatedLocations(Locations); +} + +llvm::SmallVector<CharSourceRange> SARIFDiagnostic::getSarifLocation( + FullSourceLoc Loc, PresumedLoc PLoc, ArrayRef<CharSourceRange> Ranges) { SmallVector<CharSourceRange> Locations = {}; if (PLoc.isInvalid()) { @@ -75,7 +110,7 @@ SarifResult SARIFDiagnostic::addLocationToResult( // FIXME(llvm-project/issues/57366): File-only locations } } - return Result; + return {}; } FileID CaretFileID = Loc.getExpansionLoc().getFileID(); @@ -127,10 +162,11 @@ SarifResult SARIFDiagnostic::addLocationToResult( SourceLocation DiagLoc = SM.translateLineCol(FID, PLoc.getLine(), ColNo); // FIXME(llvm-project/issues/57366): Properly process #line directives. - Locations.push_back( - CharSourceRange{SourceRange{DiagLoc, DiagLoc}, /* ITR = */ false}); + CharSourceRange Range = {SourceRange{DiagLoc, DiagLoc}, /* ITR = */false}; + if (Range.isValid()) + Locations.push_back(std::move(Range)); - return Result.setLocations(Locations); + return Locations; } SarifRule @@ -207,15 +243,6 @@ void SARIFDiagnostic::emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, assert(false && "Not implemented in SARIF mode"); } -void SARIFDiagnostic::emitIncludeLocation(FullSourceLoc Loc, PresumedLoc PLoc) { - assert(false && "Not implemented in SARIF mode"); -} - -void SARIFDiagnostic::emitImportLocation(FullSourceLoc Loc, PresumedLoc PLoc, - StringRef ModuleName) { - assert(false && "Not implemented in SARIF mode"); -} - void SARIFDiagnostic::emitBuildingModuleLocation(FullSourceLoc Loc, PresumedLoc PLoc, StringRef ModuleName) { >From 94f515d5aed3ed963697b98513368b86018af1d1 Mon Sep 17 00:00:00 2001 From: anonymouspc <[email protected]> Date: Wed, 3 Dec 2025 11:44:54 +0800 Subject: [PATCH 2/3] format --- clang/include/clang/Basic/Sarif.h | 2 +- clang/include/clang/Frontend/SARIFDiagnostic.h | 2 +- clang/lib/Frontend/SARIFDiagnostic.cpp | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Basic/Sarif.h b/clang/include/clang/Basic/Sarif.h index 154b72d7aa520..3ecbe4754e0df 100644 --- a/clang/include/clang/Basic/Sarif.h +++ b/clang/include/clang/Basic/Sarif.h @@ -370,7 +370,7 @@ class SarifResult { #ifndef NDEBUG for (const auto &Loc : DiagLocs) { assert(Loc.isCharRange() && - "SARIF Results require character granular source ranges!"); + "SARIF RelatedLocations require character granular source ranges!"); } #endif RelatedLocations.assign(DiagLocs.begin(), DiagLocs.end()); diff --git a/clang/include/clang/Frontend/SARIFDiagnostic.h b/clang/include/clang/Frontend/SARIFDiagnostic.h index 5efe665b05ba9..2762ad962da59 100644 --- a/clang/include/clang/Frontend/SARIFDiagnostic.h +++ b/clang/include/clang/Frontend/SARIFDiagnostic.h @@ -58,7 +58,7 @@ class SARIFDiagnostic : public DiagnosticRenderer { // Shared between SARIFDiagnosticPrinter and this renderer. SarifDocumentWriter *Writer; - SarifResult addLocationToResult(SarifResult Result, FullSourceLoc Loc, + SarifResult addLocationToResult(SarifResult Result, FullSourceLoc Loc, PresumedLoc PLoc, ArrayRef<CharSourceRange> Ranges, const Diagnostic &Diag); diff --git a/clang/lib/Frontend/SARIFDiagnostic.cpp b/clang/lib/Frontend/SARIFDiagnostic.cpp index 33c3b83496a1b..d5cc91df08480 100644 --- a/clang/lib/Frontend/SARIFDiagnostic.cpp +++ b/clang/lib/Frontend/SARIFDiagnostic.cpp @@ -85,8 +85,7 @@ void SARIFDiagnostic::emitImportLocation(FullSourceLoc Loc, PresumedLoc PLoc, SarifResult SARIFDiagnostic::addLocationToResult( SarifResult Result, FullSourceLoc Loc, PresumedLoc PLoc, - ArrayRef<CharSourceRange> Ranges, - const Diagnostic& Diag) { + ArrayRef<CharSourceRange> Ranges, const Diagnostic& Diag) { auto Locations = getSarifLocation(Loc, PLoc, Ranges); return Result.setLocations(Locations); } >From e2f4ff47c1edab13aed5ded013c77ba506fd3149 Mon Sep 17 00:00:00 2001 From: anonymouspc <[email protected]> Date: Wed, 3 Dec 2025 11:46:55 +0800 Subject: [PATCH 3/3] format --- clang/lib/Frontend/SARIFDiagnostic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Frontend/SARIFDiagnostic.cpp b/clang/lib/Frontend/SARIFDiagnostic.cpp index d5cc91df08480..684238d246026 100644 --- a/clang/lib/Frontend/SARIFDiagnostic.cpp +++ b/clang/lib/Frontend/SARIFDiagnostic.cpp @@ -85,7 +85,7 @@ void SARIFDiagnostic::emitImportLocation(FullSourceLoc Loc, PresumedLoc PLoc, SarifResult SARIFDiagnostic::addLocationToResult( SarifResult Result, FullSourceLoc Loc, PresumedLoc PLoc, - ArrayRef<CharSourceRange> Ranges, const Diagnostic& Diag) { + ArrayRef<CharSourceRange> Ranges, const Diagnostic &Diag) { auto Locations = getSarifLocation(Loc, PLoc, Ranges); return Result.setLocations(Locations); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
