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
19using namespace llvm;
20using namespace llvm::pdb;
21
22EnumDumper::EnumDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {}
23
24void 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