ScopeNestInfo.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // ScopeNestInfo.cpp //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // Implements ScopeNestInfo class to hold the results of the scope //
  9. // nest analysis. //
  10. // //
  11. ///////////////////////////////////////////////////////////////////////////////
  12. #include "DxilConvPasses/ScopeNestInfo.h"
  13. #include "DxilConvPasses/ScopeNestIterator.h"
  14. #include "llvm/Support/raw_ostream.h"
  15. using namespace llvm;
  16. //----------------------- Scope Nest Info Implementation ---------------------//
  17. void ScopeNestInfo::print(raw_ostream &out) const
  18. {
  19. out << "ScopeNestInfo:\n";
  20. int level = 0;
  21. for (const ScopeNestEvent &element : m_scopeElements) {
  22. if (element.IsEndScope())
  23. --level;
  24. if (element.IsBeginScope()) {
  25. if (element.Block)
  26. indent(out, level, element.Block->getName()) << "\n";
  27. indent(out, level, "@") << element.GetElementTypeName() << "\n";
  28. }
  29. else if (element.IsEndScope()) {
  30. indent(out, level, "@") << element.GetElementTypeName() << "\n";
  31. if (element.Block)
  32. indent(out, level, element.Block->getName()) << "\n";
  33. }
  34. else {
  35. if (element.Block)
  36. indent(out, level, element.Block->getName()) << "\n";
  37. if (element.ElementType == ScopeNestEvent::Type::If_Else ||
  38. element.ElementType == ScopeNestEvent::Type::Switch_Case)
  39. indent(out, level-1, "@") << element.GetElementTypeName() << "\n";
  40. else if (element.ElementType != ScopeNestEvent::Type::Body)
  41. indent(out, level, "@") << element.GetElementTypeName() << "\n";
  42. }
  43. if (element.IsBeginScope())
  44. ++level;
  45. }
  46. }
  47. raw_ostream &ScopeNestInfo::indent(raw_ostream &out, int level, StringRef str) const {
  48. for (int i = 0; i < level; ++i)
  49. out << " ";
  50. out << str;
  51. return out;
  52. }
  53. void ScopeNestInfo::releaseMemory() {
  54. m_scopeElements.clear();
  55. }
  56. void ScopeNestInfo::Analyze(Function &F) {
  57. for (ScopeNestIterator I = ScopeNestIterator::begin(F), E = ScopeNestIterator::end(); I != E; ++I) {
  58. ScopeNestEvent element = *I;
  59. m_scopeElements.push_back(element);
  60. }
  61. }
  62. //----------------------- Wrapper Pass Implementation ------------------------//
  63. char ScopeNestInfoWrapperPass::ID = 0;
  64. INITIALIZE_PASS_BEGIN(ScopeNestInfoWrapperPass, "scopenestinfo", "Scope nest info pass", true, true)
  65. INITIALIZE_PASS_END(ScopeNestInfoWrapperPass, "scopenestinfo", "Scope nest info pass", true, true)
  66. FunctionPass *llvm::createScopeNestInfoWrapperPass() {
  67. return new ScopeNestInfoWrapperPass();
  68. }
  69. bool ScopeNestInfoWrapperPass::runOnFunction(Function &F) {
  70. releaseMemory();
  71. SI.Analyze(F);
  72. return false;
  73. }
  74. void ScopeNestInfoWrapperPass::releaseMemory() {
  75. SI.releaseMemory();
  76. }
  77. void ScopeNestInfoWrapperPass::print(raw_ostream &O, const Module *M) const {
  78. SI.print(O);
  79. }
  80. void ScopeNestInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
  81. AU.setPreservesAll();
  82. }