xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/SymbolFile/NativePDB/PdbSymUid.cpp (revision dda2819751e49c83612958492e38917049128b41)
1*dda28197Spatrick //===-- PdbSymUid.cpp -----------------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9061da546Spatrick #include "PdbSymUid.h"
10061da546Spatrick 
11061da546Spatrick using namespace lldb_private;
12061da546Spatrick using namespace lldb_private::npdb;
13061da546Spatrick using namespace llvm::codeview;
14061da546Spatrick 
15061da546Spatrick namespace {
16061da546Spatrick struct GenericIdRepr {
17061da546Spatrick   uint64_t tag : 4;
18061da546Spatrick   uint64_t data : 60;
19061da546Spatrick };
20061da546Spatrick 
21061da546Spatrick struct CompilandIdRepr {
22061da546Spatrick   uint64_t tag : 4;
23061da546Spatrick   uint64_t modi : 16;
24061da546Spatrick   uint64_t unused : 44;
25061da546Spatrick };
26061da546Spatrick 
27061da546Spatrick struct CompilandSymIdRepr {
28061da546Spatrick   uint64_t tag : 4;
29061da546Spatrick   uint64_t modi : 16;
30061da546Spatrick   uint64_t offset : 32;
31061da546Spatrick   uint64_t unused : 12;
32061da546Spatrick };
33061da546Spatrick 
34061da546Spatrick struct GlobalSymIdRepr {
35061da546Spatrick   uint64_t tag : 4;
36061da546Spatrick   uint64_t offset : 32;
37061da546Spatrick   uint64_t pub : 1;
38061da546Spatrick   uint64_t unused : 27;
39061da546Spatrick };
40061da546Spatrick 
41061da546Spatrick struct TypeSymIdRepr {
42061da546Spatrick   uint64_t tag : 4;
43061da546Spatrick   uint64_t index : 32;
44061da546Spatrick   uint64_t ipi : 1;
45061da546Spatrick   uint64_t unused : 27;
46061da546Spatrick };
47061da546Spatrick 
48061da546Spatrick struct FieldListMemberIdRepr {
49061da546Spatrick   uint64_t tag : 4;
50061da546Spatrick   uint64_t index : 32;
51061da546Spatrick   uint64_t offset : 16;
52061da546Spatrick   uint64_t unused : 12;
53061da546Spatrick };
54061da546Spatrick 
55061da546Spatrick static_assert(sizeof(CompilandIdRepr) == 8, "Invalid structure size!");
56061da546Spatrick static_assert(sizeof(CompilandSymIdRepr) == 8, "Invalid structure size!");
57061da546Spatrick static_assert(sizeof(GlobalSymIdRepr) == 8, "Invalid structure size!");
58061da546Spatrick static_assert(sizeof(TypeSymIdRepr) == 8, "Invalid structure size!");
59061da546Spatrick static_assert(sizeof(FieldListMemberIdRepr) == 8, "Invalid structure size!");
60061da546Spatrick } // namespace
61061da546Spatrick 
repr_cast(const InT & value)62061da546Spatrick template <typename OutT, typename InT> static OutT repr_cast(const InT &value) {
63061da546Spatrick   OutT result;
64061da546Spatrick   ::memcpy(&result, &value, sizeof(value));
65061da546Spatrick   return result;
66061da546Spatrick }
67061da546Spatrick 
PdbSymUid(const PdbCompilandId & cid)68061da546Spatrick PdbSymUid::PdbSymUid(const PdbCompilandId &cid) {
69061da546Spatrick   CompilandIdRepr repr;
70061da546Spatrick   ::memset(&repr, 0, sizeof(repr));
71061da546Spatrick   repr.modi = cid.modi;
72061da546Spatrick   repr.tag = static_cast<uint64_t>(PdbSymUidKind::Compiland);
73061da546Spatrick   m_repr = repr_cast<uint64_t>(repr);
74061da546Spatrick }
75061da546Spatrick 
PdbSymUid(const PdbCompilandSymId & csid)76061da546Spatrick PdbSymUid::PdbSymUid(const PdbCompilandSymId &csid) {
77061da546Spatrick   CompilandSymIdRepr repr;
78061da546Spatrick   ::memset(&repr, 0, sizeof(repr));
79061da546Spatrick   repr.modi = csid.modi;
80061da546Spatrick   repr.offset = csid.offset;
81061da546Spatrick   repr.tag = static_cast<uint64_t>(PdbSymUidKind::CompilandSym);
82061da546Spatrick   m_repr = repr_cast<uint64_t>(repr);
83061da546Spatrick }
84061da546Spatrick 
PdbSymUid(const PdbGlobalSymId & gsid)85061da546Spatrick PdbSymUid::PdbSymUid(const PdbGlobalSymId &gsid) {
86061da546Spatrick   GlobalSymIdRepr repr;
87061da546Spatrick   ::memset(&repr, 0, sizeof(repr));
88061da546Spatrick   repr.pub = gsid.is_public;
89061da546Spatrick   repr.offset = gsid.offset;
90061da546Spatrick   repr.tag = static_cast<uint64_t>(PdbSymUidKind::GlobalSym);
91061da546Spatrick   m_repr = repr_cast<uint64_t>(repr);
92061da546Spatrick }
93061da546Spatrick 
PdbSymUid(const PdbTypeSymId & tsid)94061da546Spatrick PdbSymUid::PdbSymUid(const PdbTypeSymId &tsid) {
95061da546Spatrick   TypeSymIdRepr repr;
96061da546Spatrick   ::memset(&repr, 0, sizeof(repr));
97061da546Spatrick   repr.index = tsid.index.getIndex();
98061da546Spatrick   repr.ipi = tsid.is_ipi;
99061da546Spatrick   repr.tag = static_cast<uint64_t>(PdbSymUidKind::Type);
100061da546Spatrick   m_repr = repr_cast<uint64_t>(repr);
101061da546Spatrick }
102061da546Spatrick 
PdbSymUid(const PdbFieldListMemberId & flmid)103061da546Spatrick PdbSymUid::PdbSymUid(const PdbFieldListMemberId &flmid) {
104061da546Spatrick   FieldListMemberIdRepr repr;
105061da546Spatrick   ::memset(&repr, 0, sizeof(repr));
106061da546Spatrick   repr.index = flmid.index.getIndex();
107061da546Spatrick   repr.offset = flmid.offset;
108061da546Spatrick   repr.tag = static_cast<uint64_t>(PdbSymUidKind::FieldListMember);
109061da546Spatrick   m_repr = repr_cast<uint64_t>(repr);
110061da546Spatrick }
111061da546Spatrick 
kind() const112061da546Spatrick PdbSymUidKind PdbSymUid::kind() const {
113061da546Spatrick   GenericIdRepr generic = repr_cast<GenericIdRepr>(m_repr);
114061da546Spatrick   return static_cast<PdbSymUidKind>(generic.tag);
115061da546Spatrick }
116061da546Spatrick 
asCompiland() const117061da546Spatrick PdbCompilandId PdbSymUid::asCompiland() const {
118061da546Spatrick   assert(kind() == PdbSymUidKind::Compiland);
119061da546Spatrick   auto repr = repr_cast<CompilandIdRepr>(m_repr);
120061da546Spatrick   PdbCompilandId result;
121061da546Spatrick   result.modi = repr.modi;
122061da546Spatrick   return result;
123061da546Spatrick }
124061da546Spatrick 
asCompilandSym() const125061da546Spatrick PdbCompilandSymId PdbSymUid::asCompilandSym() const {
126061da546Spatrick   assert(kind() == PdbSymUidKind::CompilandSym);
127061da546Spatrick   auto repr = repr_cast<CompilandSymIdRepr>(m_repr);
128061da546Spatrick   PdbCompilandSymId result;
129061da546Spatrick   result.modi = repr.modi;
130061da546Spatrick   result.offset = repr.offset;
131061da546Spatrick   return result;
132061da546Spatrick }
133061da546Spatrick 
asGlobalSym() const134061da546Spatrick PdbGlobalSymId PdbSymUid::asGlobalSym() const {
135061da546Spatrick   assert(kind() == PdbSymUidKind::GlobalSym ||
136061da546Spatrick          kind() == PdbSymUidKind::PublicSym);
137061da546Spatrick   auto repr = repr_cast<GlobalSymIdRepr>(m_repr);
138061da546Spatrick   PdbGlobalSymId result;
139061da546Spatrick   result.is_public = repr.pub;
140061da546Spatrick   result.offset = repr.offset;
141061da546Spatrick   return result;
142061da546Spatrick }
143061da546Spatrick 
asTypeSym() const144061da546Spatrick PdbTypeSymId PdbSymUid::asTypeSym() const {
145061da546Spatrick   assert(kind() == PdbSymUidKind::Type);
146061da546Spatrick   auto repr = repr_cast<TypeSymIdRepr>(m_repr);
147061da546Spatrick   PdbTypeSymId result;
148061da546Spatrick   result.index.setIndex(repr.index);
149061da546Spatrick   result.is_ipi = repr.ipi;
150061da546Spatrick   return result;
151061da546Spatrick }
152061da546Spatrick 
asFieldListMember() const153061da546Spatrick PdbFieldListMemberId PdbSymUid::asFieldListMember() const {
154061da546Spatrick   assert(kind() == PdbSymUidKind::FieldListMember);
155061da546Spatrick   auto repr = repr_cast<FieldListMemberIdRepr>(m_repr);
156061da546Spatrick   PdbFieldListMemberId result;
157061da546Spatrick   result.index.setIndex(repr.index);
158061da546Spatrick   result.offset = repr.offset;
159061da546Spatrick   return result;
160061da546Spatrick }
161