10000afd8SLang Hames //===-------- StackMapPrinter.h - Pretty-print stackmaps --------*- C++ -*-===// 20000afd8SLang Hames // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60000afd8SLang Hames // 70000afd8SLang Hames //===----------------------------------------------------------------------===// 80000afd8SLang Hames 90000afd8SLang Hames #ifndef LLVM_TOOLS_LLVM_READOBJ_STACKMAPPRINTER_H 100000afd8SLang Hames #define LLVM_TOOLS_LLVM_READOBJ_STACKMAPPRINTER_H 110000afd8SLang Hames 120000afd8SLang Hames #include "llvm/Object/StackMapParser.h" 1388e9a15bSSam Clegg #include "llvm/Support/ScopedPrinter.h" 140000afd8SLang Hames 150000afd8SLang Hames namespace llvm { 160000afd8SLang Hames 170000afd8SLang Hames // Pretty print a stackmap to the given ostream. 1888e9a15bSSam Clegg template <typename StackMapParserT> 1988e9a15bSSam Clegg void prettyPrintStackMap(ScopedPrinter &W, const StackMapParserT &SMP) { 200000afd8SLang Hames 2188e9a15bSSam Clegg W.printNumber("LLVM StackMap Version", SMP.getVersion()); 2288e9a15bSSam Clegg W.printNumber("Num Functions", SMP.getNumFunctions()); 230000afd8SLang Hames 240000afd8SLang Hames // Functions: 250000afd8SLang Hames for (const auto &F : SMP.functions()) 2688e9a15bSSam Clegg W.startLine() << " Function address: " << F.getFunctionAddress() 2723f06e53SSanjoy Das << ", stack size: " << F.getStackSize() 2888e9a15bSSam Clegg << ", callsite record count: " << F.getRecordCount() << "\n"; 290000afd8SLang Hames 300000afd8SLang Hames // Constants: 3188e9a15bSSam Clegg W.printNumber("Num Constants", SMP.getNumConstants()); 320000afd8SLang Hames unsigned ConstantIndex = 0; 330000afd8SLang Hames for (const auto &C : SMP.constants()) 3488e9a15bSSam Clegg W.startLine() << " #" << ++ConstantIndex << ": " << C.getValue() << "\n"; 350000afd8SLang Hames 360000afd8SLang Hames // Records: 3788e9a15bSSam Clegg W.printNumber("Num Records", SMP.getNumRecords()); 380000afd8SLang Hames for (const auto &R : SMP.records()) { 3988e9a15bSSam Clegg W.startLine() << " Record ID: " << R.getID() 400000afd8SLang Hames << ", instruction offset: " << R.getInstructionOffset() 4188e9a15bSSam Clegg << "\n"; 4288e9a15bSSam Clegg W.startLine() << " " << R.getNumLocations() << " locations:\n"; 430000afd8SLang Hames 440000afd8SLang Hames unsigned LocationIndex = 0; 450000afd8SLang Hames for (const auto &Loc : R.locations()) { 4688e9a15bSSam Clegg raw_ostream &OS = W.startLine(); 4788e9a15bSSam Clegg OS << " #" << ++LocationIndex << ": "; 480000afd8SLang Hames switch (Loc.getKind()) { 490000afd8SLang Hames case StackMapParserT::LocationKind::Register: 5088e9a15bSSam Clegg OS << "Register R#" << Loc.getDwarfRegNum() << "\n"; 510000afd8SLang Hames break; 520000afd8SLang Hames case StackMapParserT::LocationKind::Direct: 5388e9a15bSSam Clegg OS << "Direct R#" << Loc.getDwarfRegNum() << " + " << Loc.getOffset() 5488e9a15bSSam Clegg << "\n"; 550000afd8SLang Hames break; 560000afd8SLang Hames case StackMapParserT::LocationKind::Indirect: 5788e9a15bSSam Clegg OS << "Indirect [R#" << Loc.getDwarfRegNum() << " + " << Loc.getOffset() 5888e9a15bSSam Clegg << "]\n"; 590000afd8SLang Hames break; 600000afd8SLang Hames case StackMapParserT::LocationKind::Constant: 6188e9a15bSSam Clegg OS << "Constant " << Loc.getSmallConstant() << "\n"; 620000afd8SLang Hames break; 630000afd8SLang Hames case StackMapParserT::LocationKind::ConstantIndex: 640000afd8SLang Hames OS << "ConstantIndex #" << Loc.getConstantIndex() << " (" 6588e9a15bSSam Clegg << SMP.getConstant(Loc.getConstantIndex()).getValue() << ")\n"; 660000afd8SLang Hames break; 670000afd8SLang Hames } 680000afd8SLang Hames } 690000afd8SLang Hames 7088e9a15bSSam Clegg raw_ostream &OS = W.startLine(); 7188e9a15bSSam Clegg OS << " " << R.getNumLiveOuts() << " live-outs: [ "; 720000afd8SLang Hames for (const auto &LO : R.liveouts()) 730000afd8SLang Hames OS << "R#" << LO.getDwarfRegNum() << " (" 740000afd8SLang Hames << LO.getSizeInBytes() << "-bytes) "; 750000afd8SLang Hames OS << "]\n"; 760000afd8SLang Hames } 770000afd8SLang Hames } 780000afd8SLang Hames 790000afd8SLang Hames } 800000afd8SLang Hames 810000afd8SLang Hames #endif 82