xref: /llvm-project/llvm/lib/DebugInfo/PDB/Native/NativeSymbolEnumerator.cpp (revision eb4c8608115c1c9af0fc8cb5b1e9f2bc960014ef)
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