140 lines
5.4 KiB
C++
140 lines
5.4 KiB
C++
|
//===-- Analysis.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 "llvm-c/Analysis.h"
|
||
|
#include "llvm-c/Initialization.h"
|
||
|
#include "llvm/IR/Module.h"
|
||
|
#include "llvm/IR/Verifier.h"
|
||
|
#include "llvm/InitializePasses.h"
|
||
|
#include "llvm/PassRegistry.h"
|
||
|
#include "llvm/Support/raw_ostream.h"
|
||
|
#include <cstring>
|
||
|
|
||
|
using namespace llvm;
|
||
|
|
||
|
/// initializeAnalysis - Initialize all passes linked into the Analysis library.
|
||
|
void llvm::initializeAnalysis(PassRegistry &Registry) {
|
||
|
initializeAAEvalLegacyPassPass(Registry);
|
||
|
initializeAliasSetPrinterPass(Registry);
|
||
|
initializeBasicAAWrapperPassPass(Registry);
|
||
|
initializeBlockFrequencyInfoWrapperPassPass(Registry);
|
||
|
initializeBranchProbabilityInfoWrapperPassPass(Registry);
|
||
|
initializeCallGraphWrapperPassPass(Registry);
|
||
|
initializeCallGraphDOTPrinterPass(Registry);
|
||
|
initializeCallGraphPrinterLegacyPassPass(Registry);
|
||
|
initializeCallGraphViewerPass(Registry);
|
||
|
initializeCostModelAnalysisPass(Registry);
|
||
|
initializeCFGViewerLegacyPassPass(Registry);
|
||
|
initializeCFGPrinterLegacyPassPass(Registry);
|
||
|
initializeCFGOnlyViewerLegacyPassPass(Registry);
|
||
|
initializeCFGOnlyPrinterLegacyPassPass(Registry);
|
||
|
initializeCFLAndersAAWrapperPassPass(Registry);
|
||
|
initializeCFLSteensAAWrapperPassPass(Registry);
|
||
|
initializeDependenceAnalysisWrapperPassPass(Registry);
|
||
|
initializeDelinearizationPass(Registry);
|
||
|
initializeDemandedBitsWrapperPassPass(Registry);
|
||
|
initializeDominanceFrontierWrapperPassPass(Registry);
|
||
|
initializeDomViewerPass(Registry);
|
||
|
initializeDomPrinterPass(Registry);
|
||
|
initializeDomOnlyViewerPass(Registry);
|
||
|
initializePostDomViewerPass(Registry);
|
||
|
initializeDomOnlyPrinterPass(Registry);
|
||
|
initializePostDomPrinterPass(Registry);
|
||
|
initializePostDomOnlyViewerPass(Registry);
|
||
|
initializePostDomOnlyPrinterPass(Registry);
|
||
|
initializeAAResultsWrapperPassPass(Registry);
|
||
|
initializeGlobalsAAWrapperPassPass(Registry);
|
||
|
initializeIVUsersWrapperPassPass(Registry);
|
||
|
initializeInstCountLegacyPassPass(Registry);
|
||
|
initializeIntervalPartitionPass(Registry);
|
||
|
initializeIRSimilarityIdentifierWrapperPassPass(Registry);
|
||
|
initializeLazyBranchProbabilityInfoPassPass(Registry);
|
||
|
initializeLazyBlockFrequencyInfoPassPass(Registry);
|
||
|
initializeLazyValueInfoWrapperPassPass(Registry);
|
||
|
initializeLazyValueInfoPrinterPass(Registry);
|
||
|
initializeLegacyDivergenceAnalysisPass(Registry);
|
||
|
initializeLintLegacyPassPass(Registry);
|
||
|
initializeLoopInfoWrapperPassPass(Registry);
|
||
|
initializeMemDepPrinterPass(Registry);
|
||
|
initializeMemDerefPrinterPass(Registry);
|
||
|
initializeMemoryDependenceWrapperPassPass(Registry);
|
||
|
initializeModuleDebugInfoLegacyPrinterPass(Registry);
|
||
|
initializeModuleSummaryIndexWrapperPassPass(Registry);
|
||
|
initializeMustExecutePrinterPass(Registry);
|
||
|
initializeMustBeExecutedContextPrinterPass(Registry);
|
||
|
initializeObjCARCAAWrapperPassPass(Registry);
|
||
|
initializeOptimizationRemarkEmitterWrapperPassPass(Registry);
|
||
|
initializePhiValuesWrapperPassPass(Registry);
|
||
|
initializePostDominatorTreeWrapperPassPass(Registry);
|
||
|
initializeRegionInfoPassPass(Registry);
|
||
|
initializeRegionViewerPass(Registry);
|
||
|
initializeRegionPrinterPass(Registry);
|
||
|
initializeRegionOnlyViewerPass(Registry);
|
||
|
initializeRegionOnlyPrinterPass(Registry);
|
||
|
initializeSCEVAAWrapperPassPass(Registry);
|
||
|
initializeScalarEvolutionWrapperPassPass(Registry);
|
||
|
initializeStackSafetyGlobalInfoWrapperPassPass(Registry);
|
||
|
initializeStackSafetyInfoWrapperPassPass(Registry);
|
||
|
initializeTargetTransformInfoWrapperPassPass(Registry);
|
||
|
initializeTypeBasedAAWrapperPassPass(Registry);
|
||
|
initializeScopedNoAliasAAWrapperPassPass(Registry);
|
||
|
initializeLCSSAVerificationPassPass(Registry);
|
||
|
initializeMemorySSAWrapperPassPass(Registry);
|
||
|
initializeMemorySSAPrinterLegacyPassPass(Registry);
|
||
|
}
|
||
|
|
||
|
void LLVMInitializeAnalysis(LLVMPassRegistryRef R) {
|
||
|
initializeAnalysis(*unwrap(R));
|
||
|
}
|
||
|
|
||
|
void LLVMInitializeIPA(LLVMPassRegistryRef R) {
|
||
|
initializeAnalysis(*unwrap(R));
|
||
|
}
|
||
|
|
||
|
LLVMBool LLVMVerifyModule(LLVMModuleRef M, LLVMVerifierFailureAction Action,
|
||
|
char **OutMessages) {
|
||
|
raw_ostream *DebugOS = Action != LLVMReturnStatusAction ? &errs() : nullptr;
|
||
|
std::string Messages;
|
||
|
raw_string_ostream MsgsOS(Messages);
|
||
|
|
||
|
LLVMBool Result = verifyModule(*unwrap(M), OutMessages ? &MsgsOS : DebugOS);
|
||
|
|
||
|
// Duplicate the output to stderr.
|
||
|
if (DebugOS && OutMessages)
|
||
|
*DebugOS << MsgsOS.str();
|
||
|
|
||
|
if (Action == LLVMAbortProcessAction && Result)
|
||
|
report_fatal_error("Broken module found, compilation aborted!");
|
||
|
|
||
|
if (OutMessages)
|
||
|
*OutMessages = strdup(MsgsOS.str().c_str());
|
||
|
|
||
|
return Result;
|
||
|
}
|
||
|
|
||
|
LLVMBool LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction Action) {
|
||
|
LLVMBool Result = verifyFunction(
|
||
|
*unwrap<Function>(Fn), Action != LLVMReturnStatusAction ? &errs()
|
||
|
: nullptr);
|
||
|
|
||
|
if (Action == LLVMAbortProcessAction && Result)
|
||
|
report_fatal_error("Broken function found, compilation aborted!");
|
||
|
|
||
|
return Result;
|
||
|
}
|
||
|
|
||
|
void LLVMViewFunctionCFG(LLVMValueRef Fn) {
|
||
|
Function *F = unwrap<Function>(Fn);
|
||
|
F->viewCFG();
|
||
|
}
|
||
|
|
||
|
void LLVMViewFunctionCFGOnly(LLVMValueRef Fn) {
|
||
|
Function *F = unwrap<Function>(Fn);
|
||
|
F->viewCFGOnly();
|
||
|
}
|