1bdf0381eSZachary Turner //===- NativeSymbolEnumerator.cpp - info about enumerators ------*- C++ -*-===//
2bdf0381eSZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bdf0381eSZachary Turner //
7bdf0381eSZachary Turner //===----------------------------------------------------------------------===//
8bdf0381eSZachary Turner
9bdf0381eSZachary Turner #include "llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h"
10bdf0381eSZachary Turner
11*eb4c8608Sserge-sans-paille #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
12bdf0381eSZachary Turner #include "llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h"
13bdf0381eSZachary Turner #include "llvm/DebugInfo/PDB/Native/NativeTypeEnum.h"
14bdf0381eSZachary Turner
15bdf0381eSZachary Turner using namespace llvm;
16bdf0381eSZachary Turner using namespace llvm::codeview;
17bdf0381eSZachary Turner using namespace llvm::pdb;
18bdf0381eSZachary Turner
NativeSymbolEnumerator(NativeSession & Session,SymIndexId Id,const NativeTypeEnum & Parent,codeview::EnumeratorRecord Record)19bdf0381eSZachary Turner NativeSymbolEnumerator::NativeSymbolEnumerator(
20bdf0381eSZachary Turner NativeSession &Session, SymIndexId Id, const NativeTypeEnum &Parent,
21bdf0381eSZachary Turner codeview::EnumeratorRecord Record)
22bdf0381eSZachary Turner : NativeRawSymbol(Session, PDB_SymType::Data, Id), Parent(Parent),
23bdf0381eSZachary Turner Record(std::move(Record)) {}
24bdf0381eSZachary Turner
253a3cb929SKazu Hirata NativeSymbolEnumerator::~NativeSymbolEnumerator() = default;
26bdf0381eSZachary Turner
dump(raw_ostream & OS,int Indent,PdbSymbolIdField ShowIdFields,PdbSymbolIdField RecurseIdFields) const27c41ce835SZachary Turner void NativeSymbolEnumerator::dump(raw_ostream &OS, int Indent,
28c41ce835SZachary Turner PdbSymbolIdField ShowIdFields,
29c41ce835SZachary Turner PdbSymbolIdField RecurseIdFields) const {
30c41ce835SZachary Turner NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields);
31c41ce835SZachary Turner dumpSymbolIdField(OS, "classParentId", getClassParentId(), Indent, Session,
32c41ce835SZachary Turner PdbSymbolIdField::ClassParent, ShowIdFields,
33c41ce835SZachary Turner RecurseIdFields);
34c41ce835SZachary Turner dumpSymbolIdField(OS, "lexicalParentId", getLexicalParentId(), Indent,
35c41ce835SZachary Turner Session, PdbSymbolIdField::LexicalParent, ShowIdFields,
36c41ce835SZachary Turner RecurseIdFields);
37bdf0381eSZachary Turner dumpSymbolField(OS, "name", getName(), Indent);
38c41ce835SZachary Turner dumpSymbolIdField(OS, "typeId", getTypeId(), Indent, Session,
39c41ce835SZachary Turner PdbSymbolIdField::Type, ShowIdFields, RecurseIdFields);
40bdf0381eSZachary Turner dumpSymbolField(OS, "dataKind", getDataKind(), Indent);
41bdf0381eSZachary Turner dumpSymbolField(OS, "locationType", getLocationType(), Indent);
42bdf0381eSZachary Turner dumpSymbolField(OS, "constType", isConstType(), Indent);
43bdf0381eSZachary Turner dumpSymbolField(OS, "unalignedType", isUnalignedType(), Indent);
44bdf0381eSZachary Turner dumpSymbolField(OS, "volatileType", isVolatileType(), Indent);
45bdf0381eSZachary Turner dumpSymbolField(OS, "value", getValue(), Indent);
46bdf0381eSZachary Turner }
47bdf0381eSZachary Turner
getClassParentId() const48bdf0381eSZachary Turner SymIndexId NativeSymbolEnumerator::getClassParentId() const {
49bdf0381eSZachary Turner return Parent.getSymIndexId();
50bdf0381eSZachary Turner }
51bdf0381eSZachary Turner
getLexicalParentId() const52bdf0381eSZachary Turner SymIndexId NativeSymbolEnumerator::getLexicalParentId() const { return 0; }
53bdf0381eSZachary Turner
getName() const54adcd0268SBenjamin Kramer std::string NativeSymbolEnumerator::getName() const {
55adcd0268SBenjamin Kramer return std::string(Record.Name);
56adcd0268SBenjamin Kramer }
57bdf0381eSZachary Turner
getTypeId() const58bdf0381eSZachary Turner SymIndexId NativeSymbolEnumerator::getTypeId() const {
59bdf0381eSZachary Turner return Parent.getTypeId();
60bdf0381eSZachary Turner }
61bdf0381eSZachary Turner
getDataKind() const62bdf0381eSZachary Turner PDB_DataKind NativeSymbolEnumerator::getDataKind() const {
63bdf0381eSZachary Turner return PDB_DataKind::Constant;
64bdf0381eSZachary Turner }
65bdf0381eSZachary Turner
getLocationType() const66bdf0381eSZachary Turner PDB_LocType NativeSymbolEnumerator::getLocationType() const {
67bdf0381eSZachary Turner return PDB_LocType::Constant;
68bdf0381eSZachary Turner }
69bdf0381eSZachary Turner
isConstType() const70bdf0381eSZachary Turner bool NativeSymbolEnumerator::isConstType() const { return false; }
71bdf0381eSZachary Turner
isVolatileType() const72bdf0381eSZachary Turner bool NativeSymbolEnumerator::isVolatileType() const { return false; }
73bdf0381eSZachary Turner
isUnalignedType() const74bdf0381eSZachary Turner bool NativeSymbolEnumerator::isUnalignedType() const { return false; }
75bdf0381eSZachary Turner
getValue() const76bdf0381eSZachary Turner Variant NativeSymbolEnumerator::getValue() const {
77bdf0381eSZachary Turner const NativeTypeBuiltin &BT = Parent.getUnderlyingBuiltinType();
78bdf0381eSZachary Turner
79bdf0381eSZachary Turner switch (BT.getBuiltinType()) {
80bdf0381eSZachary Turner case PDB_BuiltinType::Int:
81bdf0381eSZachary Turner case PDB_BuiltinType::Long:
82bdf0381eSZachary Turner case PDB_BuiltinType::Char: {
83bdf0381eSZachary Turner assert(Record.Value.isSignedIntN(BT.getLength() * 8));
84bdf0381eSZachary Turner int64_t N = Record.Value.getSExtValue();
85bdf0381eSZachary Turner switch (BT.getLength()) {
86bdf0381eSZachary Turner case 1:
87bdf0381eSZachary Turner return Variant{static_cast<int8_t>(N)};
88bdf0381eSZachary Turner case 2:
89bdf0381eSZachary Turner return Variant{static_cast<int16_t>(N)};
90bdf0381eSZachary Turner case 4:
91bdf0381eSZachary Turner return Variant{static_cast<int32_t>(N)};
92bdf0381eSZachary Turner case 8:
93bdf0381eSZachary Turner return Variant{static_cast<int64_t>(N)};
94bdf0381eSZachary Turner }
95bdf0381eSZachary Turner break;
96bdf0381eSZachary Turner }
97bdf0381eSZachary Turner case PDB_BuiltinType::UInt:
98bdf0381eSZachary Turner case PDB_BuiltinType::ULong: {
99bdf0381eSZachary Turner assert(Record.Value.isIntN(BT.getLength() * 8));
100bdf0381eSZachary Turner uint64_t U = Record.Value.getZExtValue();
101bdf0381eSZachary Turner switch (BT.getLength()) {
102bdf0381eSZachary Turner case 1:
103bdf0381eSZachary Turner return Variant{static_cast<uint8_t>(U)};
104bdf0381eSZachary Turner case 2:
105bdf0381eSZachary Turner return Variant{static_cast<uint16_t>(U)};
106bdf0381eSZachary Turner case 4:
107bdf0381eSZachary Turner return Variant{static_cast<uint32_t>(U)};
108bdf0381eSZachary Turner case 8:
109bdf0381eSZachary Turner return Variant{static_cast<uint64_t>(U)};
110bdf0381eSZachary Turner }
111bdf0381eSZachary Turner break;
112bdf0381eSZachary Turner }
113bdf0381eSZachary Turner case PDB_BuiltinType::Bool: {
114bdf0381eSZachary Turner assert(Record.Value.isIntN(BT.getLength() * 8));
115bdf0381eSZachary Turner uint64_t U = Record.Value.getZExtValue();
116bdf0381eSZachary Turner return Variant{static_cast<bool>(U)};
117bdf0381eSZachary Turner }
118bdf0381eSZachary Turner default:
119bdf0381eSZachary Turner assert(false && "Invalid enumeration type");
120bdf0381eSZachary Turner break;
121bdf0381eSZachary Turner }
122bdf0381eSZachary Turner
123bdf0381eSZachary Turner return Variant{Record.Value.getSExtValue()};
124bdf0381eSZachary Turner }
125