1245431Sdim//===-- IPO.cpp -----------------------------------------------------------===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10218893Sdim// This file implements the common infrastructure (including C bindings) for
11218893Sdim// libLLVMIPO.a, which implements several transformations over the LLVM
12218893Sdim// intermediate representation.
13193323Sed//
14193323Sed//===----------------------------------------------------------------------===//
15193323Sed
16226890Sdim#include "llvm-c/Initialization.h"
17193323Sed#include "llvm-c/Transforms/IPO.h"
18218893Sdim#include "llvm/InitializePasses.h"
19193323Sed#include "llvm/PassManager.h"
20193323Sed#include "llvm/Transforms/IPO.h"
21193323Sed
22193323Sedusing namespace llvm;
23193323Sed
24218893Sdimvoid llvm::initializeIPO(PassRegistry &Registry) {
25218893Sdim  initializeArgPromotionPass(Registry);
26218893Sdim  initializeConstantMergePass(Registry);
27218893Sdim  initializeDAEPass(Registry);
28218893Sdim  initializeDAHPass(Registry);
29218893Sdim  initializeFunctionAttrsPass(Registry);
30218893Sdim  initializeGlobalDCEPass(Registry);
31218893Sdim  initializeGlobalOptPass(Registry);
32218893Sdim  initializeIPCPPass(Registry);
33218893Sdim  initializeAlwaysInlinerPass(Registry);
34218893Sdim  initializeSimpleInlinerPass(Registry);
35218893Sdim  initializeInternalizePassPass(Registry);
36218893Sdim  initializeLoopExtractorPass(Registry);
37218893Sdim  initializeBlockExtractorPassPass(Registry);
38218893Sdim  initializeSingleLoopExtractorPass(Registry);
39218893Sdim  initializeMergeFunctionsPass(Registry);
40218893Sdim  initializePartialInlinerPass(Registry);
41218893Sdim  initializePruneEHPass(Registry);
42218893Sdim  initializeStripDeadPrototypesPassPass(Registry);
43218893Sdim  initializeStripSymbolsPass(Registry);
44218893Sdim  initializeStripDebugDeclarePass(Registry);
45218893Sdim  initializeStripDeadDebugInfoPass(Registry);
46218893Sdim  initializeStripNonDebugSymbolsPass(Registry);
47218893Sdim}
48218893Sdim
49218893Sdimvoid LLVMInitializeIPO(LLVMPassRegistryRef R) {
50218893Sdim  initializeIPO(*unwrap(R));
51218893Sdim}
52218893Sdim
53193323Sedvoid LLVMAddArgumentPromotionPass(LLVMPassManagerRef PM) {
54193323Sed  unwrap(PM)->add(createArgumentPromotionPass());
55193323Sed}
56193323Sed
57193323Sedvoid LLVMAddConstantMergePass(LLVMPassManagerRef PM) {
58193323Sed  unwrap(PM)->add(createConstantMergePass());
59193323Sed}
60193323Sed
61193323Sedvoid LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM) {
62193323Sed  unwrap(PM)->add(createDeadArgEliminationPass());
63193323Sed}
64193323Sed
65193323Sedvoid LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM) {
66193323Sed  unwrap(PM)->add(createFunctionAttrsPass());
67193323Sed}
68193323Sed
69193323Sedvoid LLVMAddFunctionInliningPass(LLVMPassManagerRef PM) {
70193323Sed  unwrap(PM)->add(createFunctionInliningPass());
71193323Sed}
72193323Sed
73226890Sdimvoid LLVMAddAlwaysInlinerPass(LLVMPassManagerRef PM) {
74226890Sdim  unwrap(PM)->add(llvm::createAlwaysInlinerPass());
75226890Sdim}
76226890Sdim
77193323Sedvoid LLVMAddGlobalDCEPass(LLVMPassManagerRef PM) {
78193323Sed  unwrap(PM)->add(createGlobalDCEPass());
79193323Sed}
80193323Sed
81193323Sedvoid LLVMAddGlobalOptimizerPass(LLVMPassManagerRef PM) {
82193323Sed  unwrap(PM)->add(createGlobalOptimizerPass());
83193323Sed}
84193323Sed
85193323Sedvoid LLVMAddIPConstantPropagationPass(LLVMPassManagerRef PM) {
86193323Sed  unwrap(PM)->add(createIPConstantPropagationPass());
87193323Sed}
88193323Sed
89193323Sedvoid LLVMAddPruneEHPass(LLVMPassManagerRef PM) {
90193323Sed  unwrap(PM)->add(createPruneEHPass());
91193323Sed}
92193323Sed
93207618Srdivackyvoid LLVMAddIPSCCPPass(LLVMPassManagerRef PM) {
94207618Srdivacky  unwrap(PM)->add(createIPSCCPPass());
95207618Srdivacky}
96207618Srdivacky
97207618Srdivackyvoid LLVMAddInternalizePass(LLVMPassManagerRef PM, unsigned AllButMain) {
98245431Sdim  std::vector<const char *> Export;
99245431Sdim  if (AllButMain)
100245431Sdim    Export.push_back("main");
101245431Sdim  unwrap(PM)->add(createInternalizePass(Export));
102207618Srdivacky}
103207618Srdivacky
104193323Sedvoid LLVMAddStripDeadPrototypesPass(LLVMPassManagerRef PM) {
105193323Sed  unwrap(PM)->add(createStripDeadPrototypesPass());
106193323Sed}
107193323Sed
108193323Sedvoid LLVMAddStripSymbolsPass(LLVMPassManagerRef PM) {
109193323Sed  unwrap(PM)->add(createStripSymbolsPass());
110193323Sed}
111