xref: /llvm-project/llvm/tools/llvm-readobj/StackMapPrinter.h (revision eea989a909a3c963a1e99d7e75eb94f25d2bf9fb)
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