10000afd8SLang Hames //===-------- StackMapPrinter.h - Pretty-print stackmaps --------*- C++ -*-===//
20000afd8SLang Hames //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler 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>
prettyPrintStackMap(ScopedPrinter & W,const StackMapParserT & SMP)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:
50*eea989a9SPhilip Reames OS << "Register R#" << Loc.getDwarfRegNum();
510000afd8SLang Hames break;
520000afd8SLang Hames case StackMapParserT::LocationKind::Direct:
53*eea989a9SPhilip Reames OS << "Direct R#" << Loc.getDwarfRegNum() << " + " << Loc.getOffset();
540000afd8SLang Hames break;
550000afd8SLang Hames case StackMapParserT::LocationKind::Indirect:
5688e9a15bSSam Clegg OS << "Indirect [R#" << Loc.getDwarfRegNum() << " + " << Loc.getOffset()
57*eea989a9SPhilip Reames << "]";
580000afd8SLang Hames break;
590000afd8SLang Hames case StackMapParserT::LocationKind::Constant:
60*eea989a9SPhilip Reames OS << "Constant " << Loc.getSmallConstant();
610000afd8SLang Hames break;
620000afd8SLang Hames case StackMapParserT::LocationKind::ConstantIndex:
630000afd8SLang Hames OS << "ConstantIndex #" << Loc.getConstantIndex() << " ("
64*eea989a9SPhilip Reames << SMP.getConstant(Loc.getConstantIndex()).getValue() << ")";
650000afd8SLang Hames break;
660000afd8SLang Hames }
67*eea989a9SPhilip Reames OS << ", size: " << Loc.getSizeInBytes() << "\n";
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