IRPrintingPasses.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. //===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // PrintModulePass and PrintFunctionPass implementations.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "llvm/IR/IRPrintingPasses.h"
  14. #include "llvm/IR/Function.h"
  15. #include "llvm/IR/Module.h"
  16. #include "llvm/IR/PassManager.h"
  17. #include "llvm/IR/AssemblyAnnotationWriter.h" // HLSL Change
  18. #include "llvm/IR/DebugInfoMetadata.h" // HLSL Change
  19. #include "llvm/IR/IntrinsicInst.h" // HLSL Change
  20. #include "llvm/Support/FormattedStream.h" // HLSL Change
  21. #include "llvm/Pass.h"
  22. #include "llvm/Support/Debug.h"
  23. #include "llvm/Support/raw_ostream.h"
  24. #include "dxc/DXIL/DxilUtil.h"
  25. using namespace llvm;
  26. // HLSL Change - Begin
  27. namespace {
  28. class DxilAAW : public llvm::AssemblyAnnotationWriter {
  29. public:
  30. ~DxilAAW() {}
  31. void printInfoComment(const Value &V, formatted_raw_ostream &OS) override {
  32. using namespace llvm;
  33. if (const Instruction *I = dyn_cast<Instruction>(&V)) {
  34. if (isa<DbgInfoIntrinsic>(I)) {
  35. DILocalVariable *Var = nullptr;
  36. DIExpression *Expr = nullptr;
  37. if (const DbgDeclareInst *DI = dyn_cast<DbgDeclareInst>(I)) {
  38. Var = DI->getVariable();
  39. Expr = DI->getExpression();
  40. }
  41. else if (const DbgValueInst *DI = dyn_cast<DbgValueInst>(I)) {
  42. Var = DI->getVariable();
  43. Expr = DI->getExpression();
  44. }
  45. if (Var && Expr) {
  46. OS << " ; var:\"" << Var->getName() << "\"" << " ";
  47. Expr->printAsBody(OS);
  48. }
  49. }
  50. else {
  51. DebugLoc Loc = I->getDebugLoc();
  52. if (Loc && Loc.getLine() != 0)
  53. OS << " ; line:" << Loc.getLine() << " col:" << Loc.getCol();
  54. }
  55. }
  56. }
  57. };
  58. }
  59. // HLSL Change - End
  60. PrintModulePass::PrintModulePass() : OS(dbgs()) {}
  61. PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner,
  62. bool ShouldPreserveUseListOrder)
  63. : OS(OS), Banner(Banner),
  64. ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
  65. PreservedAnalyses PrintModulePass::run(Module &M) {
  66. DxilAAW AAW; // HLSL Change
  67. OS << Banner;
  68. M.print(OS, &AAW, ShouldPreserveUseListOrder); // HLSL Change
  69. return PreservedAnalyses::all();
  70. }
  71. PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
  72. PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
  73. : OS(OS), Banner(Banner) {}
  74. PreservedAnalyses PrintFunctionPass::run(Function &F) {
  75. OS << Banner << static_cast<Value &>(F);
  76. return PreservedAnalyses::all();
  77. }
  78. namespace {
  79. class PrintModulePassWrapper : public ModulePass {
  80. PrintModulePass P;
  81. public:
  82. static char ID;
  83. PrintModulePassWrapper() : ModulePass(ID) {}
  84. PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner,
  85. bool ShouldPreserveUseListOrder)
  86. : ModulePass(ID), P(OS, Banner, ShouldPreserveUseListOrder) {}
  87. bool runOnModule(Module &M) override {
  88. P.run(M);
  89. return false;
  90. }
  91. void getAnalysisUsage(AnalysisUsage &AU) const override {
  92. AU.setPreservesAll();
  93. }
  94. };
  95. class PrintFunctionPassWrapper : public FunctionPass {
  96. PrintFunctionPass P;
  97. public:
  98. static char ID;
  99. PrintFunctionPassWrapper() : FunctionPass(ID) {}
  100. PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
  101. : FunctionPass(ID), P(OS, Banner) {}
  102. // This pass just prints a banner followed by the function as it's processed.
  103. bool runOnFunction(Function &F) override {
  104. P.run(F);
  105. return false;
  106. }
  107. void getAnalysisUsage(AnalysisUsage &AU) const override {
  108. AU.setPreservesAll();
  109. }
  110. };
  111. class PrintBasicBlockPass : public BasicBlockPass {
  112. raw_ostream &Out;
  113. std::string Banner;
  114. public:
  115. static char ID;
  116. PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
  117. PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
  118. : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
  119. bool runOnBasicBlock(BasicBlock &BB) override {
  120. Out << Banner << BB;
  121. return false;
  122. }
  123. void getAnalysisUsage(AnalysisUsage &AU) const override {
  124. AU.setPreservesAll();
  125. }
  126. };
  127. }
  128. char PrintModulePassWrapper::ID = 0;
  129. INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
  130. "Print module to stderr", false, false)
  131. char PrintFunctionPassWrapper::ID = 0;
  132. INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
  133. "Print function to stderr", false, false)
  134. char PrintBasicBlockPass::ID = 0;
  135. INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
  136. false)
  137. ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
  138. const std::string &Banner,
  139. bool ShouldPreserveUseListOrder) {
  140. return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder);
  141. }
  142. FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
  143. const std::string &Banner) {
  144. return new PrintFunctionPassWrapper(OS, Banner);
  145. }
  146. BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
  147. const std::string &Banner) {
  148. return new PrintBasicBlockPass(OS, Banner);
  149. }