122 lines · cpp
1//===-- Analysis.cpp ------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm-c/Analysis.h"10#include "llvm/IR/Module.h"11#include "llvm/IR/Verifier.h"12#include "llvm/InitializePasses.h"13#include "llvm/PassRegistry.h"14#include "llvm/Support/raw_ostream.h"15#include <cstring>16 17using namespace llvm;18 19/// initializeAnalysis - Initialize all passes linked into the Analysis library.20void llvm::initializeAnalysis(PassRegistry &Registry) {21 initializeAssumptionCacheTrackerPass(Registry);22 initializeBasicAAWrapperPassPass(Registry);23 initializeBlockFrequencyInfoWrapperPassPass(Registry);24 initializeBranchProbabilityInfoWrapperPassPass(Registry);25 initializeCallGraphWrapperPassPass(Registry);26 initializeCallGraphDOTPrinterPass(Registry);27 initializeCallGraphViewerPass(Registry);28 initializeCycleInfoWrapperPassPass(Registry);29 initializeDXILMetadataAnalysisWrapperPassPass(Registry);30 initializeDXILResourceWrapperPassPass(Registry);31 initializeDXILResourceBindingWrapperPassPass(Registry);32 initializeDXILResourceTypeWrapperPassPass(Registry);33 initializeDXILResourceWrapperPassPass(Registry);34 initializeDependenceAnalysisWrapperPassPass(Registry);35 initializeDominanceFrontierWrapperPassPass(Registry);36 initializeDomViewerWrapperPassPass(Registry);37 initializeDomPrinterWrapperPassPass(Registry);38 initializeDomOnlyViewerWrapperPassPass(Registry);39 initializePostDomViewerWrapperPassPass(Registry);40 initializeDomOnlyPrinterWrapperPassPass(Registry);41 initializePostDomPrinterWrapperPassPass(Registry);42 initializePostDomOnlyViewerWrapperPassPass(Registry);43 initializePostDomOnlyPrinterWrapperPassPass(Registry);44 initializeAAResultsWrapperPassPass(Registry);45 initializeGlobalsAAWrapperPassPass(Registry);46 initializeExternalAAWrapperPassPass(Registry);47 initializeImmutableModuleSummaryIndexWrapperPassPass(Registry);48 initializeIVUsersWrapperPassPass(Registry);49 initializeIRSimilarityIdentifierWrapperPassPass(Registry);50 initializeLazyBranchProbabilityInfoPassPass(Registry);51 initializeLazyBFIPassPass(Registry);52 initializeLazyBlockFrequencyInfoPassPass(Registry);53 initializeLazyValueInfoWrapperPassPass(Registry);54 initializeLoopInfoWrapperPassPass(Registry);55 initializeMemoryDependenceWrapperPassPass(Registry);56 initializeModuleSummaryIndexWrapperPassPass(Registry);57 initializeOptimizationRemarkEmitterWrapperPassPass(Registry);58 initializePhiValuesWrapperPassPass(Registry);59 initializePostDominatorTreeWrapperPassPass(Registry);60 initializeProfileSummaryInfoWrapperPassPass(Registry);61 initializeRegionInfoPassPass(Registry);62 initializeRegionViewerPass(Registry);63 initializeRegionPrinterPass(Registry);64 initializeRegionOnlyViewerPass(Registry);65 initializeRegionOnlyPrinterPass(Registry);66 initializeRuntimeLibraryInfoWrapperPass(Registry);67 initializeSCEVAAWrapperPassPass(Registry);68 initializeScalarEvolutionWrapperPassPass(Registry);69 initializeStackSafetyGlobalInfoWrapperPassPass(Registry);70 initializeStackSafetyInfoWrapperPassPass(Registry);71 initializeTargetLibraryInfoWrapperPassPass(Registry);72 initializeTargetTransformInfoWrapperPassPass(Registry);73 initializeTypeBasedAAWrapperPassPass(Registry);74 initializeScopedNoAliasAAWrapperPassPass(Registry);75 initializeStaticDataProfileInfoWrapperPassPass(Registry);76 initializeLCSSAVerificationPassPass(Registry);77 initializeMemorySSAWrapperPassPass(Registry);78 initializeUniformityInfoWrapperPassPass(Registry);79}80 81LLVMBool LLVMVerifyModule(LLVMModuleRef M, LLVMVerifierFailureAction Action,82 char **OutMessages) {83 raw_ostream *DebugOS = Action != LLVMReturnStatusAction ? &errs() : nullptr;84 std::string Messages;85 raw_string_ostream MsgsOS(Messages);86 87 LLVMBool Result = verifyModule(*unwrap(M), OutMessages ? &MsgsOS : DebugOS);88 89 // Duplicate the output to stderr.90 if (DebugOS && OutMessages)91 *DebugOS << MsgsOS.str();92 93 if (Action == LLVMAbortProcessAction && Result)94 report_fatal_error("Broken module found, compilation aborted!");95 96 if (OutMessages)97 *OutMessages = strdup(MsgsOS.str().c_str());98 99 return Result;100}101 102LLVMBool LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction Action) {103 LLVMBool Result = verifyFunction(104 *unwrap<Function>(Fn), Action != LLVMReturnStatusAction ? &errs()105 : nullptr);106 107 if (Action == LLVMAbortProcessAction && Result)108 report_fatal_error("Broken function found, compilation aborted!");109 110 return Result;111}112 113void LLVMViewFunctionCFG(LLVMValueRef Fn) {114 Function *F = unwrap<Function>(Fn);115 F->viewCFG();116}117 118void LLVMViewFunctionCFGOnly(LLVMValueRef Fn) {119 Function *F = unwrap<Function>(Fn);120 F->viewCFGOnly();121}122