[Lldb-commits] [lldb] 3dbf524 - [LLDB][NativePDB] Fix a crash when S_DEFRANGE_SUBFIELD_REGISTER descirbes a simple type
Zequan Wu via lldb-commits
lldb-commits at lists.llvm.org
Thu Apr 14 11:06:27 PDT 2022
Author: Zequan Wu
Date: 2022-04-14T11:06:21-07:00
New Revision: 3dbf524ad75bf4aa6d4a1f72b82000943a1d967c
URL: https://github.com/llvm/llvm-project/commit/3dbf524ad75bf4aa6d4a1f72b82000943a1d967c
DIFF: https://github.com/llvm/llvm-project/commit/3dbf524ad75bf4aa6d4a1f72b82000943a1d967c.diff
LOG: [LLDB][NativePDB] Fix a crash when S_DEFRANGE_SUBFIELD_REGISTER descirbes a simple type
When a variable is simple type and has 64 bits, the debug info may look like the following when targeting 32bit windows. The variable's content is split into two 32bits registers.
```
480 | S_LOCAL [size = 12] `x`
type=0x0013 (__int64), flags = param
492 | S_DEFRANGE_SUBFIELD_REGISTER [size = 20]
register = EAX, may have no name = true, offset in parent = 0
range = [0001:0073,+7), gaps = []
512 | S_DEFRANGE_SUBFIELD_REGISTER [size = 20]
register = ECX, may have no name = true, offset in parent = 4
range = [0001:0073,+7), gaps = []
```
Reviewed By: labath
Differential Revision: https://reviews.llvm.org/D122943
Added:
lldb/test/Shell/SymbolFile/NativePDB/Inputs/subfield_register_simple_type.lldbinit
lldb/test/Shell/SymbolFile/NativePDB/subfield_register_simple_type.s
Modified:
lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.cpp
index 54fc8d505c958..1f0ca3f3d5d80 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.cpp
@@ -51,10 +51,11 @@ MakeRangeList(const PdbIndex &index, const LocalVariableAddrRange &range,
namespace {
struct FindMembersSize : public TypeVisitorCallbacks {
- FindMembersSize(std::vector<std::pair<RegisterId, uint32_t>> &members_info,
- TpiStream &tpi)
+ FindMembersSize(
+ llvm::SmallVectorImpl<std::pair<RegisterId, uint32_t>> &members_info,
+ TpiStream &tpi)
: members_info(members_info), tpi(tpi) {}
- std::vector<std::pair<RegisterId, uint32_t>> &members_info;
+ llvm::SmallVectorImpl<std::pair<RegisterId, uint32_t>> &members_info;
TpiStream &tpi;
llvm::Error visitKnownMember(CVMemberRecord &cvr,
DataMemberRecord &member) override {
@@ -670,7 +671,7 @@ VariableInfo lldb_private::npdb::GetVariableLocationInfo(
result.ranges = std::move(ranges);
}
break;
- }
+ }
case S_DEFRANGE_REGISTER_REL: {
DefRangeRegisterRelSym loc(SymbolRecordKind::DefRangeRegisterRelSym);
cantFail(SymbolDeserializer::deserializeAs<DefRangeRegisterRelSym>(
@@ -707,22 +708,32 @@ VariableInfo lldb_private::npdb::GetVariableLocationInfo(
break;
}
case S_DEFRANGE_SUBFIELD_REGISTER: {
- CVType class_cvt = index.tpi().getType(result.type);
- ClassRecord class_record = CVTagRecord::create(class_cvt).asClass();
- CVType field_list = index.tpi().getType(class_record.FieldList);
- std::vector<std::pair<RegisterId, uint32_t>> members_info;
- FindMembersSize find_members_size(members_info, index.tpi());
- if (llvm::Error err =
- visitMemberRecordStream(field_list.data(), find_members_size))
- llvm::consumeError(std::move(err));
-
- std::vector<Variable::RangeList> range_lists;
+ // A vector of register id and member size pairs. If the variable is a
+ // simple type, then we don't know the number of subfields. Otherwise, the
+ // vector size will be the number of subfields in the udt type.
+ llvm::SmallVector<std::pair<RegisterId, uint32_t>> members_info;
+ bool is_simple_type = result.type.isSimple();
+ if (!is_simple_type) {
+ CVType class_cvt = index.tpi().getType(result.type);
+ ClassRecord class_record = CVTagRecord::create(class_cvt).asClass();
+ CVType field_list = index.tpi().getType(class_record.FieldList);
+ FindMembersSize find_members_size(members_info, index.tpi());
+ if (llvm::Error err =
+ visitMemberRecordStream(field_list.data(), find_members_size)) {
+ llvm::consumeError(std::move(err));
+ break;
+ }
+ }
+
+ uint32_t prev_offset = 0;
uint32_t cur_offset = 0;
size_t member_idx = 0;
// Assuming S_DEFRANGE_SUBFIELD_REGISTER is followed only by
// S_DEFRANGE_SUBFIELD_REGISTER, need to verify.
- while (loc_specifier_cvs.kind() == S_DEFRANGE_SUBFIELD_REGISTER &&
- member_idx < members_info.size()) {
+ while (loc_specifier_cvs.kind() == S_DEFRANGE_SUBFIELD_REGISTER) {
+ if (!is_simple_type && member_idx >= members_info.size())
+ break;
+
DefRangeSubfieldRegisterSym loc(
SymbolRecordKind::DefRangeSubfieldRegisterSym);
cantFail(SymbolDeserializer::deserializeAs<DefRangeSubfieldRegisterSym>(
@@ -736,17 +747,27 @@ VariableInfo lldb_private::npdb::GetVariableLocationInfo(
result.ranges->Sort();
}
- // Some fields maybe optimized away and have no
- // S_DEFRANGE_SUBFIELD_REGISTER to describe them. Skip them.
- while (loc.Hdr.OffsetInParent != cur_offset) {
- cur_offset += members_info[member_idx].second;
- ++member_idx;
- }
- if (member_idx < members_info.size()) {
- members_info[member_idx].first =
- (RegisterId)(uint16_t)loc.Hdr.Register;
- cur_offset += members_info[member_idx].second;
- ++member_idx;
+ if (is_simple_type) {
+ // Fix last member's size.
+ if (!members_info.empty())
+ members_info.back().second =
+ loc.Hdr.OffsetInParent - prev_offset;
+ members_info.emplace_back((RegisterId)(uint16_t)loc.Hdr.Register, 0);
+ prev_offset = loc.Hdr.OffsetInParent;
+ } else {
+ // Some fields maybe optimized away and have no
+ // S_DEFRANGE_SUBFIELD_REGISTER to describe them. Skip them.
+ while (loc.Hdr.OffsetInParent != cur_offset &&
+ member_idx < members_info.size()) {
+ cur_offset += members_info[member_idx].second;
+ ++member_idx;
+ }
+ if (member_idx < members_info.size()) {
+ members_info[member_idx].first =
+ (RegisterId)(uint16_t)loc.Hdr.Register;
+ cur_offset += members_info[member_idx].second;
+ ++member_idx;
+ }
}
// Go to next S_DEFRANGE_SUBFIELD_REGISTER.
loc_specifier_id = PdbCompilandSymId(
@@ -754,6 +775,9 @@ VariableInfo lldb_private::npdb::GetVariableLocationInfo(
loc_specifier_id.offset + loc_specifier_cvs.RecordData.size());
loc_specifier_cvs = index.ReadSymbolRecord(loc_specifier_id);
}
+ if (is_simple_type && !members_info.empty())
+ members_info.back().second =
+ GetTypeSizeForSimpleKind(result.type.getSimpleKind()) - prev_offset;
auto member_info_ref = llvm::makeArrayRef(members_info);
result.location =
MakeEnregisteredLocationExpressionForClass(member_info_ref, module);
diff --git a/lldb/test/Shell/SymbolFile/NativePDB/Inputs/subfield_register_simple_type.lldbinit b/lldb/test/Shell/SymbolFile/NativePDB/Inputs/subfield_register_simple_type.lldbinit
new file mode 100644
index 0000000000000..3dc33fd789dac
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/NativePDB/Inputs/subfield_register_simple_type.lldbinit
@@ -0,0 +1,2 @@
+image lookup -a 0x40102f -v
+quit
diff --git a/lldb/test/Shell/SymbolFile/NativePDB/subfield_register_simple_type.s b/lldb/test/Shell/SymbolFile/NativePDB/subfield_register_simple_type.s
new file mode 100644
index 0000000000000..7b92b19d2dbbc
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/NativePDB/subfield_register_simple_type.s
@@ -0,0 +1,433 @@
+# clang-format off
+# REQUIRES: lld, x86
+
+# RUN: %clang_cl --target=i386-windows-msvc -c /Fo%t.obj %s
+# RUN: lld-link /debug:full /nodefaultlib /entry:main %t.obj /out:%t.exe /base:0x400000
+# RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \
+# RUN: %p/Inputs/subfield_register_simple_type.lldbinit 2>&1 | FileCheck %s
+
+# This file is compiled from following source file:
+# clang-cl --target=i386-windows-msvc /Z7 /O1 -c /Fa a.cpp
+# __int64 __attribute__((optnone)) bar(__int64 x) { return x; };
+# __int64 foo(__int64 x) {
+# return bar(x);
+# }
+#
+# int main(int argc, char** argv) {
+# foo(argc);
+# return 0;
+# }
+
+# FIXME: The following variable location have wrong register numbers due to
+# https://github.com/llvm/llvm-project/issues/53575. Fix them after resolving
+# the issue.
+
+# CHECK: (lldb) image lookup -a 0x40102f -v
+# CHECK: LineEntry: [0x00401026-0x00401039): C:\src\a.cpp:3
+# CHECK-NEXT: Variable: id = {{.*}}, name = "x", type = "int64_t", valid ranges = [0x0040102f-0x00401036), location = DW_OP_reg0 EAX, DW_OP_piece 0x4, DW_OP_reg2 EDX, DW_OP_piece 0x4, decl =
+
+ .text
+ .def @feat.00;
+ .scl 3;
+ .type 0;
+ .endef
+ .globl @feat.00
+.set @feat.00, 1
+ .intel_syntax noprefix
+ .file "a.cpp"
+ .def "?bar@@YA_J_J at Z";
+ .scl 2;
+ .type 32;
+ .endef
+ .section .text,"xr",one_only,"?bar@@YA_J_J at Z"
+ .globl "?bar@@YA_J_J at Z" # -- Begin function ?bar@@YA_J_J at Z
+ .p2align 4, 0x90
+"?bar@@YA_J_J at Z": # @"?bar@@YA_J_J at Z"
+Lfunc_begin0:
+ .cv_func_id 0
+ .cv_file 1 "C:\\src\\a.cpp" "CB99424BC3DD1AB059A2DBC6841147F2" 1
+ .cv_loc 0 1 1 0 # a.cpp:1:0
+ .cv_fpo_proc "?bar@@YA_J_J at Z" 8
+# %bb.0: # %entry
+ push ebp
+ .cv_fpo_pushreg ebp
+ mov ebp, esp
+ .cv_fpo_setframe ebp
+ and esp, -8
+ .cv_fpo_stackalign 8
+ sub esp, 8
+ .cv_fpo_stackalloc 8
+ .cv_fpo_endprologue
+ mov eax, dword ptr [ebp + 8]
+ mov ecx, dword ptr [ebp + 12]
+ mov dword ptr [esp], eax
+ mov dword ptr [esp + 4], ecx
+Ltmp0:
+ mov eax, dword ptr [esp]
+ mov edx, dword ptr [esp + 4]
+ mov esp, ebp
+ pop ebp
+ ret
+Ltmp1:
+ .cv_fpo_endproc
+Lfunc_end0:
+ # -- End function
+ .def "?foo@@YA_J_J at Z";
+ .scl 2;
+ .type 32;
+ .endef
+ .section .text,"xr",one_only,"?foo@@YA_J_J at Z"
+ .globl "?foo@@YA_J_J at Z" # -- Begin function ?foo@@YA_J_J at Z
+"?foo@@YA_J_J at Z": # @"?foo@@YA_J_J at Z"
+Lfunc_begin1:
+ .cv_func_id 1
+ .cv_fpo_proc "?foo@@YA_J_J at Z" 8
+# %bb.0: # %entry
+ #DEBUG_VALUE: foo:x <- [DW_OP_plus_uconst 4] [$esp+0]
+ .cv_loc 1 1 3 0 # a.cpp:3:0
+ jmp "?bar@@YA_J_J at Z" # TAILCALL
+Ltmp2:
+ .cv_fpo_endproc
+Lfunc_end1:
+ # -- End function
+ .def _main;
+ .scl 2;
+ .type 32;
+ .endef
+ .section .text,"xr",one_only,_main
+ .globl _main # -- Begin function main
+_main: # @main
+Lfunc_begin2:
+ .cv_func_id 2
+ .cv_loc 2 1 6 0 # a.cpp:6:0
+ .cv_fpo_proc _main 8
+# %bb.0: # %entry
+ #DEBUG_VALUE: main:argv <- [DW_OP_plus_uconst 8] [$esp+0]
+ #DEBUG_VALUE: main:argc <- [DW_OP_plus_uconst 4] [$esp+0]
+ .cv_inline_site_id 3 within 2 inlined_at 1 7 0
+ .cv_loc 3 1 3 0 # a.cpp:3:0
+ mov eax, dword ptr [esp + 4]
+ mov ecx, eax
+ sar ecx, 31
+Ltmp3:
+ #DEBUG_VALUE: foo:x <- [DW_OP_LLVM_fragment 0 32] $eax
+ #DEBUG_VALUE: foo:x <- [DW_OP_LLVM_fragment 32 32] $ecx
+ push ecx
+Ltmp4:
+ push eax
+ call "?bar@@YA_J_J at Z"
+Ltmp5:
+ add esp, 8
+Ltmp6:
+ .cv_loc 2 1 8 0 # a.cpp:8:0
+ xor eax, eax
+ ret
+Ltmp7:
+ .cv_fpo_endproc
+Lfunc_end2:
+ # -- End function
+ .section .drectve,"yn"
+ .ascii " /DEFAULTLIB:libcmt.lib"
+ .ascii " /DEFAULTLIB:oldnames.lib"
+ .section .debug$S,"dr"
+ .p2align 2
+ .long 4 # Debug section magic
+ .long 241
+ .long Ltmp9-Ltmp8 # Subsection size
+Ltmp8:
+ .short Ltmp11-Ltmp10 # Record length
+Ltmp10:
+ .short 4353 # Record kind: S_OBJNAME
+ .long 0 # Signature
+ .asciz "C:\\src\\a.obj" # Object name
+ .p2align 2
+Ltmp11:
+ .short Ltmp13-Ltmp12 # Record length
+Ltmp12:
+ .short 4412 # Record kind: S_COMPILE3
+ .long 1 # Flags and language
+ .short 7 # CPUType
+ .short 15 # Frontend version
+ .short 0
+ .short 0
+ .short 0
+ .short 15000 # Backend version
+ .short 0
+ .short 0
+ .short 0
+ .asciz "clang version 15.0.0" # Null-terminated compiler version string
+ .p2align 2
+Ltmp13:
+Ltmp9:
+ .p2align 2
+ .long 246 # Inlinee lines subsection
+ .long Ltmp15-Ltmp14 # Subsection size
+Ltmp14:
+ .long 0 # Inlinee lines signature
+
+ # Inlined function foo starts at a.cpp:2
+ .long 4098 # Type index of inlined function
+ .cv_filechecksumoffset 1 # Offset into filechecksum table
+ .long 2 # Starting line number
+Ltmp15:
+ .p2align 2
+ .section .debug$S,"dr",associative,"?bar@@YA_J_J at Z"
+ .p2align 2
+ .long 4 # Debug section magic
+ .cv_fpo_data "?bar@@YA_J_J at Z"
+ .long 241 # Symbol subsection for bar
+ .long Ltmp17-Ltmp16 # Subsection size
+Ltmp16:
+ .short Ltmp19-Ltmp18 # Record length
+Ltmp18:
+ .short 4423 # Record kind: S_GPROC32_ID
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 0 # PtrNext
+ .long Lfunc_end0-"?bar@@YA_J_J at Z" # Code size
+ .long 0 # Offset after prologue
+ .long 0 # Offset before epilogue
+ .long 4099 # Function type index
+ .secrel32 "?bar@@YA_J_J at Z" # Function section relative address
+ .secidx "?bar@@YA_J_J at Z" # Function section index
+ .byte 0 # Flags
+ .asciz "bar" # Function name
+ .p2align 2
+Ltmp19:
+ .short Ltmp21-Ltmp20 # Record length
+Ltmp20:
+ .short 4114 # Record kind: S_FRAMEPROC
+ .long 12 # FrameSize
+ .long 0 # Padding
+ .long 0 # Offset of padding
+ .long 0 # Bytes of callee saved registers
+ .long 0 # Exception handler offset
+ .short 0 # Exception handler section
+ .long 147456 # Flags (defines frame register)
+ .p2align 2
+Ltmp21:
+ .short Ltmp23-Ltmp22 # Record length
+Ltmp22:
+ .short 4414 # Record kind: S_LOCAL
+ .long 19 # TypeIndex
+ .short 1 # Flags
+ .asciz "x"
+ .p2align 2
+Ltmp23:
+ .cv_def_range Ltmp0 Ltmp1, reg_rel, 30006, 0, -8
+ .short 2 # Record length
+ .short 4431 # Record kind: S_PROC_ID_END
+Ltmp17:
+ .p2align 2
+ .cv_linetable 0, "?bar@@YA_J_J at Z", Lfunc_end0
+ .section .debug$S,"dr",associative,"?foo@@YA_J_J at Z"
+ .p2align 2
+ .long 4 # Debug section magic
+ .cv_fpo_data "?foo@@YA_J_J at Z"
+ .long 241 # Symbol subsection for foo
+ .long Ltmp25-Ltmp24 # Subsection size
+Ltmp24:
+ .short Ltmp27-Ltmp26 # Record length
+Ltmp26:
+ .short 4423 # Record kind: S_GPROC32_ID
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 0 # PtrNext
+ .long Lfunc_end1-"?foo@@YA_J_J at Z" # Code size
+ .long 0 # Offset after prologue
+ .long 0 # Offset before epilogue
+ .long 4098 # Function type index
+ .secrel32 "?foo@@YA_J_J at Z" # Function section relative address
+ .secidx "?foo@@YA_J_J at Z" # Function section index
+ .byte 0 # Flags
+ .asciz "foo" # Function name
+ .p2align 2
+Ltmp27:
+ .short Ltmp29-Ltmp28 # Record length
+Ltmp28:
+ .short 4114 # Record kind: S_FRAMEPROC
+ .long 0 # FrameSize
+ .long 0 # Padding
+ .long 0 # Offset of padding
+ .long 0 # Bytes of callee saved registers
+ .long 0 # Exception handler offset
+ .short 0 # Exception handler section
+ .long 0 # Flags (defines frame register)
+ .p2align 2
+Ltmp29:
+ .short Ltmp31-Ltmp30 # Record length
+Ltmp30:
+ .short 4414 # Record kind: S_LOCAL
+ .long 19 # TypeIndex
+ .short 1 # Flags
+ .asciz "x"
+ .p2align 2
+Ltmp31:
+ .cv_def_range Lfunc_begin1 Lfunc_end1, reg_rel, 30006, 0, 4
+ .short 2 # Record length
+ .short 4431 # Record kind: S_PROC_ID_END
+Ltmp25:
+ .p2align 2
+ .cv_linetable 1, "?foo@@YA_J_J at Z", Lfunc_end1
+ .section .debug$S,"dr",associative,_main
+ .p2align 2
+ .long 4 # Debug section magic
+ .cv_fpo_data _main
+ .long 241 # Symbol subsection for main
+ .long Ltmp33-Ltmp32 # Subsection size
+Ltmp32:
+ .short Ltmp35-Ltmp34 # Record length
+Ltmp34:
+ .short 4423 # Record kind: S_GPROC32_ID
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 0 # PtrNext
+ .long Lfunc_end2-_main # Code size
+ .long 0 # Offset after prologue
+ .long 0 # Offset before epilogue
+ .long 4103 # Function type index
+ .secrel32 _main # Function section relative address
+ .secidx _main # Function section index
+ .byte 0 # Flags
+ .asciz "main" # Function name
+ .p2align 2
+Ltmp35:
+ .short Ltmp37-Ltmp36 # Record length
+Ltmp36:
+ .short 4114 # Record kind: S_FRAMEPROC
+ .long 0 # FrameSize
+ .long 0 # Padding
+ .long 0 # Offset of padding
+ .long 0 # Bytes of callee saved registers
+ .long 0 # Exception handler offset
+ .short 0 # Exception handler section
+ .long 0 # Flags (defines frame register)
+ .p2align 2
+Ltmp37:
+ .short Ltmp39-Ltmp38 # Record length
+Ltmp38:
+ .short 4414 # Record kind: S_LOCAL
+ .long 116 # TypeIndex
+ .short 1 # Flags
+ .asciz "argc"
+ .p2align 2
+Ltmp39:
+ .cv_def_range Lfunc_begin2 Ltmp4, reg_rel, 30006, 0, 4
+ .short Ltmp41-Ltmp40 # Record length
+Ltmp40:
+ .short 4414 # Record kind: S_LOCAL
+ .long 4100 # TypeIndex
+ .short 1 # Flags
+ .asciz "argv"
+ .p2align 2
+Ltmp41:
+ .cv_def_range Lfunc_begin2 Ltmp4, reg_rel, 30006, 0, 8
+ .short Ltmp43-Ltmp42 # Record length
+Ltmp42:
+ .short 4429 # Record kind: S_INLINESITE
+ .long 0 # PtrParent
+ .long 0 # PtrEnd
+ .long 4098 # Inlinee type index
+ .cv_inline_linetable 3 1 2 Lfunc_begin2 Lfunc_end2
+ .p2align 2
+Ltmp43:
+ .short Ltmp45-Ltmp44 # Record length
+Ltmp44:
+ .short 4414 # Record kind: S_LOCAL
+ .long 19 # TypeIndex
+ .short 1 # Flags
+ .asciz "x"
+ .p2align 2
+Ltmp45:
+ .cv_def_range Ltmp3 Ltmp5, subfield_reg, 17, 0
+ .cv_def_range Ltmp3 Ltmp5, subfield_reg, 18, 4
+ .short 2 # Record length
+ .short 4430 # Record kind: S_INLINESITE_END
+ .short 2 # Record length
+ .short 4431 # Record kind: S_PROC_ID_END
+Ltmp33:
+ .p2align 2
+ .cv_linetable 2, _main, Lfunc_end2
+ .section .debug$S,"dr"
+ .cv_filechecksums # File index to string table offset subsection
+ .cv_stringtable # String table
+ .long 241
+ .long Ltmp47-Ltmp46 # Subsection size
+Ltmp46:
+ .short Ltmp49-Ltmp48 # Record length
+Ltmp48:
+ .short 4428 # Record kind: S_BUILDINFO
+ .long 4109 # LF_BUILDINFO index
+ .p2align 2
+Ltmp49:
+Ltmp47:
+ .p2align 2
+ .section .debug$T,"dr"
+ .p2align 2
+ .long 4 # Debug section magic
+ # ArgList (0x1000)
+ .short 0xa # Record length
+ .short 0x1201 # Record kind: LF_ARGLIST
+ .long 0x1 # NumArgs
+ .long 0x13 # Argument: __int64
+ # Procedure (0x1001)
+ .short 0xe # Record length
+ .short 0x1008 # Record kind: LF_PROCEDURE
+ .long 0x13 # ReturnType: __int64
+ .byte 0x0 # CallingConvention: NearC
+ .byte 0x0 # FunctionOptions
+ .short 0x1 # NumParameters
+ .long 0x1000 # ArgListType: (__int64)
+ # FuncId (0x1002)
+ .short 0xe # Record length
+ .short 0x1601 # Record kind: LF_FUNC_ID
+ .long 0x0 # ParentScope
+ .long 0x1001 # FunctionType: __int64 (__int64)
+ .asciz "foo" # Name
+ # FuncId (0x1003)
+ .short 0xe # Record length
+ .short 0x1601 # Record kind: LF_FUNC_ID
+ .long 0x0 # ParentScope
+ .long 0x1001 # FunctionType: __int64 (__int64)
+ .asciz "bar" # Name
+ # Pointer (0x1004)
+ .short 0xa # Record length
+ .short 0x1002 # Record kind: LF_POINTER
+ .long 0x470 # PointeeType: char*
+ .long 0x800a # Attrs: [ Type: Near32, Mode: Pointer, SizeOf: 4 ]
+ # ArgList (0x1005)
+ .short 0xe # Record length
+ .short 0x1201 # Record kind: LF_ARGLIST
+ .long 0x2 # NumArgs
+ .long 0x74 # Argument: int
+ .long 0x1004 # Argument: char**
+ # Procedure (0x1006)
+ .short 0xe # Record length
+ .short 0x1008 # Record kind: LF_PROCEDURE
+ .long 0x74 # ReturnType: int
+ .byte 0x0 # CallingConvention: NearC
+ .byte 0x0 # FunctionOptions
+ .short 0x2 # NumParameters
+ .long 0x1005 # ArgListType: (int, char**)
+ # FuncId (0x1007)
+ .short 0x12 # Record length
+ .short 0x1601 # Record kind: LF_FUNC_ID
+ .long 0x0 # ParentScope
+ .long 0x1006 # FunctionType: int (int, char**)
+ .asciz "main" # Name
+ .byte 243
+ .byte 242
+ .byte 241
+ # StringId (0x1008)
+ .short 0xe # Record length
+ .short 0x1605 # Record kind: LF_STRING_ID
+ .long 0x0 # Id
+ .asciz "C:\\src" # StringData
+ .byte 241
+ # StringId (0x1009)
+ .short 0xe # Record length
+ .short 0x1605 # Record kind: LF_STRING_ID
+ .long 0x0 # Id
+ .asciz "a.cpp" # StringData
+ .byte 242
+ .byte 241
More information about the lldb-commits
mailing list