xref: /llvm-project/llvm/include/llvm/DebugInfo/GSYM/DwarfTransformer.h (revision 558de0e1f993f413a9c8b93d969b28b651c6e437)
1 //===- DwarfTransformer.h ---------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_DEBUGINFO_GSYM_DWARFTRANSFORMER_H
10 #define LLVM_DEBUGINFO_GSYM_DWARFTRANSFORMER_H
11 
12 #include "llvm/ADT/StringRef.h"
13 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
14 #include "llvm/DebugInfo/GSYM/ExtractRanges.h"
15 #include "llvm/Support/Error.h"
16 
17 namespace llvm {
18 
19 class raw_ostream;
20 
21 namespace gsym {
22 
23 struct CUInfo;
24 struct FunctionInfo;
25 class GsymCreator;
26 class OutputAggregator;
27 
28 /// A class that transforms the DWARF in a DWARFContext into GSYM information
29 /// by populating the GsymCreator object that it is constructed with. This
30 /// class supports converting all DW_TAG_subprogram DIEs into
31 /// gsym::FunctionInfo objects that includes line table information and inline
32 /// function information. Creating a separate class to transform this data
33 /// allows this class to be unit tested.
34 class DwarfTransformer {
35 public:
36   /// Create a DWARF transformer.
37   ///
38   /// \param D The DWARF to use when converting to GSYM.
39   ///
40   /// \param G The GSYM creator to populate with the function information
41   /// from the debug info.
42   ///
43   /// \param LDCS Flag to indicate whether we should load the call site
44   /// information from DWARF `DW_TAG_call_site` entries
45   DwarfTransformer(DWARFContext &D, GsymCreator &G, bool LDCS = false)
46       : DICtx(D), Gsym(G), LoadDwarfCallSites(LDCS) {}
47 
48   /// Extract the DWARF from the supplied object file and convert it into the
49   /// Gsym format in the GsymCreator object that is passed in. Returns an
50   /// error if something fatal is encountered.
51   ///
52   /// \param NumThreads The number of threads that the conversion process can
53   ///                   use.
54   ///
55   /// \param OS The stream to log warnings and non fatal issues to. If NULL
56   ///           then don't log.
57   ///
58   /// \returns An error indicating any fatal issues that happen when parsing
59   /// the DWARF, or Error::success() if all goes well.
60   llvm::Error convert(uint32_t NumThreads, OutputAggregator &OS);
61 
62   llvm::Error verify(StringRef GsymPath, OutputAggregator &OS);
63 
64 private:
65 
66   /// Parse the DWARF in the object file and convert it into the GsymCreator.
67   Error parse();
68 
69   /// Handle any DIE (debug info entry) from the DWARF.
70   ///
71   /// This function will find all DW_TAG_subprogram DIEs that convert them into
72   /// GSYM FuntionInfo objects and add them to the GsymCreator supplied during
73   /// construction. The DIE and all its children will be recursively parsed
74   /// with calls to this function.
75   ///
76   /// \param Strm The thread specific log stream for any non fatal errors and
77   /// warnings. Once a thread has finished parsing an entire compile unit, all
78   /// information in this temporary stream will be forwarded to the member
79   /// variable log. This keeps logging thread safe. If the value is NULL, then
80   /// don't log.
81   ///
82   /// \param CUI The compile unit specific information that contains the DWARF
83   /// line table, cached file list, and other compile unit specific
84   /// information.
85   ///
86   /// \param Die The DWARF debug info entry to parse.
87   void handleDie(OutputAggregator &Strm, CUInfo &CUI, DWARFDie Die);
88 
89   /// Parse call site information from DWARF
90   ///
91   /// \param CUI   The compile unit info for the current CU.
92   /// \param Die   The DWARFDie for the function.
93   /// \param FI    The FunctionInfo for the function being populated.
94   void parseCallSiteInfoFromDwarf(CUInfo &CUI, DWARFDie Die, FunctionInfo &FI);
95 
96   DWARFContext &DICtx;
97   GsymCreator &Gsym;
98   bool LoadDwarfCallSites;
99 
100   friend class DwarfTransformerTest;
101 };
102 
103 } // namespace gsym
104 } // namespace llvm
105 
106 #endif // LLVM_DEBUGINFO_GSYM_DWARFTRANSFORMER_H
107