1*0000afd8SLang Hames //===-------- StackMapPrinter.h - Pretty-print stackmaps --------*- C++ -*-===// 2*0000afd8SLang Hames // 3*0000afd8SLang Hames // The LLVM Compiler Infrastructure 4*0000afd8SLang Hames // 5*0000afd8SLang Hames // This file is distributed under the University of Illinois Open Source 6*0000afd8SLang Hames // License. See LICENSE.TXT for details. 7*0000afd8SLang Hames // 8*0000afd8SLang Hames //===----------------------------------------------------------------------===// 9*0000afd8SLang Hames 10*0000afd8SLang Hames #ifndef LLVM_TOOLS_LLVM_READOBJ_STACKMAPPRINTER_H 11*0000afd8SLang Hames #define LLVM_TOOLS_LLVM_READOBJ_STACKMAPPRINTER_H 12*0000afd8SLang Hames 13*0000afd8SLang Hames #include "llvm/Object/StackMapParser.h" 14*0000afd8SLang Hames 15*0000afd8SLang Hames namespace llvm { 16*0000afd8SLang Hames 17*0000afd8SLang Hames // Pretty print a stackmap to the given ostream. 18*0000afd8SLang Hames template <typename OStreamT, typename StackMapParserT> 19*0000afd8SLang Hames void prettyPrintStackMap(OStreamT &OS, const StackMapParserT &SMP) { 20*0000afd8SLang Hames 21*0000afd8SLang Hames OS << "LLVM StackMap Version: " << SMP.getVersion() 22*0000afd8SLang Hames << "\nNum Functions: " << SMP.getNumFunctions(); 23*0000afd8SLang Hames 24*0000afd8SLang Hames // Functions: 25*0000afd8SLang Hames for (const auto &F : SMP.functions()) 26*0000afd8SLang Hames OS << "\n Function address: " << F.getFunctionAddress() 27*0000afd8SLang Hames << ", stack size: " << F.getStackSize(); 28*0000afd8SLang Hames 29*0000afd8SLang Hames // Constants: 30*0000afd8SLang Hames OS << "\nNum Constants: " << SMP.getNumConstants(); 31*0000afd8SLang Hames unsigned ConstantIndex = 0; 32*0000afd8SLang Hames for (const auto &C : SMP.constants()) 33*0000afd8SLang Hames OS << "\n #" << ++ConstantIndex << ": " << C.getValue(); 34*0000afd8SLang Hames 35*0000afd8SLang Hames // Records: 36*0000afd8SLang Hames OS << "\nNum Records: " << SMP.getNumRecords(); 37*0000afd8SLang Hames for (const auto &R : SMP.records()) { 38*0000afd8SLang Hames OS << "\n Record ID: " << R.getID() 39*0000afd8SLang Hames << ", instruction offset: " << R.getInstructionOffset() 40*0000afd8SLang Hames << "\n " << R.getNumLocations() << " locations:"; 41*0000afd8SLang Hames 42*0000afd8SLang Hames unsigned LocationIndex = 0; 43*0000afd8SLang Hames for (const auto &Loc : R.locations()) { 44*0000afd8SLang Hames OS << "\n #" << ++LocationIndex << ": "; 45*0000afd8SLang Hames switch (Loc.getKind()) { 46*0000afd8SLang Hames case StackMapParserT::LocationKind::Register: 47*0000afd8SLang Hames OS << "Register R#" << Loc.getDwarfRegNum(); 48*0000afd8SLang Hames break; 49*0000afd8SLang Hames case StackMapParserT::LocationKind::Direct: 50*0000afd8SLang Hames OS << "Direct R#" << Loc.getDwarfRegNum() << " + " 51*0000afd8SLang Hames << Loc.getOffset(); 52*0000afd8SLang Hames break; 53*0000afd8SLang Hames case StackMapParserT::LocationKind::Indirect: 54*0000afd8SLang Hames OS << "Indirect [R#" << Loc.getDwarfRegNum() << " + " 55*0000afd8SLang Hames << Loc.getOffset() << "]"; 56*0000afd8SLang Hames break; 57*0000afd8SLang Hames case StackMapParserT::LocationKind::Constant: 58*0000afd8SLang Hames OS << "Constant " << Loc.getSmallConstant(); 59*0000afd8SLang Hames break; 60*0000afd8SLang Hames case StackMapParserT::LocationKind::ConstantIndex: 61*0000afd8SLang Hames OS << "ConstantIndex #" << Loc.getConstantIndex() << " (" 62*0000afd8SLang Hames << SMP.getConstant(Loc.getConstantIndex()).getValue() << ")"; 63*0000afd8SLang Hames break; 64*0000afd8SLang Hames } 65*0000afd8SLang Hames } 66*0000afd8SLang Hames 67*0000afd8SLang Hames OS << "\n " << R.getNumLiveOuts() << " live-outs: [ "; 68*0000afd8SLang Hames for (const auto &LO : R.liveouts()) 69*0000afd8SLang Hames OS << "R#" << LO.getDwarfRegNum() << " (" 70*0000afd8SLang Hames << LO.getSizeInBytes() << "-bytes) "; 71*0000afd8SLang Hames OS << "]\n"; 72*0000afd8SLang Hames } 73*0000afd8SLang Hames 74*0000afd8SLang Hames OS << "\n"; 75*0000afd8SLang Hames 76*0000afd8SLang Hames } 77*0000afd8SLang Hames 78*0000afd8SLang Hames } 79*0000afd8SLang Hames 80*0000afd8SLang Hames #endif 81