1c3d661a0SGordon Henriksen //===-- Analysis.cpp ------------------------------------------------------===//
2c3d661a0SGordon Henriksen //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c3d661a0SGordon Henriksen //
7c3d661a0SGordon Henriksen //===----------------------------------------------------------------------===//
8c3d661a0SGordon Henriksen
9c3d661a0SGordon Henriksen #include "llvm-c/Analysis.h"
105a656883SBenjamin Kramer #include "llvm-c/Initialization.h"
11dec20e43SFilip Pizlo #include "llvm/IR/Module.h"
125ad5f15cSChandler Carruth #include "llvm/IR/Verifier.h"
138a8cd2baSChandler Carruth #include "llvm/InitializePasses.h"
14dec20e43SFilip Pizlo #include "llvm/PassRegistry.h"
15442f7848SChandler Carruth #include "llvm/Support/raw_ostream.h"
16579f0713SAnton Korobeynikov #include <cstring>
17c3d661a0SGordon Henriksen
18c3d661a0SGordon Henriksen using namespace llvm;
19c3d661a0SGordon Henriksen
206875c2eaSOwen Anderson /// initializeAnalysis - Initialize all passes linked into the Analysis library.
initializeAnalysis(PassRegistry & Registry)216875c2eaSOwen Anderson void llvm::initializeAnalysis(PassRegistry &Registry) {
224f846a5fSChandler Carruth initializeAAEvalLegacyPassPass(Registry);
236875c2eaSOwen Anderson initializeAliasSetPrinterPass(Registry);
247b560d40SChandler Carruth initializeBasicAAWrapperPassPass(Registry);
25deee61e4SWei Mi initializeBlockFrequencyInfoWrapperPassPass(Registry);
26ab23bfbcSCong Hou initializeBranchProbabilityInfoWrapperPassPass(Registry);
277adc3a2bSChandler Carruth initializeCallGraphWrapperPassPass(Registry);
285f432292SChandler Carruth initializeCallGraphDOTPrinterPass(Registry);
291ecd740cSChandler Carruth initializeCallGraphPrinterLegacyPassPass(Registry);
307adc3a2bSChandler Carruth initializeCallGraphViewerPass(Registry);
31a6b91ac3SNadav Rotem initializeCostModelAnalysisPass(Registry);
3206a67ba5SSriraman Tallam initializeCFGViewerLegacyPassPass(Registry);
3306a67ba5SSriraman Tallam initializeCFGPrinterLegacyPassPass(Registry);
3406a67ba5SSriraman Tallam initializeCFGOnlyViewerLegacyPassPass(Registry);
3506a67ba5SSriraman Tallam initializeCFGOnlyPrinterLegacyPassPass(Registry);
36bfa401e5SGeorge Burgess IV initializeCFLAndersAAWrapperPassPass(Registry);
37bfa401e5SGeorge Burgess IV initializeCFLSteensAAWrapperPassPass(Registry);
381d0244aeSSameer Sahasrabuddhe initializeCycleInfoWrapperPassPass(Registry);
3949c22190SChandler Carruth initializeDependenceAnalysisWrapperPassPass(Registry);
40c62c679cSSebastian Pop initializeDelinearizationPass(Registry);
41de16b44fSMichael Kuperstein initializeDemandedBitsWrapperPassPass(Registry);
42751337faSHongbin Zheng initializeDominanceFrontierWrapperPassPass(Registry);
43*7dce9eb6SYang Keao initializeDomViewerWrapperPassPass(Registry);
44*7dce9eb6SYang Keao initializeDomPrinterWrapperPassPass(Registry);
45*7dce9eb6SYang Keao initializeDomOnlyViewerWrapperPassPass(Registry);
46*7dce9eb6SYang Keao initializePostDomViewerWrapperPassPass(Registry);
47*7dce9eb6SYang Keao initializeDomOnlyPrinterWrapperPassPass(Registry);
48*7dce9eb6SYang Keao initializePostDomPrinterWrapperPassPass(Registry);
49*7dce9eb6SYang Keao initializePostDomOnlyViewerWrapperPassPass(Registry);
50*7dce9eb6SYang Keao initializePostDomOnlyPrinterWrapperPassPass(Registry);
517b560d40SChandler Carruth initializeAAResultsWrapperPassPass(Registry);
527b560d40SChandler Carruth initializeGlobalsAAWrapperPassPass(Registry);
531a44452bSDehao Chen initializeIVUsersWrapperPassPass(Registry);
545d7c5a5eSRoman Lebedev initializeInstCountLegacyPassPass(Registry);
556875c2eaSOwen Anderson initializeIntervalPartitionPass(Registry);
56f02c4c87SAndrew Litteken initializeIRSimilarityIdentifierWrapperPassPass(Registry);
57aa3506c5SAdam Nemet initializeLazyBranchProbabilityInfoPassPass(Registry);
58c2f791d8SAdam Nemet initializeLazyBlockFrequencyInfoPassPass(Registry);
59687019faSSean Silva initializeLazyValueInfoWrapperPassPass(Registry);
60e27b39a9SAnna Thomas initializeLazyValueInfoPrinterPass(Registry);
6135617ed4SNicolai Haehnle initializeLegacyDivergenceAnalysisPass(Registry);
62c9771391SArthur Eubanks initializeLintLegacyPassPass(Registry);
634f8f307cSChandler Carruth initializeLoopInfoWrapperPassPass(Registry);
646875c2eaSOwen Anderson initializeMemDepPrinterPass(Registry);
658378ac36SRamkumar Ramachandra initializeMemDerefPrinterPass(Registry);
6661440d22SChandler Carruth initializeMemoryDependenceWrapperPassPass(Registry);
67ea693a16SAmy Huang initializeModuleDebugInfoLegacyPrinterPass(Registry);
682d5487cfSTeresa Johnson initializeModuleSummaryIndexWrapperPassPass(Registry);
6989f22417SPhilip Reames initializeMustExecutePrinterPass(Registry);
70a5b10b46SJohannes Doerfert initializeMustBeExecutedContextPrinterPass(Registry);
717b560d40SChandler Carruth initializeObjCARCAAWrapperPassPass(Registry);
7279ac42a5SAdam Nemet initializeOptimizationRemarkEmitterWrapperPassPass(Registry);
73bdbbd838SJohn Brawn initializePhiValuesWrapperPassPass(Registry);
743f978407SHongbin Zheng initializePostDominatorTreeWrapperPassPass(Registry);
751b8d8379SMatt Arsenault initializeRegionInfoPassPass(Registry);
766875c2eaSOwen Anderson initializeRegionViewerPass(Registry);
776875c2eaSOwen Anderson initializeRegionPrinterPass(Registry);
786875c2eaSOwen Anderson initializeRegionOnlyViewerPass(Registry);
796875c2eaSOwen Anderson initializeRegionOnlyPrinterPass(Registry);
807b560d40SChandler Carruth initializeSCEVAAWrapperPassPass(Registry);
812f1fd165SChandler Carruth initializeScalarEvolutionWrapperPassPass(Registry);
82b8e6fa66SVitaly Buka initializeStackSafetyGlobalInfoWrapperPassPass(Registry);
834493fe1cSVitaly Buka initializeStackSafetyInfoWrapperPassPass(Registry);
84705b185fSChandler Carruth initializeTargetTransformInfoWrapperPassPass(Registry);
857b560d40SChandler Carruth initializeTypeBasedAAWrapperPassPass(Registry);
867b560d40SChandler Carruth initializeScopedNoAliasAAWrapperPassPass(Registry);
87c3ccf5d7SIgor Laevsky initializeLCSSAVerificationPassPass(Registry);
88554dcd8cSDaniel Berlin initializeMemorySSAWrapperPassPass(Registry);
89554dcd8cSDaniel Berlin initializeMemorySSAPrinterLegacyPassPass(Registry);
906875c2eaSOwen Anderson }
916875c2eaSOwen Anderson
LLVMInitializeAnalysis(LLVMPassRegistryRef R)926875c2eaSOwen Anderson void LLVMInitializeAnalysis(LLVMPassRegistryRef R) {
936875c2eaSOwen Anderson initializeAnalysis(*unwrap(R));
946875c2eaSOwen Anderson }
956875c2eaSOwen Anderson
LLVMInitializeIPA(LLVMPassRegistryRef R)967adc3a2bSChandler Carruth void LLVMInitializeIPA(LLVMPassRegistryRef R) {
977adc3a2bSChandler Carruth initializeAnalysis(*unwrap(R));
987adc3a2bSChandler Carruth }
997adc3a2bSChandler Carruth
LLVMVerifyModule(LLVMModuleRef M,LLVMVerifierFailureAction Action,char ** OutMessages)10025963c61SChris Lattner LLVMBool LLVMVerifyModule(LLVMModuleRef M, LLVMVerifierFailureAction Action,
101c3d661a0SGordon Henriksen char **OutMessages) {
1029f008867SCraig Topper raw_ostream *DebugOS = Action != LLVMReturnStatusAction ? &errs() : nullptr;
103e69170a1SAlp Toker std::string Messages;
104e69170a1SAlp Toker raw_string_ostream MsgsOS(Messages);
105c3d661a0SGordon Henriksen
106043949d4SChandler Carruth LLVMBool Result = verifyModule(*unwrap(M), OutMessages ? &MsgsOS : DebugOS);
107043949d4SChandler Carruth
108043949d4SChandler Carruth // Duplicate the output to stderr.
109043949d4SChandler Carruth if (DebugOS && OutMessages)
110043949d4SChandler Carruth *DebugOS << MsgsOS.str();
111043949d4SChandler Carruth
112043949d4SChandler Carruth if (Action == LLVMAbortProcessAction && Result)
113043949d4SChandler Carruth report_fatal_error("Broken module found, compilation aborted!");
114c3d661a0SGordon Henriksen
115e69170a1SAlp Toker if (OutMessages)
116e69170a1SAlp Toker *OutMessages = strdup(MsgsOS.str().c_str());
117c3d661a0SGordon Henriksen
118c3d661a0SGordon Henriksen return Result;
119c3d661a0SGordon Henriksen }
120c3d661a0SGordon Henriksen
LLVMVerifyFunction(LLVMValueRef Fn,LLVMVerifierFailureAction Action)12125963c61SChris Lattner LLVMBool LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction Action) {
122043949d4SChandler Carruth LLVMBool Result = verifyFunction(
1239f008867SCraig Topper *unwrap<Function>(Fn), Action != LLVMReturnStatusAction ? &errs()
1249f008867SCraig Topper : nullptr);
125043949d4SChandler Carruth
126043949d4SChandler Carruth if (Action == LLVMAbortProcessAction && Result)
127043949d4SChandler Carruth report_fatal_error("Broken function found, compilation aborted!");
128043949d4SChandler Carruth
129043949d4SChandler Carruth return Result;
130c3d661a0SGordon Henriksen }
131c3d661a0SGordon Henriksen
LLVMViewFunctionCFG(LLVMValueRef Fn)1324a0da988SErick Tryzelaar void LLVMViewFunctionCFG(LLVMValueRef Fn) {
1334a0da988SErick Tryzelaar Function *F = unwrap<Function>(Fn);
1344a0da988SErick Tryzelaar F->viewCFG();
1354a0da988SErick Tryzelaar }
1364a0da988SErick Tryzelaar
LLVMViewFunctionCFGOnly(LLVMValueRef Fn)1374a0da988SErick Tryzelaar void LLVMViewFunctionCFGOnly(LLVMValueRef Fn) {
1384a0da988SErick Tryzelaar Function *F = unwrap<Function>(Fn);
1394a0da988SErick Tryzelaar F->viewCFGOnly();
1404a0da988SErick Tryzelaar }
141