10000afd8SLang Hames //===-------- StackMapPrinter.h - Pretty-print stackmaps --------*- C++ -*-===// 20000afd8SLang Hames // 30000afd8SLang Hames // The LLVM Compiler Infrastructure 40000afd8SLang Hames // 50000afd8SLang Hames // This file is distributed under the University of Illinois Open Source 60000afd8SLang Hames // License. See LICENSE.TXT for details. 70000afd8SLang Hames // 80000afd8SLang Hames //===----------------------------------------------------------------------===// 90000afd8SLang Hames 100000afd8SLang Hames #ifndef LLVM_TOOLS_LLVM_READOBJ_STACKMAPPRINTER_H 110000afd8SLang Hames #define LLVM_TOOLS_LLVM_READOBJ_STACKMAPPRINTER_H 120000afd8SLang Hames 130000afd8SLang Hames #include "llvm/Object/StackMapParser.h" 14*88e9a15bSSam Clegg #include "llvm/Support/ScopedPrinter.h" 150000afd8SLang Hames 160000afd8SLang Hames namespace llvm { 170000afd8SLang Hames 180000afd8SLang Hames // Pretty print a stackmap to the given ostream. 19*88e9a15bSSam Clegg template <typename StackMapParserT> 20*88e9a15bSSam Clegg void prettyPrintStackMap(ScopedPrinter &W, const StackMapParserT &SMP) { 210000afd8SLang Hames 22*88e9a15bSSam Clegg W.printNumber("LLVM StackMap Version", SMP.getVersion()); 23*88e9a15bSSam Clegg W.printNumber("Num Functions", SMP.getNumFunctions()); 240000afd8SLang Hames 250000afd8SLang Hames // Functions: 260000afd8SLang Hames for (const auto &F : SMP.functions()) 27*88e9a15bSSam Clegg W.startLine() << " Function address: " << F.getFunctionAddress() 2823f06e53SSanjoy Das << ", stack size: " << F.getStackSize() 29*88e9a15bSSam Clegg << ", callsite record count: " << F.getRecordCount() << "\n"; 300000afd8SLang Hames 310000afd8SLang Hames // Constants: 32*88e9a15bSSam Clegg W.printNumber("Num Constants", SMP.getNumConstants()); 330000afd8SLang Hames unsigned ConstantIndex = 0; 340000afd8SLang Hames for (const auto &C : SMP.constants()) 35*88e9a15bSSam Clegg W.startLine() << " #" << ++ConstantIndex << ": " << C.getValue() << "\n"; 360000afd8SLang Hames 370000afd8SLang Hames // Records: 38*88e9a15bSSam Clegg W.printNumber("Num Records", SMP.getNumRecords()); 390000afd8SLang Hames for (const auto &R : SMP.records()) { 40*88e9a15bSSam Clegg W.startLine() << " Record ID: " << R.getID() 410000afd8SLang Hames << ", instruction offset: " << R.getInstructionOffset() 42*88e9a15bSSam Clegg << "\n"; 43*88e9a15bSSam Clegg W.startLine() << " " << R.getNumLocations() << " locations:\n"; 440000afd8SLang Hames 450000afd8SLang Hames unsigned LocationIndex = 0; 460000afd8SLang Hames for (const auto &Loc : R.locations()) { 47*88e9a15bSSam Clegg raw_ostream &OS = W.startLine(); 48*88e9a15bSSam Clegg OS << " #" << ++LocationIndex << ": "; 490000afd8SLang Hames switch (Loc.getKind()) { 500000afd8SLang Hames case StackMapParserT::LocationKind::Register: 51*88e9a15bSSam Clegg OS << "Register R#" << Loc.getDwarfRegNum() << "\n"; 520000afd8SLang Hames break; 530000afd8SLang Hames case StackMapParserT::LocationKind::Direct: 54*88e9a15bSSam Clegg OS << "Direct R#" << Loc.getDwarfRegNum() << " + " << Loc.getOffset() 55*88e9a15bSSam Clegg << "\n"; 560000afd8SLang Hames break; 570000afd8SLang Hames case StackMapParserT::LocationKind::Indirect: 58*88e9a15bSSam Clegg OS << "Indirect [R#" << Loc.getDwarfRegNum() << " + " << Loc.getOffset() 59*88e9a15bSSam Clegg << "]\n"; 600000afd8SLang Hames break; 610000afd8SLang Hames case StackMapParserT::LocationKind::Constant: 62*88e9a15bSSam Clegg OS << "Constant " << Loc.getSmallConstant() << "\n"; 630000afd8SLang Hames break; 640000afd8SLang Hames case StackMapParserT::LocationKind::ConstantIndex: 650000afd8SLang Hames OS << "ConstantIndex #" << Loc.getConstantIndex() << " (" 66*88e9a15bSSam Clegg << SMP.getConstant(Loc.getConstantIndex()).getValue() << ")\n"; 670000afd8SLang Hames break; 680000afd8SLang Hames } 690000afd8SLang Hames } 700000afd8SLang Hames 71*88e9a15bSSam Clegg raw_ostream &OS = W.startLine(); 72*88e9a15bSSam Clegg OS << " " << R.getNumLiveOuts() << " live-outs: [ "; 730000afd8SLang Hames for (const auto &LO : R.liveouts()) 740000afd8SLang Hames OS << "R#" << LO.getDwarfRegNum() << " (" 750000afd8SLang Hames << LO.getSizeInBytes() << "-bytes) "; 760000afd8SLang Hames OS << "]\n"; 770000afd8SLang Hames } 780000afd8SLang Hames } 790000afd8SLang Hames 800000afd8SLang Hames } 810000afd8SLang Hames 820000afd8SLang Hames #endif 83