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