15#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
16#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
17#include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
18#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
19#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
37 llvm::ArrayRef<LocalVariableAddrGap> gaps) {
45 while (!gaps.empty()) {
46 const LocalVariableAddrGap &gap = gaps.front();
48 result.
Append(start, gap_start - start);
49 start = gap_start + gap.Range;
50 gaps = gaps.drop_front();
53 result.
Append(start, end - start);
58struct MemberLocations {
59 std::map<uint64_t, MemberValLocation> offset_to_location;
61 bool is_dwarf =
false;
63 MemberLocations() =
default;
64 MemberLocations(
const DWARFExpression &expr) : expr(expr), is_dwarf(true) {}
65 MemberLocations(uint64_t offset,
const MemberValLocation &member_loc) {
66 insert(offset, member_loc);
69 void insert(uint64_t offset,
const MemberValLocation &member_loc) {
70 offset_to_location[offset] = member_loc;
75 bool operator()(
const MemberLocations &,
const MemberLocations &)
const {
83 MemberLocations::Comparator>
86void AddMemberLocationRanges(RangeMap &location_map, uint64_t offset,
89 RangeMap new_location_map;
91 RangeMap::Entry *entry) {
92 RangeMap::Entry overlap_region = {base, end - base, entry->data};
93 overlap_region.data.insert(offset, member_loc);
94 new_location_map.Append(overlap_region);
97 for (
const auto &range : ranges) {
100 uint32_t base_idx = location_map.FindEntryIndexThatContainsOrFollows(base);
101 while (
auto *entry = location_map.GetMutableEntryAtIndex(base_idx)) {
102 if (base >= end || entry->base >= end)
104 if (entry->data.is_dwarf)
105 base = entry->GetRangeEnd();
108 if (base > entry->base) {
110 new_location_map.Append({end, entry_end - end, entry->data});
111 add_overlap_region(base, end < entry_end ? end : entry_end, entry);
112 entry->SetRangeEnd(base);
113 }
else if (base < entry->base) {
114 new_location_map.Append(
115 {base, entry->base - base, {offset, member_loc}});
116 if (entry_end == end)
117 entry->data.insert(offset, member_loc);
119 add_overlap_region(entry->base, end, entry);
120 entry->ShrinkFront(end - entry->base);
123 if (end < entry_end) {
124 new_location_map.Append({end, entry_end, entry->data});
125 entry->SetRangeEnd(end);
127 entry->data.insert(offset, member_loc);
135 new_location_map.Append({base, end - base, {offset, member_loc}});
137 for (
const auto &entry : new_location_map)
138 location_map.Append(entry);
139 if (!new_location_map.IsEmpty())
147 RangeMap new_location_map;
148 for (
const auto &range : ranges) {
151 uint32_t base_idx = location_map.FindEntryIndexThatContains(base);
152 uint32_t end_idx = location_map.FindEntryIndexThatContains(end - 1);
154 if (base_idx == end_idx && base_idx !=
UINT32_MAX) {
155 auto *entry = location_map.GetMutableEntryAtIndex(base_idx);
156 if (base > entry->base) {
157 new_location_map.Append({entry->base, base - entry->base, entry->data});
158 entry->ShrinkFront(base - entry->base);
160 if (end == entry->GetRangeEnd())
163 entry->ShrinkFront(end - base);
164 new_location_map.Append({base, end - base, expr});
168 base_idx = location_map.FindEntryIndexThatContainsOrFollows(base);
169 if (
auto *entry = location_map.GetMutableEntryAtIndex(base_idx)) {
170 if (entry->Contains(base) && entry->base != base) {
171 entry->SetRangeEnd(base);
175 end_idx = location_map.FindEntryIndexThatContainsOrFollows(end - 1);
176 if (
auto *entry = location_map.GetMutableEntryAtIndex(end_idx)) {
177 if (entry->Contains(end - 1)) {
178 if (entry->GetRangeEnd() == end)
181 entry->ShrinkFront(end - entry->base);
186 end_idx = location_map.GetSize();
188 location_map.Erase(base_idx, end_idx);
189 new_location_map.Append({base, end - base, expr});
192 for (
const auto &entry : new_location_map)
193 location_map.Append(entry);
199 assert(
IsTagRecord(type) &&
"type is not a tag record!");
200 switch (type.kind()) {
205 llvm::cantFail(TypeDeserializer::deserializeAs<ClassRecord>(type, cr));
210 llvm::cantFail(TypeDeserializer::deserializeAs<UnionRecord>(type, ur));
215 llvm::cantFail(TypeDeserializer::deserializeAs<EnumRecord>(type, er));
219 llvm_unreachable(
"Unreachable!");
224 : cvclass(std::move(c)),
225 m_kind(cvclass.Kind == TypeRecordKind::Struct ? Struct : Class) {}
227 : cvunion(std::move(u)), m_kind(
Union) {}
234 return PDB_SymType::CompilandDetails;
236 return PDB_SymType::CompilandEnv;
239 return PDB_SymType::Thunk;
241 return PDB_SymType::CoffGroup;
243 return PDB_SymType::Export;
247 return PDB_SymType::Function;
249 return PDB_SymType::PublicSymbol;
251 return PDB_SymType::InlineSite;
255 case S_REGREL32_INDIR:
264 return PDB_SymType::Data;
266 return PDB_SymType::Block;
268 return PDB_SymType::Label;
270 return PDB_SymType::CallSite;
271 case S_HEAPALLOCSITE:
272 return PDB_SymType::HeapAllocationSite;
274 return PDB_SymType::Callee;
276 return PDB_SymType::Caller;
278 lldbassert(
false &&
"Invalid symbol record kind!");
280 return PDB_SymType::None;
286 return PDB_SymType::ArrayType;
288 return PDB_SymType::FunctionSig;
290 return PDB_SymType::BaseClass;
292 return PDB_SymType::BaseInterface;
297 return PDB_SymType::UDT;
299 return PDB_SymType::PointerType;
301 return PDB_SymType::Enum;
303 return PDB_SymType::FunctionSig;
305 return PDB_SymType::BuiltinType;
307 lldbassert(
false &&
"Invalid type record kind!");
309 return PDB_SymType::None;
313 switch (sym.kind()) {
319 case S_LPROC32_DPC_ID:
326 case S_HEAPALLOCSITE:
340 switch (sym.kind()) {
346 case S_LPROC32_DPC_ID:
358 RecordT record(
static_cast<SymbolRecordKind
>(sym.kind()));
359 cantFail(SymbolDeserializer::deserializeAs<RecordT>(sym, record));
363template <
typename RecordT>
366 return {record.Segment, record.CodeOffset};
372 return {record.ThunkSection, record.ThunkOffset};
377 return {record.Segment, record.Offset};
383 return {record.Segment, record.Offset};
388 return {record.Segment, record.DataOffset};
394 return {record.Segment, record.DataOffset};
398 switch (sym.kind()) {
404 case S_LPROC32_DPC_ID:
405 return ::GetSegmentAndOffset<ProcSym>(sym);
407 return ::GetSegmentAndOffset<Thunk32Sym>(sym);
410 return ::GetSegmentAndOffset<TrampolineSym>(sym);
413 return ::GetSegmentAndOffset<CoffGroupSym>(sym);
416 return ::GetSegmentAndOffset<BlockSym>(sym);
419 return ::GetSegmentAndOffset<LabelSym>(sym);
422 return ::GetSegmentAndOffset<CallSiteInfoSym>(sym);
424 case S_HEAPALLOCSITE:
425 return ::GetSegmentAndOffset<HeapAllocationSiteSym>(sym);
431 return ::GetSegmentAndOffset<DataSym>(sym);
435 return ::GetSegmentAndOffset<ThreadLocalDataSym>(sym);
438 lldbassert(
false &&
"Record does not have a segment/offset!");
443template <
typename RecordT>
446 return {record.Segment, record.CodeOffset, record.CodeSize};
453 return {record.ThunkSection, record.ThunkOffset, record.Size};
471 switch (sym.kind()) {
477 case S_LPROC32_DPC_ID:
478 return ::GetSegmentOffsetAndLength<ProcSym>(sym);
480 return ::GetSegmentOffsetAndLength<Thunk32Sym>(sym);
483 return ::GetSegmentOffsetAndLength<TrampolineSym>(sym);
486 return ::GetSegmentOffsetAndLength<CoffGroupSym>(sym);
489 return ::GetSegmentOffsetAndLength<BlockSym>(sym);
492 lldbassert(
false &&
"Record does not have a segment/offset/length triple!");
501 switch (cvt.kind()) {
505 llvm::cantFail(TypeDeserializer::deserializeAs<ClassRecord>(cvt, cr));
506 return cr.isForwardRef();
508 llvm::cantFail(TypeDeserializer::deserializeAs<UnionRecord>(cvt, ur));
509 return ur.isForwardRef();
511 llvm::cantFail(TypeDeserializer::deserializeAs<EnumRecord>(cvt, er));
512 return er.isForwardRef();
519 switch (cvt.kind()) {
531 switch (cvt.kind()) {
543 if (
id.is_ipi ||
id.index.isSimple())
549 if (
id.is_ipi ||
id.index.isSimple())
557 case MemberAccess::Private:
559 case MemberAccess::Protected:
561 case MemberAccess::Public:
563 case MemberAccess::None:
566 llvm_unreachable(
"unreachable");
570 switch (cvt.kind()) {
575 cantFail(TypeDeserializer::deserializeAs<ClassRecord>(cvt, cr));
580 cantFail(TypeDeserializer::deserializeAs<UnionRecord>(cvt, ur));
585 cantFail(TypeDeserializer::deserializeAs<EnumRecord>(cvt, er));
589 llvm_unreachable(
"Unreachable!");
596 llvm::cantFail(TypeDeserializer::deserializeAs<ModifierRecord>(modifier, mr));
597 return mr.ModifiedType;
607 if (sym.kind() == S_REGREL32) {
608 RegRelativeSym reg(SymbolRecordKind::RegRelativeSym);
609 cantFail(SymbolDeserializer::deserializeAs<RegRelativeSym>(sym, reg));
610 result.
type = reg.Type;
611 result.
name = reg.Name;
615 if (sym.kind() == S_REGREL32_INDIR) {
616 RegRelativeIndirSym reg(SymbolRecordKind::RegRelativeIndirSym);
617 cantFail(SymbolDeserializer::deserializeAs<RegRelativeIndirSym>(sym, reg));
618 result.
type = reg.Type;
619 result.
name = reg.Name;
623 if (sym.kind() == S_REGISTER) {
624 RegisterSym reg(SymbolRecordKind::RegisterSym);
625 cantFail(SymbolDeserializer::deserializeAs<RegisterSym>(sym, reg));
626 result.
type = reg.Index;
627 result.
name = reg.Name;
631 if (sym.kind() == S_LOCAL) {
632 LocalSym local(SymbolRecordKind::LocalSym);
633 cantFail(SymbolDeserializer::deserializeAs<LocalSym>(sym, local));
634 result.
type = local.Type;
635 result.
name = local.Name;
637 ((local.Flags & LocalSymFlags::IsParameter) != LocalSymFlags::None);
641 if (sym.kind() == S_GDATA32 || sym.kind() == S_LDATA32) {
642 DataSym data(SymbolRecordKind::DataSym);
643 cantFail(SymbolDeserializer::deserializeAs<DataSym>(sym, data));
644 result.
type = data.Type;
645 result.
name = data.Name;
649 if (sym.kind() == S_GTHREAD32 || sym.kind() == S_LTHREAD32) {
650 ThreadLocalDataSym data(SymbolRecordKind::ThreadLocalDataSym);
651 cantFail(SymbolDeserializer::deserializeAs<ThreadLocalDataSym>(sym, data));
652 result.
type = data.Type;
653 result.
name = data.Name;
657 if (sym.kind() == S_CONSTANT) {
658 ConstantSym constant(SymbolRecordKind::ConstantSym);
659 cantFail(SymbolDeserializer::deserializeAs<ConstantSym>(sym, constant));
660 result.
type = constant.Type;
661 result.
name = constant.Name;
665 lldbassert(
false &&
"Invalid variable record kind!");
669static llvm::FixedStreamArray<FrameData>::Iterator
671 const DebugFrameDataSubsectionRef &fpo_data,
677 const RangeListEntry &range = ranges.
GetEntryRef(0);
679 auto it = fpo_data.begin();
682 for (; it != fpo_data.end(); ++it) {
683 RangeListEntry fd_range(load_addr + it->RvaStart, it->CodeSize);
685 if (fd_range.Contains(range)) {
692 for (; it != fpo_data.end(); ++it) {
693 RangeListEntry fd_range(load_addr + it->RvaStart, it->CodeSize);
695 if (!fd_range.Contains(range)) {
706 llvm::StringRef &out_program) {
707 const DebugFrameDataSubsectionRef &new_fpo_data =
708 index.
dbi().getNewFpoRecords();
712 if (frame_data_it == new_fpo_data.end())
715 auto strings = index.
pdb().getStringTable();
717 consumeError(strings.takeError());
720 out_program = cantFail(strings->getStringForID(frame_data_it->FrameFunc));
728 if (frame_proc_cvs.kind() != S_FRAMEPROC)
729 return RegisterId::NONE;
731 FrameProcSym frame_proc(SymbolRecordKind::FrameProcSym);
732 cantFail(SymbolDeserializer::deserializeAs<FrameProcSym>(frame_proc_cvs,
739 return is_parameter ? frame_proc.getParamFramePtrReg(cpu_type)
740 : frame_proc.getLocalFramePtrReg(cpu_type);
751 if (sym.kind() == S_REGREL32) {
752 RegRelativeSym reg(SymbolRecordKind::RegRelativeSym);
753 cantFail(SymbolDeserializer::deserializeAs<RegRelativeSym>(sym, reg));
760 if (sym.kind() == S_REGREL32_INDIR) {
761 RegRelativeIndirSym reg(SymbolRecordKind::RegRelativeIndirSym);
762 cantFail(SymbolDeserializer::deserializeAs<RegRelativeIndirSym>(sym, reg));
766 reg.OffsetInUdt, module),
771 if (sym.kind() == S_REGISTER) {
772 RegisterSym reg(SymbolRecordKind::RegisterSym);
773 cantFail(SymbolDeserializer::deserializeAs<RegisterSym>(sym, reg));
780 if (sym.kind() == S_LOCAL) {
781 LocalSym local(SymbolRecordKind::LocalSym);
782 if (llvm::Error
error =
783 SymbolDeserializer::deserializeAs<LocalSym>(sym, local)) {
784 llvm::consumeError(std::move(
error));
789 var_id.
offset + sym.RecordData.size());
790 CVSymbol loc_specifier_cvs;
792 RegisterId base_reg = RegisterId::NONE;
795 std::map<uint64_t, size_t> offset_to_size;
799 RangeMap location_map;
803 bool finished =
false;
806 switch (loc_specifier_cvs.kind()) {
807 case S_DEFRANGE_FRAMEPOINTER_REL: {
808 DefRangeFramePointerRelSym loc(
809 SymbolRecordKind::DefRangeFramePointerRelSym);
810 if (llvm::Error
error =
811 SymbolDeserializer::deserializeAs<DefRangeFramePointerRelSym>(
812 loc_specifier_cvs, loc)) {
813 llvm::consumeError(std::move(
error));
818 if (base_reg == RegisterId::NONE) {
822 lldbassert(func_block_cvs.kind() == S_GPROC32 ||
823 func_block_cvs.kind() == S_LPROC32);
826 func_block_cvs.length());
829 if (base_reg == RegisterId::NONE)
833 if (base_reg == RegisterId::VFRAME) {
834 llvm::StringRef program;
843 AddDwarfRange(location_map, expr, raw_ranges);
846 case S_DEFRANGE_REGISTER: {
847 DefRangeRegisterSym loc(SymbolRecordKind::DefRangeRegisterSym);
848 if (llvm::Error
error =
849 SymbolDeserializer::deserializeAs<DefRangeRegisterSym>(
850 loc_specifier_cvs, loc)) {
851 llvm::consumeError(std::move(
error));
854 RegisterId reg_id = (RegisterId)(uint16_t)loc.Hdr.Register;
859 AddDwarfRange(location_map, expr, raw_ranges);
862 case S_DEFRANGE_REGISTER_REL: {
863 DefRangeRegisterRelSym loc(SymbolRecordKind::DefRangeRegisterRelSym);
864 if (llvm::Error
error =
865 SymbolDeserializer::deserializeAs<DefRangeRegisterRelSym>(
866 loc_specifier_cvs, loc)) {
867 llvm::consumeError(std::move(
error));
872 RegisterId reg_id = (RegisterId)(uint16_t)loc.Hdr.Register;
874 if (reg_id == RegisterId::VFRAME) {
875 llvm::StringRef program;
878 program, loc.Hdr.BasePointerOffset, module);
887 if (!loc.hasSpilledUDTMember())
888 AddDwarfRange(location_map, expr, raw_ranges);
891 case S_DEFRANGE_SUBFIELD_REGISTER: {
892 DefRangeSubfieldRegisterSym loc(
893 SymbolRecordKind::DefRangeSubfieldRegisterSym);
894 if (llvm::Error
error =
895 SymbolDeserializer::deserializeAs<DefRangeSubfieldRegisterSym>(
896 loc_specifier_cvs, loc)) {
897 llvm::consumeError(std::move(
error));
906 offset_to_size[loc.Hdr.OffsetInParent] =
reg_size;
907 AddMemberLocationRanges(location_map, loc.Hdr.OffsetInParent,
908 {loc.Hdr.Register, 0, true}, ranges);
914 case S_DEFRANGE_SUBFIELD:
915 case S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
922 loc_specifier_id.
modi,
923 loc_specifier_id.
offset + loc_specifier_cvs.RecordData.size());
925 for (
const auto &entry : location_map) {
927 entry.data.is_dwarf ? entry.data.expr
929 entry.data.offset_to_location,
930 offset_to_size, type_size, module);
937 llvm_unreachable(
"Symbol is not a local variable!");
944 case SimpleTypeKind::Boolean128:
945 case SimpleTypeKind::Boolean16:
946 case SimpleTypeKind::Boolean32:
947 case SimpleTypeKind::Boolean64:
948 case SimpleTypeKind::Boolean8:
950 case SimpleTypeKind::Byte:
951 case SimpleTypeKind::UnsignedCharacter:
953 case SimpleTypeKind::NarrowCharacter:
955 case SimpleTypeKind::SignedCharacter:
956 case SimpleTypeKind::SByte:
958 case SimpleTypeKind::Character16:
960 case SimpleTypeKind::Character32:
962 case SimpleTypeKind::Character8:
964 case SimpleTypeKind::Complex80:
966 case SimpleTypeKind::Complex64:
968 case SimpleTypeKind::Complex32:
969 case SimpleTypeKind::Complex32PartialPrecision:
971 case SimpleTypeKind::Float80:
973 case SimpleTypeKind::Float128:
975 case SimpleTypeKind::Float64:
977 case SimpleTypeKind::Float32:
978 case SimpleTypeKind::Float32PartialPrecision:
980 case SimpleTypeKind::Float16:
982 case SimpleTypeKind::Int128:
983 case SimpleTypeKind::Int128Oct:
985 case SimpleTypeKind::Int64:
986 case SimpleTypeKind::Int64Quad:
988 case SimpleTypeKind::Int32:
990 case SimpleTypeKind::Int16:
991 case SimpleTypeKind::Int16Short:
993 case SimpleTypeKind::UInt128:
994 case SimpleTypeKind::UInt128Oct:
996 case SimpleTypeKind::UInt64:
997 case SimpleTypeKind::UInt64Quad:
999 case SimpleTypeKind::HResult:
1000 case SimpleTypeKind::UInt32:
1002 case SimpleTypeKind::UInt16:
1003 case SimpleTypeKind::UInt16Short:
1005 case SimpleTypeKind::Int32Long:
1007 case SimpleTypeKind::UInt32Long:
1009 case SimpleTypeKind::Void:
1011 case SimpleTypeKind::WideCharacter:
1015 case SimpleTypeKind::Float48:
1016 case SimpleTypeKind::Complex16:
1017 case SimpleTypeKind::Complex48:
1018 case SimpleTypeKind::Complex128:
1019 case SimpleTypeKind::NotTranslated:
1020 case SimpleTypeKind::None:
1028 case SimpleTypeKind::Boolean128:
1029 case SimpleTypeKind::Complex128:
1030 case SimpleTypeKind::Int128:
1031 case SimpleTypeKind::Int128Oct:
1032 case SimpleTypeKind::UInt128:
1033 case SimpleTypeKind::UInt128Oct:
1034 case SimpleTypeKind::Float128:
1036 case SimpleTypeKind::Complex80:
1037 case SimpleTypeKind::Float80:
1039 case SimpleTypeKind::Boolean64:
1040 case SimpleTypeKind::Complex64:
1041 case SimpleTypeKind::UInt64:
1042 case SimpleTypeKind::UInt64Quad:
1043 case SimpleTypeKind::Float64:
1044 case SimpleTypeKind::Int64:
1045 case SimpleTypeKind::Int64Quad:
1047 case SimpleTypeKind::Complex48:
1048 case SimpleTypeKind::Float48:
1050 case SimpleTypeKind::Boolean32:
1051 case SimpleTypeKind::Character32:
1052 case SimpleTypeKind::Complex32:
1053 case SimpleTypeKind::Complex32PartialPrecision:
1054 case SimpleTypeKind::Float32:
1055 case SimpleTypeKind::Float32PartialPrecision:
1056 case SimpleTypeKind::Int32:
1057 case SimpleTypeKind::Int32Long:
1058 case SimpleTypeKind::UInt32Long:
1059 case SimpleTypeKind::HResult:
1060 case SimpleTypeKind::UInt32:
1062 case SimpleTypeKind::Boolean16:
1063 case SimpleTypeKind::Character16:
1064 case SimpleTypeKind::Complex16:
1065 case SimpleTypeKind::Float16:
1066 case SimpleTypeKind::Int16:
1067 case SimpleTypeKind::Int16Short:
1068 case SimpleTypeKind::UInt16:
1069 case SimpleTypeKind::UInt16Short:
1070 case SimpleTypeKind::WideCharacter:
1072 case SimpleTypeKind::Boolean8:
1073 case SimpleTypeKind::Byte:
1074 case SimpleTypeKind::UnsignedCharacter:
1075 case SimpleTypeKind::NarrowCharacter:
1076 case SimpleTypeKind::SignedCharacter:
1077 case SimpleTypeKind::SByte:
1078 case SimpleTypeKind::Character8:
1081 case SimpleTypeKind::Void:
1082 case SimpleTypeKind::None:
1083 case SimpleTypeKind::NotTranslated:
1091 if (
id.index.isSimple())
1094 CVType cvt = tpi.getType(
id.index);
1105 return llvm::cantFail(tpi.findFullDeclForForwardRef(
id.index));
1110 llvm::cantFail(TypeDeserializer::deserializeAs<RecordType>(cvt, record));
1111 return record.getSize();
1115 llvm::pdb::TpiStream &tpi) {
1116 if (
id.index.isSimple()) {
1117 switch (
id.index.getSimpleMode()) {
1118 case SimpleTypeMode::Direct:
1120 case SimpleTypeMode::NearPointer32:
1121 case SimpleTypeMode::FarPointer32:
1123 case SimpleTypeMode::NearPointer64:
1125 case SimpleTypeMode::NearPointer128:
1133 TypeIndex index =
id.index;
1135 index = llvm::cantFail(tpi.findFullDeclForForwardRef(index));
1137 CVType cvt = tpi.getType(index);
1138 switch (cvt.kind()) {
1143 llvm::cantFail(TypeDeserializer::deserializeAs<EnumRecord>(cvt, record));
1157 BitFieldRecord record;
1158 llvm::cantFail(TypeDeserializer::deserializeAs<BitFieldRecord>(cvt, record));
static const size_t reg_size
static llvm::raw_ostream & error(Stream &strm)
SegmentOffsetLength GetSegmentOffsetAndLength< CoffGroupSym >(const CVSymbol &sym)
static llvm::FixedStreamArray< FrameData >::Iterator GetCorrespondingFrameData(lldb::addr_t load_addr, const DebugFrameDataSubsectionRef &fpo_data, const Variable::RangeList &ranges)
SegmentOffset GetSegmentAndOffset< TrampolineSym >(const CVSymbol &sym)
SegmentOffset GetSegmentAndOffset< CoffGroupSym >(const CVSymbol &sym)
SegmentOffset GetSegmentAndOffset< Thunk32Sym >(const CVSymbol &sym)
SegmentOffset GetSegmentAndOffset< DataSym >(const CVSymbol &sym)
static size_t GetSizeOfTypeInternal(CVType cvt)
SegmentOffsetLength GetSegmentOffsetAndLength< TrampolineSym >(const CVSymbol &sym)
RecordT createRecord(const CVSymbol &sym)
SegmentOffset GetSegmentAndOffset< ThreadLocalDataSym >(const CVSymbol &sym)
static bool GetFrameDataProgram(PdbIndex &index, const Variable::RangeList &ranges, llvm::StringRef &out_program)
SegmentOffsetLength GetSegmentOffsetAndLength< Thunk32Sym >(const CVSymbol &sym)
static Variable::RangeList MakeRangeList(const PdbIndex &index, const LocalVariableAddrRange &range, llvm::ArrayRef< LocalVariableAddrGap > gaps)
static RegisterId GetBaseFrameRegister(PdbIndex &index, PdbCompilandSymId frame_proc_id, bool is_parameter)
static llvm::StringRef DropScope(llvm::StringRef name)
A class that describes a single lexical block.
"lldb/Expression/DWARFExpressionList.h" Encapsulates a range map from file address range to a single ...
bool AddExpression(lldb::addr_t base, lldb::addr_t end, DWARFExpression expr)
"lldb/Expression/DWARFExpression.h" Encapsulates a DWARF location expression and interprets it.
bool IsValid() const
Return true if the location expression contains data.
Entry & GetEntryRef(size_t i)
void Append(const Entry &entry)
Range< lldb::addr_t, lldb::addr_t > Entry
RangeVector< lldb::addr_t, lldb::addr_t > RangeList
const CompilandIndexItem * GetCompiland(uint16_t modi) const
PdbIndex - Lazy access to the important parts of a PDB file.
CompileUnitIndex & compilands()
llvm::pdb::DbiStream & dbi()
llvm::codeview::CVSymbol ReadSymbolRecord(PdbCompilandSymId cu_sym) const
lldb::addr_t GetLoadAddress() const
llvm::pdb::PDBFile & pdb()
lldb::addr_t MakeVirtualAddress(uint16_t segment, uint32_t offset) const
llvm::pdb::TpiStream & tpi()
PdbCompilandSymId asCompilandSym() const
#define LLDB_INVALID_ADDRESS
bool SymbolHasAddress(const llvm::codeview::CVSymbol &sym)
DWARFExpression MakeRegRelIndirLocationExpression(llvm::codeview::RegisterId reg, int32_t offset, int32_t offset_in_udt, lldb::ModuleSP module)
llvm::StringRef DropNameScope(llvm::StringRef name)
DWARFExpression MakeRegRelLocationExpression(llvm::codeview::RegisterId reg, int32_t offset, lldb::ModuleSP module)
llvm::pdb::PDB_SymType CVTypeToPDBType(llvm::codeview::TypeLeafKind kind)
size_t GetTypeSizeForSimpleKind(llvm::codeview::SimpleTypeKind kind)
DWARFExpression MakeVFrameRelLocationExpression(llvm::StringRef fpo_program, int32_t offset, lldb::ModuleSP module)
SegmentOffset GetSegmentAndOffset(const llvm::codeview::CVSymbol &sym)
lldb::BasicType GetCompilerTypeForSimpleKind(llvm::codeview::SimpleTypeKind kind)
VariableInfo GetVariableNameInfo(llvm::codeview::CVSymbol symbol)
SegmentOffsetLength GetSegmentOffsetAndLength(const llvm::codeview::CVSymbol &sym)
bool IsTagRecord(llvm::codeview::CVType cvt)
llvm::codeview::TypeIndex LookThroughModifierRecord(llvm::codeview::CVType modifier)
DWARFExpression MakeEnregisteredLocationExpressionForComposite(const std::map< uint64_t, MemberValLocation > &offset_to_location, std::map< uint64_t, size_t > &offset_to_size, size_t total_size, lldb::ModuleSP module)
VariableInfo GetVariableLocationInfo(PdbIndex &index, PdbCompilandSymId var_id, Block &func_block, lldb::ModuleSP module)
bool IsForwardRefUdt(llvm::codeview::CVType cvt)
lldb::AccessType TranslateMemberAccess(llvm::codeview::MemberAccess access)
llvm::codeview::TypeIndex GetFieldListIndex(llvm::codeview::CVType cvt)
DWARFExpression MakeEnregisteredLocationExpression(llvm::codeview::RegisterId reg, lldb::ModuleSP module)
llvm::pdb::PDB_SymType CVSymToPDBSym(llvm::codeview::SymbolKind kind)
size_t GetSizeOfType(PdbTypeSymId id, llvm::pdb::TpiStream &tpi)
uint32_t GetRegisterSize(llvm::codeview::RegisterId register_id)
PdbTypeSymId GetBestPossibleDecl(PdbTypeSymId id, llvm::pdb::TpiStream &tpi)
bool IsClassStructUnion(llvm::codeview::CVType cvt)
bool SymbolIsCode(const llvm::codeview::CVSymbol &sym)
A class that represents a running process on the host machine.
BasicType
Basic types enumeration for the public API SBType::GetBasicType().
@ eBasicTypeUnsignedShort
@ eBasicTypeUnsignedInt128
@ eBasicTypeLongDoubleComplex
@ eBasicTypeUnsignedLongLong
@ eBasicTypeDoubleComplex
std::shared_ptr< lldb_private::Module > ModuleSP
lldb::user_id_t GetID() const
Get accessor for the user ID.
static CVTagRecord create(llvm::codeview::CVType type)
CVTagRecord(llvm::codeview::ClassRecord &&c)
std::optional< llvm::codeview::Compile3Sym > m_compile_opts
DWARFExpressionList location
llvm::codeview::TypeIndex type