[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