IPO.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //===-- IPO.cpp -----------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file implements the common infrastructure (including C bindings) for
  10. // libLLVMIPO.a, which implements several transformations over the LLVM
  11. // intermediate representation.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "llvm-c/Transforms/IPO.h"
  15. #include "llvm-c/Initialization.h"
  16. #include "llvm/IR/LegacyPassManager.h"
  17. #include "llvm/InitializePasses.h"
  18. #include "llvm/Transforms/IPO.h"
  19. #include "llvm/Transforms/IPO/AlwaysInliner.h"
  20. #include "llvm/Transforms/IPO/FunctionAttrs.h"
  21. using namespace llvm;
  22. void llvm::initializeIPO(PassRegistry &Registry) {
  23. initializeOpenMPOptCGSCCLegacyPassPass(Registry);
  24. initializeArgPromotionPass(Registry);
  25. initializeAnnotation2MetadataLegacyPass(Registry);
  26. initializeCalledValuePropagationLegacyPassPass(Registry);
  27. initializeConstantMergeLegacyPassPass(Registry);
  28. initializeCrossDSOCFIPass(Registry);
  29. initializeDAEPass(Registry);
  30. initializeDAHPass(Registry);
  31. initializeForceFunctionAttrsLegacyPassPass(Registry);
  32. initializeFunctionSpecializationLegacyPassPass(Registry);
  33. initializeGlobalDCELegacyPassPass(Registry);
  34. initializeGlobalOptLegacyPassPass(Registry);
  35. initializeGlobalSplitPass(Registry);
  36. initializeHotColdSplittingLegacyPassPass(Registry);
  37. initializeIROutlinerLegacyPassPass(Registry);
  38. initializeAlwaysInlinerLegacyPassPass(Registry);
  39. initializeSimpleInlinerPass(Registry);
  40. initializeInferFunctionAttrsLegacyPassPass(Registry);
  41. initializeInternalizeLegacyPassPass(Registry);
  42. initializeLoopExtractorLegacyPassPass(Registry);
  43. initializeBlockExtractorLegacyPassPass(Registry);
  44. initializeSingleLoopExtractorPass(Registry);
  45. initializeLowerTypeTestsPass(Registry);
  46. initializeMergeFunctionsLegacyPassPass(Registry);
  47. initializePartialInlinerLegacyPassPass(Registry);
  48. initializeAttributorLegacyPassPass(Registry);
  49. initializeAttributorCGSCCLegacyPassPass(Registry);
  50. initializePostOrderFunctionAttrsLegacyPassPass(Registry);
  51. initializeReversePostOrderFunctionAttrsLegacyPassPass(Registry);
  52. initializePruneEHPass(Registry);
  53. initializeIPSCCPLegacyPassPass(Registry);
  54. initializeStripDeadPrototypesLegacyPassPass(Registry);
  55. initializeStripSymbolsPass(Registry);
  56. initializeStripDebugDeclarePass(Registry);
  57. initializeStripDeadDebugInfoPass(Registry);
  58. initializeStripNonDebugSymbolsPass(Registry);
  59. initializeBarrierNoopPass(Registry);
  60. initializeEliminateAvailableExternallyLegacyPassPass(Registry);
  61. initializeSampleProfileLoaderLegacyPassPass(Registry);
  62. initializeFunctionImportLegacyPassPass(Registry);
  63. initializeWholeProgramDevirtPass(Registry);
  64. }
  65. void LLVMInitializeIPO(LLVMPassRegistryRef R) {
  66. initializeIPO(*unwrap(R));
  67. }
  68. void LLVMAddArgumentPromotionPass(LLVMPassManagerRef PM) {
  69. unwrap(PM)->add(createArgumentPromotionPass());
  70. }
  71. void LLVMAddCalledValuePropagationPass(LLVMPassManagerRef PM) {
  72. unwrap(PM)->add(createCalledValuePropagationPass());
  73. }
  74. void LLVMAddConstantMergePass(LLVMPassManagerRef PM) {
  75. unwrap(PM)->add(createConstantMergePass());
  76. }
  77. void LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM) {
  78. unwrap(PM)->add(createDeadArgEliminationPass());
  79. }
  80. void LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM) {
  81. unwrap(PM)->add(createPostOrderFunctionAttrsLegacyPass());
  82. }
  83. void LLVMAddFunctionInliningPass(LLVMPassManagerRef PM) {
  84. unwrap(PM)->add(createFunctionInliningPass());
  85. }
  86. void LLVMAddAlwaysInlinerPass(LLVMPassManagerRef PM) {
  87. unwrap(PM)->add(llvm::createAlwaysInlinerLegacyPass());
  88. }
  89. void LLVMAddGlobalDCEPass(LLVMPassManagerRef PM) {
  90. unwrap(PM)->add(createGlobalDCEPass());
  91. }
  92. void LLVMAddGlobalOptimizerPass(LLVMPassManagerRef PM) {
  93. unwrap(PM)->add(createGlobalOptimizerPass());
  94. }
  95. void LLVMAddPruneEHPass(LLVMPassManagerRef PM) {
  96. unwrap(PM)->add(createPruneEHPass());
  97. }
  98. void LLVMAddIPSCCPPass(LLVMPassManagerRef PM) {
  99. unwrap(PM)->add(createIPSCCPPass());
  100. }
  101. void LLVMAddMergeFunctionsPass(LLVMPassManagerRef PM) {
  102. unwrap(PM)->add(createMergeFunctionsPass());
  103. }
  104. void LLVMAddInternalizePass(LLVMPassManagerRef PM, unsigned AllButMain) {
  105. auto PreserveMain = [=](const GlobalValue &GV) {
  106. return AllButMain && GV.getName() == "main";
  107. };
  108. unwrap(PM)->add(createInternalizePass(PreserveMain));
  109. }
  110. void LLVMAddInternalizePassWithMustPreservePredicate(
  111. LLVMPassManagerRef PM,
  112. void *Context,
  113. LLVMBool (*Pred)(LLVMValueRef, void *)) {
  114. unwrap(PM)->add(createInternalizePass([=](const GlobalValue &GV) {
  115. return Pred(wrap(&GV), Context) == 0 ? false : true;
  116. }));
  117. }
  118. void LLVMAddStripDeadPrototypesPass(LLVMPassManagerRef PM) {
  119. unwrap(PM)->add(createStripDeadPrototypesPass());
  120. }
  121. void LLVMAddStripSymbolsPass(LLVMPassManagerRef PM) {
  122. unwrap(PM)->add(createStripSymbolsPass());
  123. }