Path: blob/main/contrib/llvm-project/llvm/lib/DebugInfo/PDB/Native/NativeSymbolEnumerator.cpp
35293 views
//===- NativeSymbolEnumerator.cpp - info about enumerators ------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h"910#include "llvm/DebugInfo/PDB/Native/NativeSession.h"11#include "llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h"12#include "llvm/DebugInfo/PDB/Native/NativeTypeEnum.h"1314using namespace llvm;15using namespace llvm::codeview;16using namespace llvm::pdb;1718NativeSymbolEnumerator::NativeSymbolEnumerator(19NativeSession &Session, SymIndexId Id, const NativeTypeEnum &Parent,20codeview::EnumeratorRecord Record)21: NativeRawSymbol(Session, PDB_SymType::Data, Id), Parent(Parent),22Record(std::move(Record)) {}2324NativeSymbolEnumerator::~NativeSymbolEnumerator() = default;2526void NativeSymbolEnumerator::dump(raw_ostream &OS, int Indent,27PdbSymbolIdField ShowIdFields,28PdbSymbolIdField RecurseIdFields) const {29NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields);30dumpSymbolIdField(OS, "classParentId", getClassParentId(), Indent, Session,31PdbSymbolIdField::ClassParent, ShowIdFields,32RecurseIdFields);33dumpSymbolIdField(OS, "lexicalParentId", getLexicalParentId(), Indent,34Session, PdbSymbolIdField::LexicalParent, ShowIdFields,35RecurseIdFields);36dumpSymbolField(OS, "name", getName(), Indent);37dumpSymbolIdField(OS, "typeId", getTypeId(), Indent, Session,38PdbSymbolIdField::Type, ShowIdFields, RecurseIdFields);39dumpSymbolField(OS, "dataKind", getDataKind(), Indent);40dumpSymbolField(OS, "locationType", getLocationType(), Indent);41dumpSymbolField(OS, "constType", isConstType(), Indent);42dumpSymbolField(OS, "unalignedType", isUnalignedType(), Indent);43dumpSymbolField(OS, "volatileType", isVolatileType(), Indent);44dumpSymbolField(OS, "value", getValue(), Indent);45}4647SymIndexId NativeSymbolEnumerator::getClassParentId() const {48return Parent.getSymIndexId();49}5051SymIndexId NativeSymbolEnumerator::getLexicalParentId() const { return 0; }5253std::string NativeSymbolEnumerator::getName() const {54return std::string(Record.Name);55}5657SymIndexId NativeSymbolEnumerator::getTypeId() const {58return Parent.getTypeId();59}6061PDB_DataKind NativeSymbolEnumerator::getDataKind() const {62return PDB_DataKind::Constant;63}6465PDB_LocType NativeSymbolEnumerator::getLocationType() const {66return PDB_LocType::Constant;67}6869bool NativeSymbolEnumerator::isConstType() const { return false; }7071bool NativeSymbolEnumerator::isVolatileType() const { return false; }7273bool NativeSymbolEnumerator::isUnalignedType() const { return false; }7475Variant NativeSymbolEnumerator::getValue() const {76const NativeTypeBuiltin &BT = Parent.getUnderlyingBuiltinType();7778switch (BT.getBuiltinType()) {79case PDB_BuiltinType::Int:80case PDB_BuiltinType::Long:81case PDB_BuiltinType::Char: {82assert(Record.Value.isSignedIntN(BT.getLength() * 8));83int64_t N = Record.Value.getSExtValue();84switch (BT.getLength()) {85case 1:86return Variant{static_cast<int8_t>(N)};87case 2:88return Variant{static_cast<int16_t>(N)};89case 4:90return Variant{static_cast<int32_t>(N)};91case 8:92return Variant{static_cast<int64_t>(N)};93}94break;95}96case PDB_BuiltinType::UInt:97case PDB_BuiltinType::ULong: {98assert(Record.Value.isIntN(BT.getLength() * 8));99uint64_t U = Record.Value.getZExtValue();100switch (BT.getLength()) {101case 1:102return Variant{static_cast<uint8_t>(U)};103case 2:104return Variant{static_cast<uint16_t>(U)};105case 4:106return Variant{static_cast<uint32_t>(U)};107case 8:108return Variant{static_cast<uint64_t>(U)};109}110break;111}112case PDB_BuiltinType::Bool: {113assert(Record.Value.isIntN(BT.getLength() * 8));114uint64_t U = Record.Value.getZExtValue();115return Variant{static_cast<bool>(U)};116}117default:118assert(false && "Invalid enumeration type");119break;120}121122return Variant{Record.Value.getSExtValue()};123}124125126