[Go to site: main page, start]

LLDB mainline
PdbSymUid.cpp
Go to the documentation of this file.
1//===-- PdbSymUid.cpp -----------------------------------------------------===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "PdbSymUid.h"
10#include "llvm/Support/NativeFormatting.h"
11
12using namespace lldb_private;
13using namespace lldb_private::npdb;
14using namespace llvm::codeview;
15
16namespace {
17struct GenericIdRepr {
18 uint64_t tag : 4;
19 uint64_t data : 60;
20};
21
22struct CompilandIdRepr {
23 uint64_t tag : 4;
24 uint64_t modi : 16;
25 uint64_t unused : 44;
26};
27
28struct CompilandSymIdRepr {
29 uint64_t tag : 4;
30 uint64_t modi : 16;
31 uint64_t offset : 32;
32 uint64_t unused : 12;
33};
34
35struct GlobalSymIdRepr {
36 uint64_t tag : 4;
37 uint64_t offset : 32;
38 uint64_t pub : 1;
39 uint64_t unused : 27;
40};
41
42struct TypeSymIdRepr {
43 uint64_t tag : 4;
44 uint64_t index : 32;
45 uint64_t ipi : 1;
46 uint64_t unused : 27;
47};
48
49struct FieldListMemberIdRepr {
50 uint64_t tag : 4;
51 uint64_t index : 32;
52 uint64_t offset : 16;
53 uint64_t unused : 12;
54};
55
56static_assert(sizeof(CompilandIdRepr) == 8, "Invalid structure size!");
57static_assert(sizeof(CompilandSymIdRepr) == 8, "Invalid structure size!");
58static_assert(sizeof(GlobalSymIdRepr) == 8, "Invalid structure size!");
59static_assert(sizeof(TypeSymIdRepr) == 8, "Invalid structure size!");
60static_assert(sizeof(FieldListMemberIdRepr) == 8, "Invalid structure size!");
61} // namespace
62
63template <typename OutT, typename InT> static OutT repr_cast(const InT &value) {
64 OutT result;
65 ::memcpy(&result, &value, sizeof(value));
66 return result;
67}
68
70 CompilandIdRepr repr;
71 ::memset(&repr, 0, sizeof(repr));
72 repr.modi = cid.modi;
73 repr.tag = static_cast<uint64_t>(PdbSymUidKind::Compiland);
75}
76
78 CompilandSymIdRepr repr;
79 ::memset(&repr, 0, sizeof(repr));
80 repr.modi = csid.modi;
81 repr.offset = csid.offset;
82 repr.tag = static_cast<uint64_t>(PdbSymUidKind::CompilandSym);
84}
85
87 GlobalSymIdRepr repr;
88 ::memset(&repr, 0, sizeof(repr));
89 repr.pub = gsid.is_public;
90 repr.offset = gsid.offset;
91 repr.tag = static_cast<uint64_t>(PdbSymUidKind::GlobalSym);
93}
94
96 TypeSymIdRepr repr;
97 ::memset(&repr, 0, sizeof(repr));
98 repr.index = tsid.index.getIndex();
99 repr.ipi = tsid.is_ipi;
100 repr.tag = static_cast<uint64_t>(PdbSymUidKind::Type);
102}
103
105 FieldListMemberIdRepr repr;
106 ::memset(&repr, 0, sizeof(repr));
107 repr.index = flmid.index.getIndex();
108 repr.offset = flmid.offset;
109 repr.tag = static_cast<uint64_t>(PdbSymUidKind::FieldListMember);
111}
112
114 GenericIdRepr generic = repr_cast<GenericIdRepr>(m_repr);
115 return static_cast<PdbSymUidKind>(generic.tag);
116}
117
119 assert(kind() == PdbSymUidKind::Compiland);
121 PdbCompilandId result;
122 result.modi = repr.modi;
123 return result;
124}
125
129 PdbCompilandSymId result;
130 result.modi = repr.modi;
131 result.offset = repr.offset;
132 return result;
133}
134
136 assert(kind() == PdbSymUidKind::GlobalSym ||
139 PdbGlobalSymId result;
140 result.is_public = repr.pub;
141 result.offset = repr.offset;
142 return result;
143}
144
146 assert(kind() == PdbSymUidKind::Type);
147 auto repr = repr_cast<TypeSymIdRepr>(m_repr);
148 PdbTypeSymId result;
149 result.index.setIndex(repr.index);
150 result.is_ipi = repr.ipi;
151 return result;
152}
153
158 result.index.setIndex(repr.index);
159 result.offset = repr.offset;
160 return result;
161}
162
164 const lldb_private::npdb::PdbCompilandSymId &V, raw_ostream &Stream,
165 StringRef Style) {
166 Stream << "Sym(modi=" << V.modi << ", offset=" << V.offset << ')';
167}
168
170 const lldb_private::npdb::PdbGlobalSymId &V, raw_ostream &Stream,
171 StringRef Style) {
172 Stream << "GlobalSym(";
173 if (V.is_public)
174 Stream << "public, ";
175 Stream << V.offset << ')';
176}
177
179 const lldb_private::npdb::PdbTypeSymId &V, raw_ostream &Stream,
180 StringRef Style) {
181 Stream << "TypeSym(";
182 if (V.is_ipi)
183 Stream << "IPI, ";
184 else
185 Stream << "TPI, ";
186
187 write_hex(Stream, V.index.getIndex(), HexPrintStyle::PrefixLower);
188 Stream << ')';
189}
static OutT repr_cast(const InT &value)
Definition PdbSymUid.cpp:63
A stream class that can stream formatted output to a file.
Definition Stream.h:28
PdbGlobalSymId asGlobalSym() const
PdbCompilandId asCompiland() const
PdbCompilandSymId asCompilandSym() const
PdbTypeSymId asTypeSym() const
PdbFieldListMemberId asFieldListMember() const
PdbSymUidKind kind() const
A class that represents a running process on the host machine.
llvm::codeview::TypeIndex index
Definition PdbSymUid.h:82
llvm::codeview::TypeIndex index
Definition PdbSymUid.h:73
static void format(const lldb_private::npdb::PdbCompilandSymId &V, raw_ostream &Stream, StringRef Style)
static void format(const lldb_private::npdb::PdbGlobalSymId &V, raw_ostream &Stream, StringRef Style)
static void format(const lldb_private::npdb::PdbTypeSymId &V, raw_ostream &Stream, StringRef Style)