1*80814287SRaphael Isemann //===-- PdbSymUid.cpp -----------------------------------------------------===//
26284aee9SZachary 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
66284aee9SZachary Turner //
76284aee9SZachary Turner //===----------------------------------------------------------------------===//
86284aee9SZachary Turner
96284aee9SZachary Turner #include "PdbSymUid.h"
106284aee9SZachary Turner
116284aee9SZachary Turner using namespace lldb_private;
126284aee9SZachary Turner using namespace lldb_private::npdb;
136284aee9SZachary Turner using namespace llvm::codeview;
146284aee9SZachary Turner
156284aee9SZachary Turner namespace {
166284aee9SZachary Turner struct GenericIdRepr {
176284aee9SZachary Turner uint64_t tag : 4;
186284aee9SZachary Turner uint64_t data : 60;
196284aee9SZachary Turner };
206284aee9SZachary Turner
216284aee9SZachary Turner struct CompilandIdRepr {
226284aee9SZachary Turner uint64_t tag : 4;
236284aee9SZachary Turner uint64_t modi : 16;
246284aee9SZachary Turner uint64_t unused : 44;
256284aee9SZachary Turner };
266284aee9SZachary Turner
276284aee9SZachary Turner struct CompilandSymIdRepr {
286284aee9SZachary Turner uint64_t tag : 4;
296284aee9SZachary Turner uint64_t modi : 16;
306284aee9SZachary Turner uint64_t offset : 32;
316284aee9SZachary Turner uint64_t unused : 12;
326284aee9SZachary Turner };
336284aee9SZachary Turner
346284aee9SZachary Turner struct GlobalSymIdRepr {
356284aee9SZachary Turner uint64_t tag : 4;
366284aee9SZachary Turner uint64_t offset : 32;
376284aee9SZachary Turner uint64_t pub : 1;
386284aee9SZachary Turner uint64_t unused : 27;
396284aee9SZachary Turner };
406284aee9SZachary Turner
416284aee9SZachary Turner struct TypeSymIdRepr {
426284aee9SZachary Turner uint64_t tag : 4;
436284aee9SZachary Turner uint64_t index : 32;
446284aee9SZachary Turner uint64_t ipi : 1;
456284aee9SZachary Turner uint64_t unused : 27;
466284aee9SZachary Turner };
476284aee9SZachary Turner
486284aee9SZachary Turner struct FieldListMemberIdRepr {
496284aee9SZachary Turner uint64_t tag : 4;
506284aee9SZachary Turner uint64_t index : 32;
516284aee9SZachary Turner uint64_t offset : 16;
526284aee9SZachary Turner uint64_t unused : 12;
536284aee9SZachary Turner };
546284aee9SZachary Turner
556284aee9SZachary Turner static_assert(sizeof(CompilandIdRepr) == 8, "Invalid structure size!");
566284aee9SZachary Turner static_assert(sizeof(CompilandSymIdRepr) == 8, "Invalid structure size!");
576284aee9SZachary Turner static_assert(sizeof(GlobalSymIdRepr) == 8, "Invalid structure size!");
586284aee9SZachary Turner static_assert(sizeof(TypeSymIdRepr) == 8, "Invalid structure size!");
596284aee9SZachary Turner static_assert(sizeof(FieldListMemberIdRepr) == 8, "Invalid structure size!");
606284aee9SZachary Turner } // namespace
616284aee9SZachary Turner
repr_cast(const InT & value)626284aee9SZachary Turner template <typename OutT, typename InT> static OutT repr_cast(const InT &value) {
636284aee9SZachary Turner OutT result;
646284aee9SZachary Turner ::memcpy(&result, &value, sizeof(value));
656284aee9SZachary Turner return result;
666284aee9SZachary Turner }
676284aee9SZachary Turner
PdbSymUid(const PdbCompilandId & cid)686284aee9SZachary Turner PdbSymUid::PdbSymUid(const PdbCompilandId &cid) {
696284aee9SZachary Turner CompilandIdRepr repr;
706284aee9SZachary Turner ::memset(&repr, 0, sizeof(repr));
716284aee9SZachary Turner repr.modi = cid.modi;
726284aee9SZachary Turner repr.tag = static_cast<uint64_t>(PdbSymUidKind::Compiland);
736284aee9SZachary Turner m_repr = repr_cast<uint64_t>(repr);
746284aee9SZachary Turner }
756284aee9SZachary Turner
PdbSymUid(const PdbCompilandSymId & csid)766284aee9SZachary Turner PdbSymUid::PdbSymUid(const PdbCompilandSymId &csid) {
776284aee9SZachary Turner CompilandSymIdRepr repr;
786284aee9SZachary Turner ::memset(&repr, 0, sizeof(repr));
796284aee9SZachary Turner repr.modi = csid.modi;
806284aee9SZachary Turner repr.offset = csid.offset;
816284aee9SZachary Turner repr.tag = static_cast<uint64_t>(PdbSymUidKind::CompilandSym);
826284aee9SZachary Turner m_repr = repr_cast<uint64_t>(repr);
836284aee9SZachary Turner }
846284aee9SZachary Turner
PdbSymUid(const PdbGlobalSymId & gsid)856284aee9SZachary Turner PdbSymUid::PdbSymUid(const PdbGlobalSymId &gsid) {
866284aee9SZachary Turner GlobalSymIdRepr repr;
876284aee9SZachary Turner ::memset(&repr, 0, sizeof(repr));
886284aee9SZachary Turner repr.pub = gsid.is_public;
896284aee9SZachary Turner repr.offset = gsid.offset;
906284aee9SZachary Turner repr.tag = static_cast<uint64_t>(PdbSymUidKind::GlobalSym);
916284aee9SZachary Turner m_repr = repr_cast<uint64_t>(repr);
926284aee9SZachary Turner }
936284aee9SZachary Turner
PdbSymUid(const PdbTypeSymId & tsid)946284aee9SZachary Turner PdbSymUid::PdbSymUid(const PdbTypeSymId &tsid) {
956284aee9SZachary Turner TypeSymIdRepr repr;
966284aee9SZachary Turner ::memset(&repr, 0, sizeof(repr));
976284aee9SZachary Turner repr.index = tsid.index.getIndex();
986284aee9SZachary Turner repr.ipi = tsid.is_ipi;
996284aee9SZachary Turner repr.tag = static_cast<uint64_t>(PdbSymUidKind::Type);
1006284aee9SZachary Turner m_repr = repr_cast<uint64_t>(repr);
1016284aee9SZachary Turner }
1026284aee9SZachary Turner
PdbSymUid(const PdbFieldListMemberId & flmid)1036284aee9SZachary Turner PdbSymUid::PdbSymUid(const PdbFieldListMemberId &flmid) {
1046284aee9SZachary Turner FieldListMemberIdRepr repr;
1056284aee9SZachary Turner ::memset(&repr, 0, sizeof(repr));
1066284aee9SZachary Turner repr.index = flmid.index.getIndex();
1076284aee9SZachary Turner repr.offset = flmid.offset;
1086284aee9SZachary Turner repr.tag = static_cast<uint64_t>(PdbSymUidKind::FieldListMember);
1096284aee9SZachary Turner m_repr = repr_cast<uint64_t>(repr);
1106284aee9SZachary Turner }
1116284aee9SZachary Turner
kind() const1126284aee9SZachary Turner PdbSymUidKind PdbSymUid::kind() const {
1136284aee9SZachary Turner GenericIdRepr generic = repr_cast<GenericIdRepr>(m_repr);
1146284aee9SZachary Turner return static_cast<PdbSymUidKind>(generic.tag);
1156284aee9SZachary Turner }
1166284aee9SZachary Turner
asCompiland() const1176284aee9SZachary Turner PdbCompilandId PdbSymUid::asCompiland() const {
1186284aee9SZachary Turner assert(kind() == PdbSymUidKind::Compiland);
1196284aee9SZachary Turner auto repr = repr_cast<CompilandIdRepr>(m_repr);
1206284aee9SZachary Turner PdbCompilandId result;
1216284aee9SZachary Turner result.modi = repr.modi;
1226284aee9SZachary Turner return result;
1236284aee9SZachary Turner }
1246284aee9SZachary Turner
asCompilandSym() const1256284aee9SZachary Turner PdbCompilandSymId PdbSymUid::asCompilandSym() const {
1266284aee9SZachary Turner assert(kind() == PdbSymUidKind::CompilandSym);
1276284aee9SZachary Turner auto repr = repr_cast<CompilandSymIdRepr>(m_repr);
1286284aee9SZachary Turner PdbCompilandSymId result;
1296284aee9SZachary Turner result.modi = repr.modi;
1306284aee9SZachary Turner result.offset = repr.offset;
1316284aee9SZachary Turner return result;
1326284aee9SZachary Turner }
1336284aee9SZachary Turner
asGlobalSym() const1346284aee9SZachary Turner PdbGlobalSymId PdbSymUid::asGlobalSym() const {
1356284aee9SZachary Turner assert(kind() == PdbSymUidKind::GlobalSym ||
1366284aee9SZachary Turner kind() == PdbSymUidKind::PublicSym);
1376284aee9SZachary Turner auto repr = repr_cast<GlobalSymIdRepr>(m_repr);
1386284aee9SZachary Turner PdbGlobalSymId result;
1396284aee9SZachary Turner result.is_public = repr.pub;
1406284aee9SZachary Turner result.offset = repr.offset;
1416284aee9SZachary Turner return result;
1426284aee9SZachary Turner }
1436284aee9SZachary Turner
asTypeSym() const1446284aee9SZachary Turner PdbTypeSymId PdbSymUid::asTypeSym() const {
1456284aee9SZachary Turner assert(kind() == PdbSymUidKind::Type);
1466284aee9SZachary Turner auto repr = repr_cast<TypeSymIdRepr>(m_repr);
1476284aee9SZachary Turner PdbTypeSymId result;
1486284aee9SZachary Turner result.index.setIndex(repr.index);
1496284aee9SZachary Turner result.is_ipi = repr.ipi;
1506284aee9SZachary Turner return result;
1516284aee9SZachary Turner }
1526284aee9SZachary Turner
asFieldListMember() const1536284aee9SZachary Turner PdbFieldListMemberId PdbSymUid::asFieldListMember() const {
1546284aee9SZachary Turner assert(kind() == PdbSymUidKind::FieldListMember);
1556284aee9SZachary Turner auto repr = repr_cast<FieldListMemberIdRepr>(m_repr);
1566284aee9SZachary Turner PdbFieldListMemberId result;
1576284aee9SZachary Turner result.index.setIndex(repr.index);
1586284aee9SZachary Turner result.offset = repr.offset;
1596284aee9SZachary Turner return result;
1606284aee9SZachary Turner }
161