15#ifndef LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_WHOLEPROGRAMANALYSIS_DERIVEDANALYSIS_H
16#define LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_WHOLEPROGRAMANALYSIS_DERIVEDANALYSIS_H
23#include "llvm/Support/Error.h"
51 const std::map<AnalysisName, const AnalysisResult *> &DepResults) = 0;
58 virtual llvm::Error
finalize() {
return llvm::Error::success(); }
71template <
typename ResultT,
typename... DepResultTs>
73 static_assert(std::is_base_of_v<AnalysisResult, ResultT>,
74 "ResultT must derive from AnalysisResult");
76 "ResultT must have a static analysisName() method");
77 static_assert((std::is_base_of_v<AnalysisResult, DepResultTs> && ...),
78 "Every DepResultT must derive from AnalysisResult");
80 "Every DepResultT must have a static analysisName() method");
83 using ResultType = ResultT;
85 std::unique_ptr<ResultT> Result = std::make_unique<ResultT>();
92 static const std::vector<AnalysisName> Names = {
93 DepResultTs::analysisName()...};
98 virtual llvm::Error
initialize(
const DepResultTs &...) = 0;
105 virtual llvm::Error
finalize() {
return llvm::Error::success(); }
109 const ResultT &
result() const & {
return *Result; }
118 initialize(
const std::map<AnalysisName, const AnalysisResult *> &Map)
final {
120 auto It = Map.find(Name);
121 if (It == Map.end()) {
123 "dependency graph is not topologically sorted",
128 return initialize(*
static_cast<const DepResultTs *
>(
129 lookup(DepResultTs::analysisName()))...);
133 std::unique_ptr<AnalysisResult>
result() &&
final {
134 return std::move(Result);
Orchestrates whole-program analysis over an LUSummary.
Uniquely identifies a whole-program analysis and the AnalysisResult it produces.
Unified registry for SummaryAnalysis and DerivedAnalysis implementations.
Base class for whole-program analysis results.
friend class AnalysisDriver
Typed intermediate that concrete derived analyses inherit from.
virtual llvm::Error initialize(const DepResultTs &...)=0
Called once with the fixed dependency results before the step() loop.
const std::vector< AnalysisName > & dependencyNames() const final
AnalysisNames of all AnalysisResult dependencies.
const ResultT & result() const &
Read-only access to the result being built.
virtual llvm::Expected< bool > step()=0
Performs one step.
AnalysisName analysisName() const final
Used by AnalysisRegistry::Add to derive the registry entry name.
ResultT & result() &
Mutable access to the result being built.
friend class AnalysisRegistry
virtual llvm::Error finalize()
Called after the step() loop converges. Override for post-processing.
static void fatal(const char *Fmt, Args &&...ArgVals)
Report a fatal error with formatted message and terminate execution.
constexpr bool HasAnalysisName_v
void initialize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
void finalize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
float __ovld __cnfn step(float, float)
Returns 0.0 if x < edge, otherwise it returns 1.0.