xref: /openbsd-src/gnu/llvm/llvm/tools/llvm-pdbutil/PrettyEnumDumper.cpp (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
109467b48Spatrick //===- PrettyEnumDumper.cpp -------------------------------------*- C++ -*-===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick 
909467b48Spatrick #include "PrettyEnumDumper.h"
1009467b48Spatrick 
1109467b48Spatrick #include "PrettyBuiltinDumper.h"
1209467b48Spatrick #include "llvm-pdbutil.h"
1309467b48Spatrick 
14*d415bd75Srobert #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h"
15*d415bd75Srobert #include "llvm/DebugInfo/PDB/IPDBLineNumber.h"
1609467b48Spatrick #include "llvm/DebugInfo/PDB/PDBSymbolData.h"
1709467b48Spatrick #include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
1809467b48Spatrick #include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
1909467b48Spatrick 
2009467b48Spatrick using namespace llvm;
2109467b48Spatrick using namespace llvm::pdb;
2209467b48Spatrick 
EnumDumper(LinePrinter & P)2309467b48Spatrick EnumDumper::EnumDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {}
2409467b48Spatrick 
start(const PDBSymbolTypeEnum & Symbol)2509467b48Spatrick void EnumDumper::start(const PDBSymbolTypeEnum &Symbol) {
2609467b48Spatrick   if (Symbol.getUnmodifiedTypeId() != 0) {
2709467b48Spatrick     if (Symbol.isConstType())
2809467b48Spatrick       WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
2909467b48Spatrick     if (Symbol.isVolatileType())
3009467b48Spatrick       WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
3109467b48Spatrick     if (Symbol.isUnalignedType())
3209467b48Spatrick       WithColor(Printer, PDB_ColorItem::Keyword).get() << "unaligned ";
3309467b48Spatrick     WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
3409467b48Spatrick     WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
3509467b48Spatrick     return;
3609467b48Spatrick   }
3709467b48Spatrick 
3809467b48Spatrick   WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
3909467b48Spatrick   WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
4009467b48Spatrick   if (!opts::pretty::NoEnumDefs) {
4109467b48Spatrick     auto UnderlyingType = Symbol.getUnderlyingType();
4209467b48Spatrick     if (!UnderlyingType)
4309467b48Spatrick       return;
4409467b48Spatrick     if (UnderlyingType->getBuiltinType() != PDB_BuiltinType::Int ||
4509467b48Spatrick         UnderlyingType->getLength() != 4) {
4609467b48Spatrick       Printer << " : ";
4709467b48Spatrick       BuiltinDumper Dumper(Printer);
4809467b48Spatrick       Dumper.start(*UnderlyingType);
4909467b48Spatrick     }
5009467b48Spatrick     auto EnumValues = Symbol.findAllChildren<PDBSymbolData>();
5109467b48Spatrick     Printer << " {";
5209467b48Spatrick     Printer.Indent();
5309467b48Spatrick     if (EnumValues && EnumValues->getChildCount() > 0) {
5409467b48Spatrick       while (auto EnumValue = EnumValues->getNext()) {
5509467b48Spatrick         if (EnumValue->getDataKind() != PDB_DataKind::Constant)
5609467b48Spatrick           continue;
5709467b48Spatrick         Printer.NewLine();
5809467b48Spatrick         WithColor(Printer, PDB_ColorItem::Identifier).get()
5909467b48Spatrick             << EnumValue->getName();
6009467b48Spatrick         Printer << " = ";
6109467b48Spatrick         WithColor(Printer, PDB_ColorItem::LiteralValue).get()
6209467b48Spatrick             << EnumValue->getValue();
6309467b48Spatrick       }
6409467b48Spatrick     }
6509467b48Spatrick     Printer.Unindent();
6609467b48Spatrick     Printer.NewLine();
6709467b48Spatrick     Printer << "}";
6809467b48Spatrick   }
6909467b48Spatrick }
70