//===- DwarfTransformer.h ---------------------------------------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_DEBUGINFO_GSYM_DWARFTRANSFORMER_H
 
#define LLVM_DEBUGINFO_GSYM_DWARFTRANSFORMER_H
 
 
 
#include "llvm/ADT/StringRef.h"
 
#include "llvm/DebugInfo/GSYM/ExtractRanges.h"
 
#include "llvm/Support/Error.h"
 
 
 
namespace llvm {
 
 
 
class raw_ostream;
 
 
 
namespace gsym {
 
 
 
struct CUInfo;
 
struct FunctionInfo;
 
class GsymCreator;
 
 
 
/// A class that transforms the DWARF in a DWARFContext into GSYM information
 
/// by populating the GsymCreator object that it is constructed with. This
 
/// class supports converting all DW_TAG_subprogram DIEs into
 
/// gsym::FunctionInfo objects that includes line table information and inline
 
/// function information. Creating a separate class to transform this data
 
/// allows this class to be unit tested.
 
class DwarfTransformer {
 
public:
 
 
 
  /// Create a DWARF transformer.
 
  ///
 
  /// \param D The DWARF to use when converting to GSYM.
 
  ///
 
  /// \param OS The stream to log warnings and non fatal issues to.
 
  ///
 
  /// \param G The GSYM creator to populate with the function information
 
  /// from the debug info.
 
  DwarfTransformer(DWARFContext &D, raw_ostream &OS, GsymCreator &G) :
 
      DICtx(D), Log(OS), Gsym(G) {}
 
 
 
  /// Extract the DWARF from the supplied object file and convert it into the
 
  /// Gsym format in the GsymCreator object that is passed in. Returns an
 
  /// error if something fatal is encountered.
 
  ///
 
  /// \returns An error indicating any fatal issues that happen when parsing
 
  /// the DWARF, or Error::success() if all goes well.
 
  llvm::Error convert(uint32_t NumThreads);
 
 
 
  llvm::Error verify(StringRef GsymPath);
 
 
 
 
 
private:
 
 
 
  /// Parse the DWARF in the object file and convert it into the GsymCreator.
 
  Error parse();
 
 
 
  /// Handle any DIE (debug info entry) from the DWARF.
 
  ///
 
  /// This function will find all DW_TAG_subprogram DIEs that convert them into
 
  /// GSYM FuntionInfo objects and add them to the GsymCreator supplied during
 
  /// construction. The DIE and all its children will be recursively parsed
 
  /// with calls to this function.
 
  ///
 
  /// \param Strm The thread specific log stream for any non fatal errors and
 
  /// warnings. Once a thread has finished parsing an entire compile unit, all
 
  /// information in this temporary stream will be forwarded to the member
 
  /// variable log. This keeps logging thread safe.
 
  ///
 
  /// \param CUI The compile unit specific information that contains the DWARF
 
  /// line table, cached file list, and other compile unit specific
 
  /// information.
 
  ///
 
  /// \param Die The DWARF debug info entry to parse.
 
  void handleDie(raw_ostream &Strm, CUInfo &CUI, DWARFDie Die);
 
 
 
  DWARFContext &DICtx;
 
  raw_ostream &Log;
 
  GsymCreator &Gsym;
 
 
 
  friend class DwarfTransformerTest;
 
};
 
 
 
} // namespace gsym
 
} // namespace llvm
 
 
 
#endif // LLVM_DEBUGINFO_GSYM_DWARFTRANSFORMER_H