xref: /freebsd-src/contrib/llvm-project/llvm/lib/Analysis/Analysis.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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