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" 140000afd8SLang Hames 150000afd8SLang Hames namespace llvm { 160000afd8SLang Hames 170000afd8SLang Hames // Pretty print a stackmap to the given ostream. 180000afd8SLang Hames template <typename OStreamT, typename StackMapParserT> 190000afd8SLang Hames void prettyPrintStackMap(OStreamT &OS, const StackMapParserT &SMP) { 200000afd8SLang Hames 210000afd8SLang Hames OS << "LLVM StackMap Version: " << SMP.getVersion() 220000afd8SLang Hames << "\nNum Functions: " << SMP.getNumFunctions(); 230000afd8SLang Hames 240000afd8SLang Hames // Functions: 250000afd8SLang Hames for (const auto &F : SMP.functions()) 260000afd8SLang Hames OS << "\n Function address: " << F.getFunctionAddress() 27*23f06e53SSanjoy Das << ", stack size: " << F.getStackSize() 28*23f06e53SSanjoy Das << ", callsite record count: " << F.getRecordCount(); 290000afd8SLang Hames 300000afd8SLang Hames // Constants: 310000afd8SLang Hames OS << "\nNum Constants: " << SMP.getNumConstants(); 320000afd8SLang Hames unsigned ConstantIndex = 0; 330000afd8SLang Hames for (const auto &C : SMP.constants()) 340000afd8SLang Hames OS << "\n #" << ++ConstantIndex << ": " << C.getValue(); 350000afd8SLang Hames 360000afd8SLang Hames // Records: 370000afd8SLang Hames OS << "\nNum Records: " << SMP.getNumRecords(); 380000afd8SLang Hames for (const auto &R : SMP.records()) { 390000afd8SLang Hames OS << "\n Record ID: " << R.getID() 400000afd8SLang Hames << ", instruction offset: " << R.getInstructionOffset() 410000afd8SLang Hames << "\n " << R.getNumLocations() << " locations:"; 420000afd8SLang Hames 430000afd8SLang Hames unsigned LocationIndex = 0; 440000afd8SLang Hames for (const auto &Loc : R.locations()) { 450000afd8SLang Hames OS << "\n #" << ++LocationIndex << ": "; 460000afd8SLang Hames switch (Loc.getKind()) { 470000afd8SLang Hames case StackMapParserT::LocationKind::Register: 480000afd8SLang Hames OS << "Register R#" << Loc.getDwarfRegNum(); 490000afd8SLang Hames break; 500000afd8SLang Hames case StackMapParserT::LocationKind::Direct: 510000afd8SLang Hames OS << "Direct R#" << Loc.getDwarfRegNum() << " + " 520000afd8SLang Hames << Loc.getOffset(); 530000afd8SLang Hames break; 540000afd8SLang Hames case StackMapParserT::LocationKind::Indirect: 550000afd8SLang Hames OS << "Indirect [R#" << Loc.getDwarfRegNum() << " + " 560000afd8SLang Hames << Loc.getOffset() << "]"; 570000afd8SLang Hames break; 580000afd8SLang Hames case StackMapParserT::LocationKind::Constant: 590000afd8SLang Hames OS << "Constant " << Loc.getSmallConstant(); 600000afd8SLang Hames break; 610000afd8SLang Hames case StackMapParserT::LocationKind::ConstantIndex: 620000afd8SLang Hames OS << "ConstantIndex #" << Loc.getConstantIndex() << " (" 630000afd8SLang Hames << SMP.getConstant(Loc.getConstantIndex()).getValue() << ")"; 640000afd8SLang Hames break; 650000afd8SLang Hames } 660000afd8SLang Hames } 670000afd8SLang Hames 680000afd8SLang Hames OS << "\n " << R.getNumLiveOuts() << " live-outs: [ "; 690000afd8SLang Hames for (const auto &LO : R.liveouts()) 700000afd8SLang Hames OS << "R#" << LO.getDwarfRegNum() << " (" 710000afd8SLang Hames << LO.getSizeInBytes() << "-bytes) "; 720000afd8SLang Hames OS << "]\n"; 730000afd8SLang Hames } 740000afd8SLang Hames 750000afd8SLang Hames OS << "\n"; 760000afd8SLang Hames 770000afd8SLang Hames } 780000afd8SLang Hames 790000afd8SLang Hames } 800000afd8SLang Hames 810000afd8SLang Hames #endif 82