jankratochvil created this revision.
jankratochvil added reviewers: grimar, labath.
jankratochvil added a project: LLVM.
jankratochvil requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added a subscriber: sstefan1.
Herald added a project: LLDB.

LLDB has been failing on binaries produced by new GCC 11.0 with -gdwarf-5.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D97721

Files:
  lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
  lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
  lldb/test/Shell/SymbolFile/DWARF/dwarf5-line-strp.s

Index: lldb/test/Shell/SymbolFile/DWARF/dwarf5-line-strp.s
===================================================================
--- /dev/null
+++ lldb/test/Shell/SymbolFile/DWARF/dwarf5-line-strp.s
@@ -0,0 +1,207 @@
+# Test handling of DWARF5 DW_FORM_line_strp from .debug_info as used by GCC.
+
+# REQUIRES: x86
+
+# RUN: llvm-mc -filetype=obj -o %t -triple x86_64-pc-linux %s
+# RUN: %lldb %t -o "p main" \
+# RUN:   -o exit | FileCheck %s
+
+# CHECK: (int (*)()) $0 = 0x0000000000000000
+
+	.text
+.Ltext0:
+	.globl	main
+	.type	main, @function
+main:
+.LFB0:
+.LM1:
+        .long	0
+.LM2:
+        .long	0
+.LFE0:
+	.size	main, .-main
+.Letext0:
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.long	0x50	# Length of Compilation Unit Info
+	.value	0x5	# DWARF version number
+	.byte	0x1	# DW_UT_compile
+	.byte	0x8	# Pointer Size (in bytes)
+	.long	.Ldebug_abbrev0	# Offset Into Abbrev. Section
+	.uleb128 0x1	# (DIE (0xc) DW_TAG_compile_unit)
+	.long	.LASF2	# DW_AT_producer: "GNU C17 11.0.0 20210210 (Red Hat 11.0.0-0) -mtune=generic -march=x86-64 -gdwarf-5 -gno-as-loc-support"
+	.byte	0x1d	# DW_AT_language
+	.long	.LASF0	# DW_AT_name: "main.c"
+	.long	.LASF1	# DW_AT_comp_dir: ""
+	.quad	.Ltext0	# DW_AT_low_pc
+	.quad	.Letext0-.Ltext0	# DW_AT_high_pc
+	.long	.Ldebug_line0	# DW_AT_stmt_list
+	.uleb128 0x2	# (DIE (0x2e) DW_TAG_subprogram)
+			# DW_AT_external
+	.long	.LASF3	# DW_AT_name: "main"
+	.byte	0x1	# DW_AT_decl_file (main.c)
+	.byte	0x1	# DW_AT_decl_line
+	.byte	0x5	# DW_AT_decl_column
+	.long	0x4c	# DW_AT_type
+	.quad	.LFB0	# DW_AT_low_pc
+	.quad	.LFE0-.LFB0	# DW_AT_high_pc
+	.uleb128 0x1	# DW_AT_frame_base
+	.byte	0x9c	# DW_OP_call_frame_cfa
+			# DW_AT_call_all_calls
+	.uleb128 0x3	# (DIE (0x4c) DW_TAG_base_type)
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0x5	# DW_AT_encoding
+	.ascii "int\0"	# DW_AT_name
+	.byte	0	# end of children of DIE 0xc
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1	# (abbrev code)
+	.uleb128 0x11	# (TAG: DW_TAG_compile_unit)
+	.byte	0x1	# DW_children_yes
+	.uleb128 0x25	# (DW_AT_producer)
+	.uleb128 0xe	# (DW_FORM_strp)
+	.uleb128 0x13	# (DW_AT_language)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x1f	# (DW_FORM_line_strp)
+	.uleb128 0x1b	# (DW_AT_comp_dir)
+	.uleb128 0x1f	# (DW_FORM_line_strp)
+	.uleb128 0x11	# (DW_AT_low_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x12	# (DW_AT_high_pc)
+	.uleb128 0x7	# (DW_FORM_data8)
+	.uleb128 0x10	# (DW_AT_stmt_list)
+	.uleb128 0x17	# (DW_FORM_sec_offset)
+	.byte	0
+	.byte	0
+	.uleb128 0x2	# (abbrev code)
+	.uleb128 0x2e	# (TAG: DW_TAG_subprogram)
+	.byte	0	# DW_children_no
+	.uleb128 0x3f	# (DW_AT_external)
+	.uleb128 0x19	# (DW_FORM_flag_present)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0xe	# (DW_FORM_strp)
+	.uleb128 0x3a	# (DW_AT_decl_file)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3b	# (DW_AT_decl_line)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x39	# (DW_AT_decl_column)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x49	# (DW_AT_type)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.uleb128 0x11	# (DW_AT_low_pc)
+	.uleb128 0x1	# (DW_FORM_addr)
+	.uleb128 0x12	# (DW_AT_high_pc)
+	.uleb128 0x7	# (DW_FORM_data8)
+	.uleb128 0x40	# (DW_AT_frame_base)
+	.uleb128 0x18	# (DW_FORM_exprloc)
+	.uleb128 0x7a	# (DW_AT_call_all_calls)
+	.uleb128 0x19	# (DW_FORM_flag_present)
+	.byte	0
+	.byte	0
+	.uleb128 0x3	# (abbrev code)
+	.uleb128 0x24	# (TAG: DW_TAG_base_type)
+	.byte	0	# DW_children_no
+	.uleb128 0xb	# (DW_AT_byte_size)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3e	# (DW_AT_encoding)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0x8	# (DW_FORM_string)
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_aranges,"",@progbits
+	.long	0x2c	# Length of Address Ranges Info
+	.value	0x2	# DWARF aranges version
+	.long	.Ldebug_info0	# Offset of Compilation Unit Info
+	.byte	0x8	# Size of Address
+	.byte	0	# Size of Segment Descriptor
+	.value	0	# Pad to 16 byte boundary
+	.value	0
+	.quad	.Ltext0	# Address
+	.quad	.Letext0-.Ltext0	# Length
+	.quad	0
+	.quad	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.long	.LELT0-.LSLT0	# Length of Source Line Info
+.LSLT0:
+	.value	0x5	# DWARF version number
+	.byte	0x8	# Address Size
+	.byte	0	# Segment Size
+	.long	.LELTP0-.LASLTP0	# Prolog Length
+.LASLTP0:
+	.byte	0x1	# Minimum Instruction Length
+	.byte	0x1	# Maximum Operations Per Instruction
+	.byte	0x1	# Default is_stmt_start flag
+	.byte	0xf6	# Line Base Value (Special Opcodes)
+	.byte	0xf2	# Line Range Value (Special Opcodes)
+	.byte	0xd	# Special Opcode Base
+	.byte	0	# opcode: 0x1 has 0 args
+	.byte	0x1	# opcode: 0x2 has 1 args
+	.byte	0x1	# opcode: 0x3 has 1 args
+	.byte	0x1	# opcode: 0x4 has 1 args
+	.byte	0x1	# opcode: 0x5 has 1 args
+	.byte	0	# opcode: 0x6 has 0 args
+	.byte	0	# opcode: 0x7 has 0 args
+	.byte	0	# opcode: 0x8 has 0 args
+	.byte	0x1	# opcode: 0x9 has 1 args
+	.byte	0	# opcode: 0xa has 0 args
+	.byte	0	# opcode: 0xb has 0 args
+	.byte	0x1	# opcode: 0xc has 1 args
+	.byte	0x1	# Directory entry format count
+	.uleb128 0x1	# DW_LNCT_path
+	.uleb128 0x1f	# DW_FORM_line_strp
+	.uleb128 0x2	# Directories count
+	.long	.LASF1	# Directory Entry: 0: ""
+	.long	.LASF4	# Directory Entry: 0: ""
+	.byte	0x2	# File name entry format count
+	.uleb128 0x1	# DW_LNCT_path
+	.uleb128 0x1f	# DW_FORM_line_strp
+	.uleb128 0x2	# DW_LNCT_directory_index
+	.uleb128 0xb	# DW_FORM_data1
+	.uleb128 0x2	# File names count
+	.long	.LASF0	# File Entry: 0: "main.c"
+	.byte	0
+	.long	.LASF5	# File Entry: 0: "main.c"
+	.byte	0x1
+.LELTP0:
+	.byte	0	# set address *.LM1
+	.uleb128 0x9
+	.byte	0x2
+	.quad	.LM1
+	.byte	0x1	# copy line 1
+	.byte	0x5	# column 12
+	.uleb128 0xc	# 12
+	.byte	0	# set address *.LM2
+	.uleb128 0x9
+	.byte	0x2
+	.quad	.LM2
+	.byte	0x1	# copy line 1
+	.byte	0x5	# column 13
+	.uleb128 0xd	# 13
+	.byte	0	# set address *.Letext0
+	.uleb128 0x9
+	.byte	0x2
+	.quad	.Letext0
+	.byte	0	# end sequence
+	.uleb128 0x1
+	.byte	0x1
+.LELT0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF2:
+	.string	"GNU C17 11.0.0 20210210 (Red Hat 11.0.0-0) -mtune=generic -march=x86-64 -gdwarf-5 -gno-as-loc-support"
+.LASF3:
+	.string	"main"
+	.section	.debug_line_str,"MS",@progbits,1
+.LASF1:
+	.string	""
+.LASF4:
+	.string	""
+.LASF0:
+	.string	"main.c"
+.LASF5:
+	.string	"main.c"
+	.ident	"GCC: (GNU) 11.0.0 20210210 (Red Hat 11.0.0-0)"
+	.section	.note.GNU-stack,"",@progbits
Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/DWARFFormValue.cpp
@@ -177,12 +177,12 @@
   {1,4}, // 0x17 DW_FORM_sec_offset
   {0,0}, // 0x18 DW_FORM_exprloc
   {1,0}, // 0x19 DW_FORM_flag_present
