brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 64557ff Raw
70 lines · cpp
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-exception6//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 20using namespace llvm;21using namespace llvm::pdb;22 23EnumDumper::EnumDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {}24 25void 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