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