119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- Analysis.cpp ------------------------------------------------------===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm-c/Analysis.h"
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm-c/Initialization.h"
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/InitializePasses.h"
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Analysis/Verifier.h"
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include <cstring>
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm;
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// initializeAnalysis - Initialize all passes linked into the Analysis library.
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid llvm::initializeAnalysis(PassRegistry &Registry) {
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeAliasAnalysisAnalysisGroup(Registry);
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeAliasAnalysisCounterPass(Registry);
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeAAEvalPass(Registry);
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeAliasDebuggerPass(Registry);
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeAliasSetPrinterPass(Registry);
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeNoAAPass(Registry);
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeBasicAliasAnalysisPass(Registry);
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeBlockFrequencyInfoPass(Registry);
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeBranchProbabilityInfoPass(Registry);
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeCFGViewerPass(Registry);
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeCFGPrinterPass(Registry);
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeCFGOnlyViewerPass(Registry);
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeCFGOnlyPrinterPass(Registry);
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializePrintDbgInfoPass(Registry);
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeDominanceFrontierPass(Registry);
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeDomViewerPass(Registry);
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeDomPrinterPass(Registry);
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeDomOnlyViewerPass(Registry);
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializePostDomViewerPass(Registry);
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeDomOnlyPrinterPass(Registry);
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializePostDomPrinterPass(Registry);
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializePostDomOnlyViewerPass(Registry);
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializePostDomOnlyPrinterPass(Registry);
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeIVUsersPass(Registry);
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeInstCountPass(Registry);
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeIntervalPartitionPass(Registry);
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeLazyValueInfoPass(Registry);
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeLibCallAliasAnalysisPass(Registry);
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeLintPass(Registry);
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeLoopDependenceAnalysisPass(Registry);
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeLoopInfoPass(Registry);
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeMemDepPrinterPass(Registry);
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeMemoryDependenceAnalysisPass(Registry);
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeModuleDebugInfoPrinterPass(Registry);
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializePostDominatorTreePass(Registry);
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeProfileEstimatorPassPass(Registry);
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeNoProfileInfoPass(Registry);
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeNoPathProfileInfoPass(Registry);
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeProfileInfoAnalysisGroup(Registry);
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializePathProfileInfoAnalysisGroup(Registry);
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeLoaderPassPass(Registry);
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializePathProfileLoaderPassPass(Registry);
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeProfileVerifierPassPass(Registry);
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializePathProfileVerifierPass(Registry);
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeRegionInfoPass(Registry);
6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeRegionViewerPass(Registry);
6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeRegionPrinterPass(Registry);
6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeRegionOnlyViewerPass(Registry);
6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeRegionOnlyPrinterPass(Registry);
6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeScalarEvolutionPass(Registry);
7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeScalarEvolutionAliasAnalysisPass(Registry);
7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeTypeBasedAliasAnalysisPass(Registry);
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid LLVMInitializeAnalysis(LLVMPassRegistryRef R) {
7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeAnalysis(*unwrap(R));
7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanLLVMBool LLVMVerifyModule(LLVMModuleRef M, LLVMVerifierFailureAction Action,
7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                          char **OutMessages) {
8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  std::string Messages;
8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  LLVMBool Result = verifyModule(*unwrap(M),
8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                            static_cast<VerifierFailureAction>(Action),
8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                            OutMessages? &Messages : 0);
8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (OutMessages)
8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    *OutMessages = strdup(Messages.c_str());
8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return Result;
9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanLLVMBool LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction Action) {
9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return verifyFunction(*unwrap<Function>(Fn),
9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        static_cast<VerifierFailureAction>(Action));
9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid LLVMViewFunctionCFG(LLVMValueRef Fn) {
9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Function *F = unwrap<Function>(Fn);
9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  F->viewCFG();
10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid LLVMViewFunctionCFGOnly(LLVMValueRef Fn) {
10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Function *F = unwrap<Function>(Fn);
10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  F->viewCFGOnly();
10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
106