161 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9#include "PdbSymUid.h"10 11using namespace lldb_private;12using namespace lldb_private::npdb;13using namespace llvm::codeview;14 15namespace {16struct GenericIdRepr {17 uint64_t tag : 4;18 uint64_t data : 60;19};20 21struct CompilandIdRepr {22 uint64_t tag : 4;23 uint64_t modi : 16;24 uint64_t unused : 44;25};26 27struct CompilandSymIdRepr {28 uint64_t tag : 4;29 uint64_t modi : 16;30 uint64_t offset : 32;31 uint64_t unused : 12;32};33 34struct GlobalSymIdRepr {35 uint64_t tag : 4;36 uint64_t offset : 32;37 uint64_t pub : 1;38 uint64_t unused : 27;39};40 41struct TypeSymIdRepr {42 uint64_t tag : 4;43 uint64_t index : 32;44 uint64_t ipi : 1;45 uint64_t unused : 27;46};47 48struct FieldListMemberIdRepr {49 uint64_t tag : 4;50 uint64_t index : 32;51 uint64_t offset : 16;52 uint64_t unused : 12;53};54 55static_assert(sizeof(CompilandIdRepr) == 8, "Invalid structure size!");56static_assert(sizeof(CompilandSymIdRepr) == 8, "Invalid structure size!");57static_assert(sizeof(GlobalSymIdRepr) == 8, "Invalid structure size!");58static_assert(sizeof(TypeSymIdRepr) == 8, "Invalid structure size!");59static_assert(sizeof(FieldListMemberIdRepr) == 8, "Invalid structure size!");60} // namespace61 62template <typename OutT, typename InT> static OutT repr_cast(const InT &value) {63 OutT result;64 ::memcpy(&result, &value, sizeof(value));65 return result;66}67 68PdbSymUid::PdbSymUid(const PdbCompilandId &cid) {69 CompilandIdRepr repr;70 ::memset(&repr, 0, sizeof(repr));71 repr.modi = cid.modi;72 repr.tag = static_cast<uint64_t>(PdbSymUidKind::Compiland);73 m_repr = repr_cast<uint64_t>(repr);74}75 76PdbSymUid::PdbSymUid(const PdbCompilandSymId &csid) {77 CompilandSymIdRepr repr;78 ::memset(&repr, 0, sizeof(repr));79 repr.modi = csid.modi;80 repr.offset = csid.offset;81 repr.tag = static_cast<uint64_t>(PdbSymUidKind::CompilandSym);82 m_repr = repr_cast<uint64_t>(repr);83}84 85PdbSymUid::PdbSymUid(const PdbGlobalSymId &gsid) {86 GlobalSymIdRepr repr;87 ::memset(&repr, 0, sizeof(repr));88 repr.pub = gsid.is_public;89 repr.offset = gsid.offset;90 repr.tag = static_cast<uint64_t>(PdbSymUidKind::GlobalSym);91 m_repr = repr_cast<uint64_t>(repr);92}93 94PdbSymUid::PdbSymUid(const PdbTypeSymId &tsid) {95 TypeSymIdRepr repr;96 ::memset(&repr, 0, sizeof(repr));97 repr.index = tsid.index.getIndex();98 repr.ipi = tsid.is_ipi;99 repr.tag = static_cast<uint64_t>(PdbSymUidKind::Type);100 m_repr = repr_cast<uint64_t>(repr);101}102 103PdbSymUid::PdbSymUid(const PdbFieldListMemberId &flmid) {104 FieldListMemberIdRepr repr;105 ::memset(&repr, 0, sizeof(repr));106 repr.index = flmid.index.getIndex();107 repr.offset = flmid.offset;108 repr.tag = static_cast<uint64_t>(PdbSymUidKind::FieldListMember);109 m_repr = repr_cast<uint64_t>(repr);110}111 112PdbSymUidKind PdbSymUid::kind() const {113 GenericIdRepr generic = repr_cast<GenericIdRepr>(m_repr);114 return static_cast<PdbSymUidKind>(generic.tag);115}116 117PdbCompilandId PdbSymUid::asCompiland() const {118 assert(kind() == PdbSymUidKind::Compiland);119 auto repr = repr_cast<CompilandIdRepr>(m_repr);120 PdbCompilandId result;121 result.modi = repr.modi;122 return result;123}124 125PdbCompilandSymId PdbSymUid::asCompilandSym() const {126 assert(kind() == PdbSymUidKind::CompilandSym);127 auto repr = repr_cast<CompilandSymIdRepr>(m_repr);128 PdbCompilandSymId result;129 result.modi = repr.modi;130 result.offset = repr.offset;131 return result;132}133 134PdbGlobalSymId PdbSymUid::asGlobalSym() const {135 assert(kind() == PdbSymUidKind::GlobalSym ||136 kind() == PdbSymUidKind::PublicSym);137 auto repr = repr_cast<GlobalSymIdRepr>(m_repr);138 PdbGlobalSymId result;139 result.is_public = repr.pub;140 result.offset = repr.offset;141 return result;142}143 144PdbTypeSymId PdbSymUid::asTypeSym() const {145 assert(kind() == PdbSymUidKind::Type);146 auto repr = repr_cast<TypeSymIdRepr>(m_repr);147 PdbTypeSymId result;148 result.index.setIndex(repr.index);149 result.is_ipi = repr.ipi;150 return result;151}152 153PdbFieldListMemberId PdbSymUid::asFieldListMember() const {154 assert(kind() == PdbSymUidKind::FieldListMember);155 auto repr = repr_cast<FieldListMemberIdRepr>(m_repr);156 PdbFieldListMemberId result;157 result.index.setIndex(repr.index);158 result.offset = repr.offset;159 return result;160}161