Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

112 lines
3.8 KiB
C++

//===-- Logger.cpp --------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "clang/Analysis/FlowSensitive/Logger.h"
#include "clang/Analysis/FlowSensitive/AdornedCFG.h"
#include "clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h"
#include "llvm/Support/WithColor.h"
namespace clang::dataflow {
Logger &Logger::null() {
struct NullLogger final : Logger {};
static auto *Instance = new NullLogger();
return *Instance;
}
namespace {
struct TextualLogger final : Logger {
llvm::raw_ostream &OS;
const CFG *CurrentCFG;
const CFGBlock *CurrentBlock;
const CFGElement *CurrentElement;
unsigned CurrentElementIndex;
bool ShowColors;
llvm::DenseMap<const CFGBlock *, unsigned> VisitCount;
TypeErasedDataflowAnalysis *CurrentAnalysis;
TextualLogger(llvm::raw_ostream &OS)
: OS(OS), ShowColors(llvm::WithColor::defaultAutoDetectFunction()(OS)) {}
virtual void beginAnalysis(const AdornedCFG &ACFG,
TypeErasedDataflowAnalysis &Analysis) override {
{
llvm::WithColor Header(OS, llvm::raw_ostream::Colors::RED, /*Bold=*/true);
OS << "=== Beginning data flow analysis ===\n";
}
auto &D = ACFG.getDecl();
D.print(OS);
OS << "\n";
D.dump(OS);
CurrentCFG = &ACFG.getCFG();
CurrentCFG->print(OS, Analysis.getASTContext().getLangOpts(), ShowColors);
CurrentAnalysis = &Analysis;
}
virtual void endAnalysis() override {
llvm::WithColor Header(OS, llvm::raw_ostream::Colors::RED, /*Bold=*/true);
unsigned Blocks = 0, Steps = 0;
for (const auto &E : VisitCount) {
++Blocks;
Steps += E.second;
}
llvm::errs() << "=== Finished analysis: " << Blocks << " blocks in "
<< Steps << " total steps ===\n";
}
virtual void enterBlock(const CFGBlock &Block, bool PostVisit) override {
unsigned Count = ++VisitCount[&Block];
{
llvm::WithColor Header(OS, llvm::raw_ostream::Colors::RED, /*Bold=*/true);
OS << "=== Entering block B" << Block.getBlockID();
if (PostVisit)
OS << " (post-visit)";
else
OS << " (iteration " << Count << ")";
OS << " ===\n";
}
Block.print(OS, CurrentCFG, CurrentAnalysis->getASTContext().getLangOpts(),
ShowColors);
CurrentBlock = &Block;
CurrentElement = nullptr;
CurrentElementIndex = 0;
}
virtual void enterElement(const CFGElement &Element) override {
++CurrentElementIndex;
CurrentElement = &Element;
{
llvm::WithColor Subheader(OS, llvm::raw_ostream::Colors::CYAN,
/*Bold=*/true);
OS << "Processing element B" << CurrentBlock->getBlockID() << "."
<< CurrentElementIndex << ": ";
Element.dumpToStream(OS);
}
}
void recordState(TypeErasedDataflowAnalysisState &State) override {
{
llvm::WithColor Subheader(OS, llvm::raw_ostream::Colors::CYAN,
/*Bold=*/true);
OS << "Computed state for B" << CurrentBlock->getBlockID() << "."
<< CurrentElementIndex << ":\n";
}
// FIXME: currently the environment dump is verbose and unenlightening.
// FIXME: dump the user-defined lattice, too.
State.Env.dump(OS);
OS << "\n";
}
void blockConverged() override {
OS << "B" << CurrentBlock->getBlockID() << " has converged!\n";
}
virtual void logText(llvm::StringRef S) override { OS << S << "\n"; }
};
} // namespace
std::unique_ptr<Logger> Logger::textual(llvm::raw_ostream &OS) {
return std::make_unique<TextualLogger>(OS);
}
} // namespace clang::dataflow