1 | //===- PrettyEnumDumper.cpp -------------------------------------*- 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 | #include "PrettyEnumDumper.h" |
10 | |
11 | #include "PrettyBuiltinDumper.h" |
12 | #include "llvm-pdbutil.h" |
13 | |
14 | #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h" |
15 | #include "llvm/DebugInfo/PDB/IPDBLineNumber.h" |
16 | #include "llvm/DebugInfo/PDB/PDBSymbolData.h" |
17 | #include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h" |
18 | #include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h" |
19 | |
20 | using namespace llvm; |
21 | using namespace llvm::pdb; |
22 | |
23 | EnumDumper::EnumDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {} |
24 | |
25 | void EnumDumper::start(const PDBSymbolTypeEnum &Symbol) { |
26 | if (Symbol.getUnmodifiedTypeId() != 0) { |
27 | if (Symbol.isConstType()) |
28 | WithColor(Printer, PDB_ColorItem::Keyword).get() << "const " ; |
29 | if (Symbol.isVolatileType()) |
30 | WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile " ; |
31 | if (Symbol.isUnalignedType()) |
32 | WithColor(Printer, PDB_ColorItem::Keyword).get() << "unaligned " ; |
33 | WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum " ; |
34 | WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName(); |
35 | return; |
36 | } |
37 | |
38 | WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum " ; |
39 | WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName(); |
40 | if (!opts::pretty::NoEnumDefs) { |
41 | auto UnderlyingType = Symbol.getUnderlyingType(); |
42 | if (!UnderlyingType) |
43 | return; |
44 | if (UnderlyingType->getBuiltinType() != PDB_BuiltinType::Int || |
45 | UnderlyingType->getLength() != 4) { |
46 | Printer << " : " ; |
47 | BuiltinDumper Dumper(Printer); |
48 | Dumper.start(Symbol: *UnderlyingType); |
49 | } |
50 | auto EnumValues = Symbol.findAllChildren<PDBSymbolData>(); |
51 | Printer << " {" ; |
52 | Printer.Indent(); |
53 | if (EnumValues && EnumValues->getChildCount() > 0) { |
54 | while (auto EnumValue = EnumValues->getNext()) { |
55 | if (EnumValue->getDataKind() != PDB_DataKind::Constant) |
56 | continue; |
57 | Printer.NewLine(); |
58 | WithColor(Printer, PDB_ColorItem::Identifier).get() |
59 | << EnumValue->getName(); |
60 | Printer << " = " ; |
61 | WithColor(Printer, PDB_ColorItem::LiteralValue).get() |
62 | << EnumValue->getValue(); |
63 | } |
64 | } |
65 | Printer.Unindent(); |
66 | Printer.NewLine(); |
67 | Printer << "}" ; |
68 | } |
69 | } |
70 | |