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;
111 initialize(
const std::map<AnalysisName, const AnalysisResult *> &Map)
final {
113 auto It = Map.find(Name);
114 if (It == Map.end()) {
116 "dependency graph is not topologically sorted",
121 return initialize(*
static_cast<const DepResultTs *
>(
122 lookup(DepResultTs::analysisName()))...);
126 std::unique_ptr<AnalysisResult> takeResult() &&
final {
127 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.
AnalysisName getAnalysisName() const final
Used by AnalysisRegistry::Add to derive the registry entry name.
ResultT & getResult() &
Mutable access to the result being built.
const std::vector< AnalysisName > & getDependencyNames() const final
AnalysisNames of all AnalysisResult dependencies.
friend class AnalysisRegistry
const ResultT & getResult() const &
Read-only access to the result being built.
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.