blob: 8e1ea954d9afd72b5c74d258bcd515e51e2941f4 [file]
//===- AnalysisRegistry.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/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.h"
#include "clang/ScalableStaticAnalysisFramework/Core/Support/ErrorBuilder.h"
#include "llvm/ADT/STLExtras.h"
using namespace clang;
using namespace ssaf;
using RegistryT = llvm::Registry<AnalysisBase>;
// NOLINTNEXTLINE(misc-use-internal-linkage)
volatile int SSAFAnalysisRegistryAnchorSource = 0;
LLVM_INSTANTIATE_REGISTRY(RegistryT)
std::vector<AnalysisName> &AnalysisRegistry::getAnalysisNames() {
static std::vector<AnalysisName> Names;
return Names;
}
bool AnalysisRegistry::contains(const AnalysisName &Name) {
return llvm::is_contained(getAnalysisNames(), Name);
}
const std::vector<AnalysisName> &AnalysisRegistry::names() {
return getAnalysisNames();
}
llvm::Expected<std::unique_ptr<AnalysisBase>>
AnalysisRegistry::instantiate(const AnalysisName &Name) {
for (const auto &Entry : RegistryT::entries()) {
if (Entry.getName() == Name.str()) {
return std::unique_ptr<AnalysisBase>(Entry.instantiate());
}
}
return ErrorBuilder::create(std::errc::invalid_argument,
"no analysis registered for '{0}'", Name)
.build();
}