xref: /aosp_15_r20/art/compiler/optimizing/pretty_printer.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_COMPILER_OPTIMIZING_PRETTY_PRINTER_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_OPTIMIZING_PRETTY_PRINTER_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include "android-base/stringprintf.h"
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
23*795d594fSAndroid Build Coastguard Worker #include "nodes.h"
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker class HPrettyPrinter : public HGraphVisitor {
28*795d594fSAndroid Build Coastguard Worker  public:
HPrettyPrinter(HGraph * graph)29*795d594fSAndroid Build Coastguard Worker   explicit HPrettyPrinter(HGraph* graph) : HGraphVisitor(graph) { }
30*795d594fSAndroid Build Coastguard Worker 
PrintPreInstruction(HInstruction * instruction)31*795d594fSAndroid Build Coastguard Worker   void PrintPreInstruction(HInstruction* instruction) {
32*795d594fSAndroid Build Coastguard Worker     PrintString("  ");
33*795d594fSAndroid Build Coastguard Worker     PrintInt(instruction->GetId());
34*795d594fSAndroid Build Coastguard Worker     PrintString(": ");
35*795d594fSAndroid Build Coastguard Worker   }
36*795d594fSAndroid Build Coastguard Worker 
VisitInstruction(HInstruction * instruction)37*795d594fSAndroid Build Coastguard Worker   void VisitInstruction(HInstruction* instruction) override {
38*795d594fSAndroid Build Coastguard Worker     PrintPreInstruction(instruction);
39*795d594fSAndroid Build Coastguard Worker     PrintString(instruction->DebugName());
40*795d594fSAndroid Build Coastguard Worker     PrintPostInstruction(instruction);
41*795d594fSAndroid Build Coastguard Worker   }
42*795d594fSAndroid Build Coastguard Worker 
PrintPostInstruction(HInstruction * instruction)43*795d594fSAndroid Build Coastguard Worker   void PrintPostInstruction(HInstruction* instruction) {
44*795d594fSAndroid Build Coastguard Worker     HConstInputsRef inputs = instruction->GetInputs();
45*795d594fSAndroid Build Coastguard Worker     if (!inputs.empty()) {
46*795d594fSAndroid Build Coastguard Worker       PrintString("(");
47*795d594fSAndroid Build Coastguard Worker       bool first = true;
48*795d594fSAndroid Build Coastguard Worker       for (const HInstruction* input : inputs) {
49*795d594fSAndroid Build Coastguard Worker         if (first) {
50*795d594fSAndroid Build Coastguard Worker           first = false;
51*795d594fSAndroid Build Coastguard Worker         } else {
52*795d594fSAndroid Build Coastguard Worker           PrintString(", ");
53*795d594fSAndroid Build Coastguard Worker         }
54*795d594fSAndroid Build Coastguard Worker         PrintInt(input->GetId());
55*795d594fSAndroid Build Coastguard Worker       }
56*795d594fSAndroid Build Coastguard Worker       PrintString(")");
57*795d594fSAndroid Build Coastguard Worker     }
58*795d594fSAndroid Build Coastguard Worker     if (instruction->HasUses()) {
59*795d594fSAndroid Build Coastguard Worker       PrintString(" [");
60*795d594fSAndroid Build Coastguard Worker       bool first = true;
61*795d594fSAndroid Build Coastguard Worker       for (const HUseListNode<HInstruction*>& use : instruction->GetUses()) {
62*795d594fSAndroid Build Coastguard Worker         if (first) {
63*795d594fSAndroid Build Coastguard Worker           first = false;
64*795d594fSAndroid Build Coastguard Worker         } else {
65*795d594fSAndroid Build Coastguard Worker           PrintString(", ");
66*795d594fSAndroid Build Coastguard Worker         }
67*795d594fSAndroid Build Coastguard Worker         PrintInt(use.GetUser()->GetId());
68*795d594fSAndroid Build Coastguard Worker       }
69*795d594fSAndroid Build Coastguard Worker       PrintString("]");
70*795d594fSAndroid Build Coastguard Worker     }
71*795d594fSAndroid Build Coastguard Worker     PrintNewLine();
72*795d594fSAndroid Build Coastguard Worker   }
73*795d594fSAndroid Build Coastguard Worker 
VisitBasicBlock(HBasicBlock * block)74*795d594fSAndroid Build Coastguard Worker   void VisitBasicBlock(HBasicBlock* block) override {
75*795d594fSAndroid Build Coastguard Worker     PrintString("BasicBlock ");
76*795d594fSAndroid Build Coastguard Worker     PrintInt(block->GetBlockId());
77*795d594fSAndroid Build Coastguard Worker     const ArenaVector<HBasicBlock*>& predecessors = block->GetPredecessors();
78*795d594fSAndroid Build Coastguard Worker     if (!predecessors.empty()) {
79*795d594fSAndroid Build Coastguard Worker       PrintString(", pred: ");
80*795d594fSAndroid Build Coastguard Worker       for (size_t i = 0; i < predecessors.size() -1; i++) {
81*795d594fSAndroid Build Coastguard Worker         PrintInt(predecessors[i]->GetBlockId());
82*795d594fSAndroid Build Coastguard Worker         PrintString(", ");
83*795d594fSAndroid Build Coastguard Worker       }
84*795d594fSAndroid Build Coastguard Worker       PrintInt(predecessors.back()->GetBlockId());
85*795d594fSAndroid Build Coastguard Worker     }
86*795d594fSAndroid Build Coastguard Worker     const ArenaVector<HBasicBlock*>& successors = block->GetSuccessors();
87*795d594fSAndroid Build Coastguard Worker     if (!successors.empty()) {
88*795d594fSAndroid Build Coastguard Worker       PrintString(", succ: ");
89*795d594fSAndroid Build Coastguard Worker       for (size_t i = 0; i < successors.size() - 1; i++) {
90*795d594fSAndroid Build Coastguard Worker         PrintInt(successors[i]->GetBlockId());
91*795d594fSAndroid Build Coastguard Worker         PrintString(", ");
92*795d594fSAndroid Build Coastguard Worker       }
93*795d594fSAndroid Build Coastguard Worker       PrintInt(successors.back()->GetBlockId());
94*795d594fSAndroid Build Coastguard Worker     }
95*795d594fSAndroid Build Coastguard Worker     PrintNewLine();
96*795d594fSAndroid Build Coastguard Worker     HGraphVisitor::VisitBasicBlock(block);
97*795d594fSAndroid Build Coastguard Worker   }
98*795d594fSAndroid Build Coastguard Worker 
99*795d594fSAndroid Build Coastguard Worker   virtual void PrintNewLine() = 0;
100*795d594fSAndroid Build Coastguard Worker   virtual void PrintInt(int value) = 0;
101*795d594fSAndroid Build Coastguard Worker   virtual void PrintString(const char* value) = 0;
102*795d594fSAndroid Build Coastguard Worker 
103*795d594fSAndroid Build Coastguard Worker  private:
104*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(HPrettyPrinter);
105*795d594fSAndroid Build Coastguard Worker };
106*795d594fSAndroid Build Coastguard Worker 
107*795d594fSAndroid Build Coastguard Worker class StringPrettyPrinter : public HPrettyPrinter {
108*795d594fSAndroid Build Coastguard Worker  public:
StringPrettyPrinter(HGraph * graph)109*795d594fSAndroid Build Coastguard Worker   explicit StringPrettyPrinter(HGraph* graph)
110*795d594fSAndroid Build Coastguard Worker       : HPrettyPrinter(graph), str_(""), current_block_(nullptr) { }
111*795d594fSAndroid Build Coastguard Worker 
PrintInt(int value)112*795d594fSAndroid Build Coastguard Worker   void PrintInt(int value) override {
113*795d594fSAndroid Build Coastguard Worker     str_ += android::base::StringPrintf("%d", value);
114*795d594fSAndroid Build Coastguard Worker   }
115*795d594fSAndroid Build Coastguard Worker 
PrintString(const char * value)116*795d594fSAndroid Build Coastguard Worker   void PrintString(const char* value) override {
117*795d594fSAndroid Build Coastguard Worker     str_ += value;
118*795d594fSAndroid Build Coastguard Worker   }
119*795d594fSAndroid Build Coastguard Worker 
PrintNewLine()120*795d594fSAndroid Build Coastguard Worker   void PrintNewLine() override {
121*795d594fSAndroid Build Coastguard Worker     str_ += '\n';
122*795d594fSAndroid Build Coastguard Worker   }
123*795d594fSAndroid Build Coastguard Worker 
Clear()124*795d594fSAndroid Build Coastguard Worker   void Clear() { str_.clear(); }
125*795d594fSAndroid Build Coastguard Worker 
str()126*795d594fSAndroid Build Coastguard Worker   std::string str() const { return str_; }
127*795d594fSAndroid Build Coastguard Worker 
VisitBasicBlock(HBasicBlock * block)128*795d594fSAndroid Build Coastguard Worker   void VisitBasicBlock(HBasicBlock* block) override {
129*795d594fSAndroid Build Coastguard Worker     current_block_ = block;
130*795d594fSAndroid Build Coastguard Worker     HPrettyPrinter::VisitBasicBlock(block);
131*795d594fSAndroid Build Coastguard Worker   }
132*795d594fSAndroid Build Coastguard Worker 
VisitGoto(HGoto * gota)133*795d594fSAndroid Build Coastguard Worker   void VisitGoto(HGoto* gota) override {
134*795d594fSAndroid Build Coastguard Worker     PrintString("  ");
135*795d594fSAndroid Build Coastguard Worker     PrintInt(gota->GetId());
136*795d594fSAndroid Build Coastguard Worker     PrintString(": Goto ");
137*795d594fSAndroid Build Coastguard Worker     PrintInt(current_block_->GetSuccessors()[0]->GetBlockId());
138*795d594fSAndroid Build Coastguard Worker     PrintNewLine();
139*795d594fSAndroid Build Coastguard Worker   }
140*795d594fSAndroid Build Coastguard Worker 
141*795d594fSAndroid Build Coastguard Worker  private:
142*795d594fSAndroid Build Coastguard Worker   std::string str_;
143*795d594fSAndroid Build Coastguard Worker   HBasicBlock* current_block_;
144*795d594fSAndroid Build Coastguard Worker 
145*795d594fSAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(StringPrettyPrinter);
146*795d594fSAndroid Build Coastguard Worker };
147*795d594fSAndroid Build Coastguard Worker 
148*795d594fSAndroid Build Coastguard Worker }  // namespace art
149*795d594fSAndroid Build Coastguard Worker 
150*795d594fSAndroid Build Coastguard Worker #endif  // ART_COMPILER_OPTIMIZING_PRETTY_PRINTER_H_
151