-  {0,0}, // 0x1a
-  {0,0}, // 0x1b
-  {0,0}, // 0x1c
-  {0,0}, // 0x1d
-  {0,0}, // 0x1e
-  {0,0}, // 0x1f
+  {0,0}, // 0x1a DW_FORM_strx (ULEB128)
+  {0,0}, // 0x1b DW_FORM_addrx (ULEB128)
+  {1,4}, // 0x1c DW_FORM_ref_sup4
+  {0,0}, // 0x1d DW_FORM_strp_sup (4 bytes for DWARF32, 8 bytes for DWARF64)
+  {1,16}, // 0x1e DW_FORM_data16
+  {1,4}, // 0x1f DW_FORM_line_strp
   {1,8}, // 0x20 DW_FORM_ref_sig8
 };
 
@@ -286,6 +286,7 @@
     // 32 bit for DWARF 32, 64 for DWARF 64
     case DW_FORM_sec_offset:
     case DW_FORM_strp:
+    case DW_FORM_line_strp:
       *offset_ptr += 4;
       return true;
 
@@ -398,7 +399,8 @@
   case DW_FORM_udata:
     s.PutULEB128(uvalue);
     break;
-  case DW_FORM_strp: {
+  case DW_FORM_strp:
+  case DW_FORM_line_strp: {
     const char *dbg_str = AsCString();
     if (dbg_str) {
       s.QuotedCString(dbg_str);
@@ -606,6 +608,7 @@
     case DW_FORM_flag:
     case DW_FORM_sdata:
     case DW_FORM_strp:
+    case DW_FORM_line_strp:
     case DW_FORM_strx:
     case DW_FORM_strx1:
     case DW_FORM_strx2:
Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
@@ -173,6 +173,7 @@
             break;
 
           case DW_FORM_strp:
+          case DW_FORM_line_strp:
           case DW_FORM_sec_offset:
             data.GetU32(&offset);
             break;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to