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