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(*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