[llvm-branch-commits] [lldb] 78d41a1 - lldb: Add support for printing variables with DW_AT_ranges on DW_TAG_subprograms

David Blaikie via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Sun Jan 24 18:43:45 PST 2021


Author: David Blaikie
Date: 2021-01-24T18:39:06-08:00
New Revision: 78d41a1295d9d40c37758230d0218c61eaffad88

URL: https://github.com/llvm/llvm-project/commit/78d41a1295d9d40c37758230d0218c61eaffad88
DIFF: https://github.com/llvm/llvm-project/commit/78d41a1295d9d40c37758230d0218c61eaffad88.diff

LOG: lldb: Add support for printing variables with DW_AT_ranges on DW_TAG_subprograms

Finishing out the support (to the best of my knowledge/based on current
testing running the whole check-lldb with a clang forcibly using
DW_AT_ranges on all DW_TAG_subprograms) for this feature.

Differential Revision: https://reviews.llvm.org/D94064

Added: 
    

Modified: 
    lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
    lldb/test/Shell/SymbolFile/DWARF/Inputs/subprogram_ranges.s
    lldb/test/Shell/SymbolFile/DWARF/subprogram_ranges.test

Removed: 
    


################################################################################
diff  --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index afad21af240c..3656c7333f27 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -35,6 +35,7 @@
 #include "lldb/Interpreter/OptionValueProperties.h"
 
 #include "Plugins/ExpressionParser/Clang/ClangUtil.h"
+#include "Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h"
 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
 #include "lldb/Symbol/Block.h"
 #include "lldb/Symbol/CompileUnit.h"
