1*81ad6265SDimitry Andric //===- DWARFTypePrinter.h ---------------------------------------*- C++ -*-===//
2*81ad6265SDimitry Andric //
3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*81ad6265SDimitry Andric //
7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
8*81ad6265SDimitry Andric 
9*81ad6265SDimitry Andric #ifndef LLVM_DEBUGINFO_DWARF_DWARFTYPEPRINTER_H
10*81ad6265SDimitry Andric #define LLVM_DEBUGINFO_DWARF_DWARFTYPEPRINTER_H
11*81ad6265SDimitry Andric 
12*81ad6265SDimitry Andric #include "llvm/ADT/StringRef.h"
13*81ad6265SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h"
14*81ad6265SDimitry Andric #include "llvm/DebugInfo/DWARF/DWARFDie.h"
15*81ad6265SDimitry Andric 
16*81ad6265SDimitry Andric #include <string>
17*81ad6265SDimitry Andric 
18*81ad6265SDimitry Andric namespace llvm {
19*81ad6265SDimitry Andric 
20*81ad6265SDimitry Andric class raw_ostream;
21*81ad6265SDimitry Andric 
22*81ad6265SDimitry Andric // FIXME: We should have pretty printers per language. Currently we print
23*81ad6265SDimitry Andric // everything as if it was C++ and fall back to the TAG type name.
24*81ad6265SDimitry Andric struct DWARFTypePrinter {
25*81ad6265SDimitry Andric   raw_ostream &OS;
26*81ad6265SDimitry Andric   bool Word = true;
27*81ad6265SDimitry Andric   bool EndedWithTemplate = false;
28*81ad6265SDimitry Andric 
DWARFTypePrinterDWARFTypePrinter29*81ad6265SDimitry Andric   DWARFTypePrinter(raw_ostream &OS) : OS(OS) {}
30*81ad6265SDimitry Andric 
31*81ad6265SDimitry Andric   /// Dump the name encoded in the type tag.
32*81ad6265SDimitry Andric   void appendTypeTagName(dwarf::Tag T);
33*81ad6265SDimitry Andric 
34*81ad6265SDimitry Andric   void appendArrayType(const DWARFDie &D);
35*81ad6265SDimitry Andric 
36*81ad6265SDimitry Andric   DWARFDie skipQualifiers(DWARFDie D);
37*81ad6265SDimitry Andric 
38*81ad6265SDimitry Andric   bool needsParens(DWARFDie D);
39*81ad6265SDimitry Andric 
40*81ad6265SDimitry Andric   void appendPointerLikeTypeBefore(DWARFDie D, DWARFDie Inner, StringRef Ptr);
41*81ad6265SDimitry Andric 
42*81ad6265SDimitry Andric   DWARFDie appendUnqualifiedNameBefore(DWARFDie D,
43*81ad6265SDimitry Andric                                        std::string *OriginalFullName = nullptr);
44*81ad6265SDimitry Andric 
45*81ad6265SDimitry Andric   void appendUnqualifiedNameAfter(DWARFDie D, DWARFDie Inner,
46*81ad6265SDimitry Andric                                   bool SkipFirstParamIfArtificial = false);
47*81ad6265SDimitry Andric   void appendQualifiedName(DWARFDie D);
48*81ad6265SDimitry Andric   DWARFDie appendQualifiedNameBefore(DWARFDie D);
49*81ad6265SDimitry Andric   bool appendTemplateParameters(DWARFDie D, bool *FirstParameter = nullptr);
50*81ad6265SDimitry Andric   void decomposeConstVolatile(DWARFDie &N, DWARFDie &T, DWARFDie &C,
51*81ad6265SDimitry Andric                               DWARFDie &V);
52*81ad6265SDimitry Andric   void appendConstVolatileQualifierAfter(DWARFDie N);
53*81ad6265SDimitry Andric   void appendConstVolatileQualifierBefore(DWARFDie N);
54*81ad6265SDimitry Andric 
55*81ad6265SDimitry Andric   /// Recursively append the DIE type name when applicable.
56*81ad6265SDimitry Andric   void appendUnqualifiedName(DWARFDie D,
57*81ad6265SDimitry Andric                              std::string *OriginalFullName = nullptr);
58*81ad6265SDimitry Andric 
59*81ad6265SDimitry Andric   void appendSubroutineNameAfter(DWARFDie D, DWARFDie Inner,
60*81ad6265SDimitry Andric                                  bool SkipFirstParamIfArtificial, bool Const,
61*81ad6265SDimitry Andric                                  bool Volatile);
62*81ad6265SDimitry Andric   void appendScopes(DWARFDie D);
63*81ad6265SDimitry Andric };
64*81ad6265SDimitry Andric 
65*81ad6265SDimitry Andric } // namespace llvm
66*81ad6265SDimitry Andric 
67*81ad6265SDimitry Andric #endif // LLVM_DEBUGINFO_DWARF_DWARFTYPEPRINTER_H
68