xref: /aosp_15_r20/external/llvm/tools/llvm-readobj/Win64EHDumper.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- Win64EHDumper.h - Win64 EH Printing ----------------------*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_TOOLS_LLVM_READOBJ_WIN64EHDUMPER_H
11*9880d681SAndroid Build Coastguard Worker #define LLVM_TOOLS_LLVM_READOBJ_WIN64EHDUMPER_H
12*9880d681SAndroid Build Coastguard Worker 
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ScopedPrinter.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Win64EH.h"
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker namespace llvm {
17*9880d681SAndroid Build Coastguard Worker namespace object {
18*9880d681SAndroid Build Coastguard Worker class COFFObjectFile;
19*9880d681SAndroid Build Coastguard Worker class SymbolRef;
20*9880d681SAndroid Build Coastguard Worker struct coff_section;
21*9880d681SAndroid Build Coastguard Worker }
22*9880d681SAndroid Build Coastguard Worker 
23*9880d681SAndroid Build Coastguard Worker namespace Win64EH {
24*9880d681SAndroid Build Coastguard Worker class Dumper {
25*9880d681SAndroid Build Coastguard Worker   ScopedPrinter &SW;
26*9880d681SAndroid Build Coastguard Worker   raw_ostream &OS;
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker public:
29*9880d681SAndroid Build Coastguard Worker   typedef std::error_code (*SymbolResolver)(const object::coff_section *,
30*9880d681SAndroid Build Coastguard Worker                                             uint64_t, object::SymbolRef &,
31*9880d681SAndroid Build Coastguard Worker                                             void *);
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker   struct Context {
34*9880d681SAndroid Build Coastguard Worker     const object::COFFObjectFile &COFF;
35*9880d681SAndroid Build Coastguard Worker     SymbolResolver ResolveSymbol;
36*9880d681SAndroid Build Coastguard Worker     void *UserData;
37*9880d681SAndroid Build Coastguard Worker 
ContextContext38*9880d681SAndroid Build Coastguard Worker     Context(const object::COFFObjectFile &COFF, SymbolResolver Resolver,
39*9880d681SAndroid Build Coastguard Worker             void *UserData)
40*9880d681SAndroid Build Coastguard Worker       : COFF(COFF), ResolveSymbol(Resolver), UserData(UserData) {}
41*9880d681SAndroid Build Coastguard Worker   };
42*9880d681SAndroid Build Coastguard Worker 
43*9880d681SAndroid Build Coastguard Worker private:
44*9880d681SAndroid Build Coastguard Worker   void printRuntimeFunctionEntry(const Context &Ctx,
45*9880d681SAndroid Build Coastguard Worker                                  const object::coff_section *Section,
46*9880d681SAndroid Build Coastguard Worker                                  uint64_t SectionOffset,
47*9880d681SAndroid Build Coastguard Worker                                  const RuntimeFunction &RF);
48*9880d681SAndroid Build Coastguard Worker   void printUnwindCode(const UnwindInfo& UI, ArrayRef<UnwindCode> UC);
49*9880d681SAndroid Build Coastguard Worker   void printUnwindInfo(const Context &Ctx, const object::coff_section *Section,
50*9880d681SAndroid Build Coastguard Worker                        off_t Offset, const UnwindInfo &UI);
51*9880d681SAndroid Build Coastguard Worker   void printRuntimeFunction(const Context &Ctx,
52*9880d681SAndroid Build Coastguard Worker                             const object::coff_section *Section,
53*9880d681SAndroid Build Coastguard Worker                             uint64_t SectionOffset, const RuntimeFunction &RF);
54*9880d681SAndroid Build Coastguard Worker 
55*9880d681SAndroid Build Coastguard Worker public:
Dumper(ScopedPrinter & SW)56*9880d681SAndroid Build Coastguard Worker   Dumper(ScopedPrinter &SW) : SW(SW), OS(SW.getOStream()) {}
57*9880d681SAndroid Build Coastguard Worker 
58*9880d681SAndroid Build Coastguard Worker   void printData(const Context &Ctx);
59*9880d681SAndroid Build Coastguard Worker };
60*9880d681SAndroid Build Coastguard Worker }
61*9880d681SAndroid Build Coastguard Worker }
62*9880d681SAndroid Build Coastguard Worker 
63*9880d681SAndroid Build Coastguard Worker #endif
64