10b57cec5SDimitry Andric //===-- Analysis.cpp ------------------------------------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "llvm-c/Analysis.h" 100b57cec5SDimitry Andric #include "llvm/IR/Module.h" 110b57cec5SDimitry Andric #include "llvm/IR/Verifier.h" 120b57cec5SDimitry Andric #include "llvm/InitializePasses.h" 130b57cec5SDimitry Andric #include "llvm/PassRegistry.h" 140b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 150b57cec5SDimitry Andric #include <cstring> 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric using namespace llvm; 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric /// initializeAnalysis - Initialize all passes linked into the Analysis library. 200b57cec5SDimitry Andric void llvm::initializeAnalysis(PassRegistry &Registry) { 210b57cec5SDimitry Andric initializeBasicAAWrapperPassPass(Registry); 220b57cec5SDimitry Andric initializeBlockFrequencyInfoWrapperPassPass(Registry); 230b57cec5SDimitry Andric initializeBranchProbabilityInfoWrapperPassPass(Registry); 240b57cec5SDimitry Andric initializeCallGraphWrapperPassPass(Registry); 250b57cec5SDimitry Andric initializeCallGraphDOTPrinterPass(Registry); 260b57cec5SDimitry Andric initializeCallGraphViewerPass(Registry); 270eae32dcSDimitry Andric initializeCycleInfoWrapperPassPass(Registry); 280b57cec5SDimitry Andric initializeDependenceAnalysisWrapperPassPass(Registry); 290b57cec5SDimitry Andric initializeDominanceFrontierWrapperPassPass(Registry); 30*81ad6265SDimitry Andric initializeDomViewerWrapperPassPass(Registry); 31*81ad6265SDimitry Andric initializeDomPrinterWrapperPassPass(Registry); 32*81ad6265SDimitry Andric initializeDomOnlyViewerWrapperPassPass(Registry); 33*81ad6265SDimitry Andric initializePostDomViewerWrapperPassPass(Registry); 34*81ad6265SDimitry Andric initializeDomOnlyPrinterWrapperPassPass(Registry); 35*81ad6265SDimitry Andric initializePostDomPrinterWrapperPassPass(Registry); 36*81ad6265SDimitry Andric initializePostDomOnlyViewerWrapperPassPass(Registry); 37*81ad6265SDimitry Andric initializePostDomOnlyPrinterWrapperPassPass(Registry); 380b57cec5SDimitry Andric initializeAAResultsWrapperPassPass(Registry); 390b57cec5SDimitry Andric initializeGlobalsAAWrapperPassPass(Registry); 400b57cec5SDimitry Andric initializeIVUsersWrapperPassPass(Registry); 41e8d8bef9SDimitry Andric initializeIRSimilarityIdentifierWrapperPassPass(Registry); 420b57cec5SDimitry Andric initializeLazyBranchProbabilityInfoPassPass(Registry); 430b57cec5SDimitry Andric initializeLazyBlockFrequencyInfoPassPass(Registry); 440b57cec5SDimitry Andric initializeLazyValueInfoWrapperPassPass(Registry); 450b57cec5SDimitry Andric initializeLoopInfoWrapperPassPass(Registry); 460b57cec5SDimitry Andric initializeMemoryDependenceWrapperPassPass(Registry); 470b57cec5SDimitry Andric initializeModuleSummaryIndexWrapperPassPass(Registry); 480b57cec5SDimitry Andric initializeOptimizationRemarkEmitterWrapperPassPass(Registry); 490b57cec5SDimitry Andric initializePhiValuesWrapperPassPass(Registry); 500b57cec5SDimitry Andric initializePostDominatorTreeWrapperPassPass(Registry); 510b57cec5SDimitry Andric initializeRegionInfoPassPass(Registry); 520b57cec5SDimitry Andric initializeRegionViewerPass(Registry); 530b57cec5SDimitry Andric initializeRegionPrinterPass(Registry); 540b57cec5SDimitry Andric initializeRegionOnlyViewerPass(Registry); 550b57cec5SDimitry Andric initializeRegionOnlyPrinterPass(Registry); 560b57cec5SDimitry Andric initializeSCEVAAWrapperPassPass(Registry); 570b57cec5SDimitry Andric initializeScalarEvolutionWrapperPassPass(Registry); 580b57cec5SDimitry Andric initializeStackSafetyGlobalInfoWrapperPassPass(Registry); 590b57cec5SDimitry Andric initializeStackSafetyInfoWrapperPassPass(Registry); 600b57cec5SDimitry Andric initializeTargetTransformInfoWrapperPassPass(Registry); 610b57cec5SDimitry Andric initializeTypeBasedAAWrapperPassPass(Registry); 620b57cec5SDimitry Andric initializeScopedNoAliasAAWrapperPassPass(Registry); 630b57cec5SDimitry Andric initializeLCSSAVerificationPassPass(Registry); 640b57cec5SDimitry Andric initializeMemorySSAWrapperPassPass(Registry); 650b57cec5SDimitry Andric } 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric LLVMBool LLVMVerifyModule(LLVMModuleRef M, LLVMVerifierFailureAction Action, 680b57cec5SDimitry Andric char **OutMessages) { 690b57cec5SDimitry Andric raw_ostream *DebugOS = Action != LLVMReturnStatusAction ? &errs() : nullptr; 700b57cec5SDimitry Andric std::string Messages; 710b57cec5SDimitry Andric raw_string_ostream MsgsOS(Messages); 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric LLVMBool Result = verifyModule(*unwrap(M), OutMessages ? &MsgsOS : DebugOS); 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric // Duplicate the output to stderr. 760b57cec5SDimitry Andric if (DebugOS && OutMessages) 770b57cec5SDimitry Andric *DebugOS << MsgsOS.str(); 780b57cec5SDimitry Andric 790b57cec5SDimitry Andric if (Action == LLVMAbortProcessAction && Result) 800b57cec5SDimitry Andric report_fatal_error("Broken module found, compilation aborted!"); 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric if (OutMessages) 830b57cec5SDimitry Andric *OutMessages = strdup(MsgsOS.str().c_str()); 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric return Result; 860b57cec5SDimitry Andric } 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric LLVMBool LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction Action) { 890b57cec5SDimitry Andric LLVMBool Result = verifyFunction( 900b57cec5SDimitry Andric *unwrap<Function>(Fn), Action != LLVMReturnStatusAction ? &errs() 910b57cec5SDimitry Andric : nullptr); 920b57cec5SDimitry Andric 930b57cec5SDimitry Andric if (Action == LLVMAbortProcessAction && Result) 940b57cec5SDimitry Andric report_fatal_error("Broken function found, compilation aborted!"); 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric return Result; 970b57cec5SDimitry Andric } 980b57cec5SDimitry Andric 990b57cec5SDimitry Andric void LLVMViewFunctionCFG(LLVMValueRef Fn) { 1000b57cec5SDimitry Andric Function *F = unwrap<Function>(Fn); 1010b57cec5SDimitry Andric F->viewCFG(); 1020b57cec5SDimitry Andric } 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric void LLVMViewFunctionCFGOnly(LLVMValueRef Fn) { 1050b57cec5SDimitry Andric Function *F = unwrap<Function>(Fn); 1060b57cec5SDimitry Andric F->viewCFGOnly(); 1070b57cec5SDimitry Andric } 108