@@ -3040,8 +3041,12 @@ size_t SymbolFileDWARF::ParseVariablesForContext(const SymbolContext &sc) {
     if (sc.function) {
       DWARFDIE function_die = GetDIE(sc.function->GetID());
 
-      const dw_addr_t func_lo_pc = function_die.GetAttributeValueAsAddress(
-          DW_AT_low_pc, LLDB_INVALID_ADDRESS);
+      dw_addr_t func_lo_pc = LLDB_INVALID_ADDRESS;
+      DWARFRangeList ranges;
+      if (function_die.GetDIE()->GetAttributeAddressRanges(
+              function_die.GetCU(), ranges,
+              /*check_hi_lo_pc=*/true))
+        func_lo_pc = ranges.GetMinRangeBase(0);
       if (func_lo_pc != LLDB_INVALID_ADDRESS) {
         const size_t num_variables = ParseVariables(
             sc, function_die.GetFirstChild(), func_lo_pc, true, true);

diff  --git a/lldb/test/Shell/SymbolFile/DWARF/Inputs/subprogram_ranges.s b/lldb/test/Shell/SymbolFile/DWARF/Inputs/subprogram_ranges.s
index 1ff883c67f9e..4dd398d86549 100644
--- a/lldb/test/Shell/SymbolFile/DWARF/Inputs/subprogram_ranges.s
+++ b/lldb/test/Shell/SymbolFile/DWARF/Inputs/subprogram_ranges.s
@@ -1,32 +1,53 @@
 	.text
-	.file	"main.c"
+	.file	"subprogram_ranges.c"
 	.globl	main                            # -- Begin function main
 	.p2align	4, 0x90
 	.type	main, at function
 main:                                   # @main
 .Lfunc_begin0:
-	.file	1 "/usr/local/google/home/blaikie/dev/scratch" "main.c"
-	.loc	1 1 0                           # main.c:1:0
+	.file	1 "/usr/local/google/home/blaikie/dev/scratch" "subprogram_ranges.c"
+	.loc	1 2 0                           # subprogram_ranges.c:2:0
 	.cfi_startproc
 # %bb.0:                                # %entry
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	xorl	%eax, %eax
+	#DEBUG_VALUE: main:var <- 3
+	.loc	1 4 5 prologue_end              # subprogram_ranges.c:4:5
+	movl	$1, i(%rip)
 .Ltmp0:
-	.loc	1 2 7 prologue_end              # main.c:2:7
-	movl	$3, -4(%rbp)
-	.loc	1 3 1                           # main.c:3:1
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
+	#DEBUG_VALUE: main:var <- 5
+	.loc	1 6 5                           # subprogram_ranges.c:6:5
+	movl	$2, i(%rip)
+	.loc	1 7 1                           # subprogram_ranges.c:7:1
+	xorl	%eax, %eax
 	retq
 .Ltmp1:
 .Lfunc_end0:
 	.size	main, .Lfunc_end0-main
 	.cfi_endproc
                                         # -- End function
+	.type	i, at object                       # @i
+	.bss
+	.globl	i
+	.p2align	2
+i:
+	.long	0                               # 0x0
+	.size	i, 4
+
+	.section	.debug_loc,"", at progbits
+.Ldebug_loc0:
+	.quad	.Lfunc_begin0-.Lfunc_begin0
+	.quad	.Ltmp0-.Lfunc_begin0
+	.short	3                               # Loc expr size
+	.byte	17                              # DW_OP_consts
+	.byte	3                               # 3
+	.byte	159                             # DW_OP_stack_value
+	.quad	.Ltmp0-.Lfunc_begin0
+	.quad	.Lfunc_end0-.Lfunc_begin0
+	.short	3                               # Loc expr size
+	.byte	17                              # DW_OP_consts
+	.byte	5                               # 5
+	.byte	159                             # DW_OP_stack_value
+	.quad	0
+	.quad	0
 	.section	.debug_abbrev,"", at progbits
 	.byte	1                               # Abbreviation Code
 	.byte	17                              # DW_TAG_compile_unit
@@ -54,6 +75,8 @@ main:                                   # @main
 	.byte	23                              # DW_FORM_sec_offset
 	.byte	64                              # DW_AT_frame_base
 	.byte	24                              # DW_FORM_exprloc
+	.ascii	"\227B"                         # DW_AT_GNU_all_call_sites
+	.byte	25                              # DW_FORM_flag_present
 	.byte	3                               # DW_AT_name
 	.byte	14                              # DW_FORM_strp
 	.byte	58                              # DW_AT_decl_file
@@ -70,7 +93,7 @@ main:                                   # @main
 	.byte	52                              # DW_TAG_variable
 	.byte	0                               # DW_CHILDREN_no
 	.byte	2                               # DW_AT_location
-	.byte	24                              # DW_FORM_exprloc
+	.byte	23                              # DW_FORM_sec_offset
 	.byte	3                               # DW_AT_name
 	.byte	14                              # DW_FORM_strp
 	.byte	58                              # DW_AT_decl_file
@@ -100,7 +123,7 @@ main:                                   # @main
 	.short	4                               # DWARF version number
 	.long	.debug_abbrev                   # Offset Into Abbrev. Section
 	.byte	8                               # Address Size (in bytes)
-	.byte	1                               # Abbrev [1] 0xb:0x47 DW_TAG_compile_unit
+	.byte	1                               # Abbrev [1] 0xb:0x48 DW_TAG_compile_unit
 	.long	.Linfo_string0                  # DW_AT_producer
 	.short	12                              # DW_AT_language
 	.long	.Linfo_string1                  # DW_AT_name
@@ -108,25 +131,24 @@ main:                                   # @main
 	.long	.Linfo_string2                  # DW_AT_comp_dir
 	.quad	.Lfunc_begin0                   # DW_AT_low_pc
 	.long	.Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
-	.byte	2                               # Abbrev [2] 0x2a:0x20 DW_TAG_subprogram
+	.byte	2                               # Abbrev [2] 0x2a:0x21 DW_TAG_subprogram
 	.long	.Ldebug_ranges0                 # DW_AT_ranges
 	.byte	1                               # DW_AT_frame_base
-	.byte	86
+	.byte	87
+                                        # DW_AT_GNU_all_call_sites
 	.long	.Linfo_string3                  # DW_AT_name
 	.byte	1                               # DW_AT_decl_file
-	.byte	1                               # DW_AT_decl_line
-	.long	74                              # DW_AT_type
+	.byte	2                               # DW_AT_decl_line
+	.long	75                              # DW_AT_type
                                         # DW_AT_external
-	.byte	3                               # Abbrev [3] 0x3b:0xe DW_TAG_variable
-	.byte	2                               # DW_AT_location
-	.byte	145
-	.byte	124
+	.byte	3                               # Abbrev [3] 0x3b:0xf DW_TAG_variable
+	.long	.Ldebug_loc0                    # DW_AT_location
 	.long	.Linfo_string5                  # DW_AT_name
 	.byte	1                               # DW_AT_decl_file
-	.byte	2                               # DW_AT_decl_line
-	.long	74                              # DW_AT_type
+	.byte	3                               # DW_AT_decl_line
+	.long	75                              # DW_AT_type
 	.byte	0                               # End Of Children Mark
-	.byte	4                               # Abbrev [4] 0x4a:0x7 DW_TAG_base_type
+	.byte	4                               # Abbrev [4] 0x4b:0x7 DW_TAG_base_type
 	.long	.Linfo_string4                  # DW_AT_name
 	.byte	5                               # DW_AT_encoding
 	.byte	4                               # DW_AT_byte_size
@@ -140,20 +162,20 @@ main:                                   # @main
 	.quad	0
 	.section	.debug_str,"MS", at progbits,1
 .Linfo_string0:
-	.asciz	"clang version 12.0.0 (git at github.com:llvm/llvm-project.git 1c15aa171b2f67d9198a8498945cbdb936c0cd3b)" # string offset=0
+	.asciz	"clang version 12.0.0 (git at github.com:llvm/llvm-project.git 439e8f6c05584c36ea3f79d9b83a78098d40e629)" # string offset=0
 .Linfo_string1:
-	.asciz	"main.c"                        # string offset=101
+	.asciz	"subprogram_ranges.c"           # string offset=101
 .Linfo_string2:
-	.asciz	"/usr/local/google/home/blaikie/dev/scratch" # string offset=108
+	.asciz	"/usr/local/google/home/blaikie/dev/scratch" # string offset=121
 .Linfo_string3:
-	.asciz	"main"                          # string offset=151
+	.asciz	"main"                          # string offset=164
 .Linfo_string4:
-	.asciz	"int"                           # string offset=156
+	.asciz	"int"                           # string offset=169
 .Linfo_string5:
-	.asciz	"var"                           # string offset=160
-	.ident	"clang version 12.0.0 (git at github.com:llvm/llvm-project.git 1c15aa171b2f67d9198a8498945cbdb936c0cd3b)"
+	.asciz	"var"                           # string offset=173
+	.ident	"clang version 12.0.0 (git at github.com:llvm/llvm-project.git 439e8f6c05584c36ea3f79d9b83a78098d40e629)"
 	.section	".note.GNU-stack","", at progbits
 	.addrsig
+	.addrsig_sym i
 	.section	.debug_line,"", at progbits
 .Lline_table_start0:
-

diff  --git a/lldb/test/Shell/SymbolFile/DWARF/subprogram_ranges.test b/lldb/test/Shell/SymbolFile/DWARF/subprogram_ranges.test
index 740cd35b0f3b..858dfd7a51d6 100644
--- a/lldb/test/Shell/SymbolFile/DWARF/subprogram_ranges.test
+++ b/lldb/test/Shell/SymbolFile/DWARF/subprogram_ranges.test
@@ -14,6 +14,26 @@
 # especially useful, but don't dismiss it as pointless just because it's a bit
 # weird.
 
+# * Using volatile writes to create instructions the location may be valid over
+# * Using two values for the variable so it is described by a location list,
+#   not a single location description
+# * Not using function calls, so that the function has no frame pointer
+#   initialization/no prologue instructions, so the location of "var" is valid
+#   at the start of the function, so 'image lookup -v -s main' will include it.
+#
+# Source:
+# __attribute__((nodebug)) volatile int i;
+# int main() {
+#   int var = 3;
+#   i = 1;
+#   var = 5;
+#   i = 2;
+# }
+
 b main
 # CHECK: (lldb) b main
-# CHECK-NEXT: Breakpoint 1: where = {{.*}}`main + 6 at main.c:2:7
+# CHECK-NEXT: Breakpoint 1: where = {{.*}}`main at subprogram_ranges.c:4:5
+
+image lookup -v -s main
+# CHECK: 1 symbols match 'main'
+# CHECK:  Variable: {{.*}}, name = "var", type = "int", {{.*}}, decl = subprogram_ranges.c:3


        


More information about the llvm-branch-commits mailing list