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