https://github.com/labath updated 
https://github.com/llvm/llvm-project/pull/132395

>From 3326940bbae82afa6b19e1ee696447a39ea3723b Mon Sep 17 00:00:00 2001
From: Pavel Labath <pa...@labath.sk>
Date: Fri, 21 Mar 2025 14:04:12 +0100
Subject: [PATCH 1/2] [lldb/DWARF] Remove "range lower than function low_pc"
 check

The check is not correct for discontinuous functions, as one of the
blocks could very well begin before the function entry point. To catch
dead-stripped ranges, I check whether the functions is after the first
known code address. I don't print any error in this case as that is a
common/expected situation.

If the block ranges is not a subrange of the enclosing block then this
will range will currently be added to the outer block as well (i.e., we
get the same behavior that's currently possible for non-subrange blocks
larger than function_low_pc). However, this code path is buggy and I'd
like to change that (#117725).
---
 .../SymbolFile/DWARF/SymbolFileDWARF.cpp      |  12 +-
 .../DWARF/range-lower-then-low-pc.s           | 317 ------------------
 .../DWARF/x86/discontinuous-inline-function.s |  38 +--
 3 files changed, 20 insertions(+), 347 deletions(-)
 delete mode 100644 lldb/test/Shell/SymbolFile/DWARF/range-lower-then-low-pc.s

diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp 
b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index d1aaf0bd36de4..58d8969c54e27 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1346,19 +1346,9 @@ size_t SymbolFileDWARF::ParseBlocksRecursive(CompileUnit 
&comp_unit,
                                  decl_line, decl_column, call_file, call_line,
                                  call_column, nullptr)) {
       for (const llvm::DWARFAddressRange &range : ranges) {
-        if (!range.valid())
-          continue;
-        if (range.LowPC >= subprogram_low_pc)
+        if (range.valid() && range.LowPC >= m_first_code_address)
           block->AddRange(Block::Range(range.LowPC - subprogram_low_pc,
                                        range.HighPC - range.LowPC));
-        else {
-          GetObjectFile()->GetModule()->ReportError(
-              "{0:x8}: adding range [{1:x16}-{2:x16}) which has a base "
-              "that is less than the function's low PC {3:x16}. Please file "
-              "a bug and attach the file at the "
-              "start of this error message",
-              block->GetID(), range.LowPC, range.HighPC, subprogram_low_pc);
-        }
       }
       block->FinalizeRanges();
 
diff --git a/lldb/test/Shell/SymbolFile/DWARF/range-lower-then-low-pc.s 
b/lldb/test/Shell/SymbolFile/DWARF/range-lower-then-low-pc.s
deleted file mode 100644
index e3cc84db12652..0000000000000
--- a/lldb/test/Shell/SymbolFile/DWARF/range-lower-then-low-pc.s
+++ /dev/null
@@ -1,317 +0,0 @@
-# REQUIRES: x86
-
-# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj %s > %t
-# RUN: lldb-test symbols %t &> %t.txt
-# RUN: cat %t.txt | FileCheck %s
-
-# Tests that error is printed correctly when DW_AT_low_pc value is
-# greater then a range entry.
-
-# CHECK: 0x0000006e: adding range [0x0000000000000000-0x000000000000001f)
-# CHECK-SAME: which has a base that is less than the function's low PC 
0x0000000000000021.
-# CHECK-SAME: Please file a bug and attach the file at the start of this error 
message
-
-
-
-# Test was manually modified to change DW_TAG_lexical_block
-# to use DW_AT_ranges, and value lower then DW_AT_low_pc value
-# in DW_TAG_subprogram
-# static int foo(bool b) {
-#   if (b) {
-#    int food = 1;
-#     return food;
-#   }
-#   return 0;
-# }
-# int main() {
-#   return foo(true);
-# }
-       .text
-       .file   "main.cpp"
-       .section        .text.main,"ax",@progbits
-       .globl  main                            # -- Begin function main
-       .p2align        4, 0x90
-       .type   main,@function
-main:                                   # @main
-.Lfunc_begin0:
-       .file   1 "base-lower-then-range-entry" "main.cpp"
-       .loc    1 8 0                           # main.cpp:8: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
-       subq    $16, %rsp
-       movl    $0, -4(%rbp)
-.Ltmp0:
-       .loc    1 9 10 prologue_end             # main.cpp:9:10
-       movl    $1, %edi
-       callq   _ZL3foob
-       .loc    1 9 3 epilogue_begin is_stmt 0  # main.cpp:9:3
-       addq    $16, %rsp
-       popq    %rbp
-       .cfi_def_cfa %rsp, 8
-       retq
-.Ltmp1:
-.Lfunc_end0:
-       .size   main, .Lfunc_end0-main
-       .cfi_endproc
-                                        # -- End function
-       .section        .text._ZL3foob,"ax",@progbits
-       .p2align        4, 0x90                         # -- Begin function 
_ZL3foob
-       .type   _ZL3foob,@function
-_ZL3foob:                               # @_ZL3foob
-.Lfunc_begin1:
-       .loc    1 1 0 is_stmt 1                 # main.cpp:1: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
-       movb    %dil, %al
-       andb    $1, %al
-       movb    %al, -5(%rbp)
-.Ltmp2:
-       .loc    1 2 7 prologue_end              # main.cpp:2:7
-       testb   $1, -5(%rbp)
-       je      .LBB1_2
-# %bb.1:                                # %if.then
-.Ltmp3:
-       .loc    1 3 8                           # main.cpp:3:8
-       movl    $1, -12(%rbp)
-       .loc    1 4 12                          # main.cpp:4:12
-       movl    -12(%rbp), %eax
-       .loc    1 4 5 is_stmt 0                 # main.cpp:4:5
-       movl    %eax, -4(%rbp)
-       jmp     .LBB1_3
-.Ltmp4:
-.LBB1_2:                                # %if.end
-       .loc    1 6 3 is_stmt 1                 # main.cpp:6:3
-       movl    $0, -4(%rbp)
-.LBB1_3:                                # %return
-       .loc    1 7 1                           # main.cpp:7:1
-       movl    -4(%rbp), %eax
-       .loc    1 7 1 epilogue_begin is_stmt 0  # main.cpp:7:1
-       popq    %rbp
-       .cfi_def_cfa %rsp, 8
-       retq
-.Ltmp5:
-.Lfunc_end1:
-       .size   _ZL3foob, .Lfunc_end1-_ZL3foob
-       .cfi_endproc
-                                        # -- End function
-       .section        .debug_abbrev,"",@progbits
-       .byte   1                               # Abbreviation Code
-       .byte   17                              # DW_TAG_compile_unit
-       .byte   1                               # DW_CHILDREN_yes
-       .byte   37                              # DW_AT_producer
-       .byte   14                              # DW_FORM_strp
-       .byte   19                              # DW_AT_language
-       .byte   5                               # DW_FORM_data2
-       .byte   3                               # DW_AT_name
-       .byte   14                              # DW_FORM_strp
-       .byte   16                              # DW_AT_stmt_list
-       .byte   23                              # DW_FORM_sec_offset
-       .byte   27                              # DW_AT_comp_dir
-       .byte   14                              # DW_FORM_strp
-       .byte   17                              # DW_AT_low_pc
-       .byte   1                               # DW_FORM_addr
-       .byte   85                              # DW_AT_ranges
-       .byte   23                              # DW_FORM_sec_offset
-       .byte   0                               # EOM(1)
-       .byte   0                               # EOM(2)
-       .byte   2                               # Abbreviation Code
-       .byte   46                              # DW_TAG_subprogram
-       .byte   0                               # DW_CHILDREN_no
-       .byte   17                              # DW_AT_low_pc
-       .byte   1                               # DW_FORM_addr
-       .byte   18                              # DW_AT_high_pc
-       .byte   6                               # DW_FORM_data4
-       .byte   64                              # DW_AT_frame_base
-       .byte   24                              # DW_FORM_exprloc
-       .byte   3                               # DW_AT_name
-       .byte   14                              # DW_FORM_strp
-       .byte   58                              # DW_AT_decl_file
-       .byte   11                              # DW_FORM_data1
-       .byte   59                              # DW_AT_decl_line
-       .byte   11                              # DW_FORM_data1
-       .byte   73                              # DW_AT_type
-       .byte   19                              # DW_FORM_ref4
-       .byte   63                              # DW_AT_external
-       .byte   25                              # DW_FORM_flag_present
-       .byte   0                               # EOM(1)
-       .byte   0                               # EOM(2)
-       .byte   3                               # Abbreviation Code
-       .byte   46                              # DW_TAG_subprogram
-       .byte   1                               # DW_CHILDREN_yes
-       .byte   17                              # DW_AT_low_pc
-       .byte   1                               # DW_FORM_addr
-       .byte   18                              # DW_AT_high_pc
-       .byte   6                               # DW_FORM_data4
-       .byte   64                              # DW_AT_frame_base
-       .byte   24                              # DW_FORM_exprloc
-       .byte   110                             # DW_AT_linkage_name
-       .byte   14                              # DW_FORM_strp
-       .byte   3                               # DW_AT_name
-       .byte   14                              # DW_FORM_strp
-       .byte   58                              # DW_AT_decl_file
-       .byte   11                              # DW_FORM_data1
-       .byte   59                              # DW_AT_decl_line
-       .byte   11                              # DW_FORM_data1
-       .byte   73                              # DW_AT_type
-       .byte   19                              # DW_FORM_ref4
-       .byte   0                               # EOM(1)
-       .byte   0                               # EOM(2)
-       .byte   4                               # Abbreviation Code
-       .byte   5                               # DW_TAG_formal_parameter
-       .byte   0                               # DW_CHILDREN_no
-       .byte   2                               # DW_AT_location
-       .byte   24                              # DW_FORM_exprloc
-       .byte   3                               # DW_AT_name
-       .byte   14                              # DW_FORM_strp
-       .byte   58                              # DW_AT_decl_file
-       .byte   11                              # DW_FORM_data1
-       .byte   59                              # DW_AT_decl_line
-       .byte   11                              # DW_FORM_data1
-       .byte   73                              # DW_AT_type
-       .byte   19                              # DW_FORM_ref4
-       .byte   0                               # EOM(1)
-       .byte   0                               # EOM(2)
-       .byte   5                               # Abbreviation Code
-       .byte   11                              # DW_TAG_lexical_block
-       .byte   1                               # DW_CHILDREN_yes
-       .byte   85                              # DW_AT_ranges   <------ 
Manually modified. Replaced low_pc/high)_pc with rangres.
-       .byte   23                              # DW_FORM_sec_offset
-       .byte   0                               # EOM(1)
-       .byte   0                               # EOM(2)
-       .byte   6                               # Abbreviation Code
-       .byte   52                              # DW_TAG_variable
-       .byte   0                               # DW_CHILDREN_no
-       .byte   2                               # DW_AT_location
-       .byte   24                              # DW_FORM_exprloc
-       .byte   3                               # DW_AT_name
-       .byte   14                              # DW_FORM_strp
-       .byte   58                              # DW_AT_decl_file
-       .byte   11                              # DW_FORM_data1
-       .byte   59                              # DW_AT_decl_line
-       .byte   11                              # DW_FORM_data1
-       .byte   73                              # DW_AT_type
-       .byte   19                              # DW_FORM_ref4
-       .byte   0                               # EOM(1)
-       .byte   0                               # EOM(2)
-       .byte   7                               # Abbreviation Code
-       .byte   36                              # DW_TAG_base_type
-       .byte   0                               # DW_CHILDREN_no
-       .byte   3                               # DW_AT_name
-       .byte   14                              # DW_FORM_strp
-       .byte   62                              # DW_AT_encoding
-       .byte   11                              # DW_FORM_data1
-       .byte   11                              # DW_AT_byte_size
-       .byte   11                              # DW_FORM_data1
-       .byte   0                               # EOM(1)
-       .byte   0                               # EOM(2)
-       .byte   0                               # EOM(3)
-       .section        .debug_info,"",@progbits
-.Lcu_begin0:
-       .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
-.Ldebug_info_start0:
-       .short  4                               # DWARF version number
-       .long   .debug_abbrev                   # Offset Into Abbrev. Section
-       .byte   8                               # Address Size (in bytes)
-       .byte   1                               # Abbrev [1] 0xb:0x8f 
DW_TAG_compile_unit
-       .long   .Linfo_string0                  # DW_AT_producer
-       .short  33                              # DW_AT_language
-       .long   .Linfo_string1                  # DW_AT_name
-       .long   .Lline_table_start0             # DW_AT_stmt_list
-       .long   .Linfo_string2                  # DW_AT_comp_dir
-       .quad   0                               # DW_AT_low_pc
-       .long   .Ldebug_ranges0                 # DW_AT_ranges
-       .byte   2                               # Abbrev [2] 0x2a:0x19 
DW_TAG_subprogram
-       .quad   .Lfunc_begin0                   # DW_AT_low_pc
-       .long   .Lfunc_end0-.Lfunc_begin0       # DW_AT_high_pc
-       .byte   1                               # DW_AT_frame_base
-       .byte   86
-       .long   .Linfo_string3                  # DW_AT_name
-       .byte   1                               # DW_AT_decl_file
-       .byte   8                               # DW_AT_decl_line
-       .long   138                             # DW_AT_type
-                                        # DW_AT_external
-       .byte   3                               # Abbrev [3] 0x43:0x48 
DW_TAG_subprogram
-       .quad   .Lfunc_begin1 + 1               # DW_AT_low_pc
-       .long   .Lfunc_end1-.Lfunc_begin1       # DW_AT_high_pc
-       .byte   1                               # DW_AT_frame_base
-       .byte   86
-       .long   .Linfo_string5                  # DW_AT_linkage_name
-       .long   .Linfo_string6                  # DW_AT_name
-       .byte   1                               # DW_AT_decl_file
-       .byte   1                               # DW_AT_decl_line
-       .long   138                             # DW_AT_type
-       .byte   4                               # Abbrev [4] 0x60:0xe 
DW_TAG_formal_parameter
-       .byte   2                               # DW_AT_location
-       .byte   145
-       .byte   123
-       .long   .Linfo_string7                  # DW_AT_name
-       .byte   1                               # DW_AT_decl_file
-       .byte   1                               # DW_AT_decl_line
-       .long   138                             # DW_AT_type
-       .byte   5                               # Abbrev [5] 0x6e:0x1c 
DW_TAG_lexical_block
-       .long   .Ldebug_ranges0                 # DW_AT_ranges  <-- Manually 
modified replaced low_pc/high_pc to rangres.
-       .byte   6                               # Abbrev [6] 0x7b:0xe 
DW_TAG_variable
-       .byte   2                               # DW_AT_location
-       .byte   145
-       .byte   116
-       .long   .Linfo_string9                  # DW_AT_name
-       .byte   1                               # DW_AT_decl_file
-       .byte   3                               # DW_AT_decl_line
-       .long   138                             # DW_AT_type
-       .byte   0                               # End Of Children Mark
-       .byte   0                               # End Of Children Mark
-       .byte   7                               # Abbrev [7] 0x8b:0x7 
DW_TAG_base_type
-       .long   .Linfo_string4                  # DW_AT_name
-       .byte   5                               # DW_AT_encoding
-       .byte   4                               # DW_AT_byte_size
-       .byte   7                               # Abbrev [7] 0x92:0x7 
DW_TAG_base_type
-       .long   .Linfo_string8                  # DW_AT_name
-       .byte   2                               # DW_AT_encoding
-       .byte   1                               # DW_AT_byte_size
-       .byte   0                               # End Of Children Mark
-.Ldebug_info_end0:
-       .section        .debug_ranges,"",@progbits
-.Ldebug_ranges0:
-       .quad   .Lfunc_begin0
-       .quad   .Lfunc_end0
-       .quad   .Lfunc_begin1
-       .quad   .Lfunc_end1
-       .quad   0
-       .quad   0
-       .section        .debug_str,"MS",@progbits,1
-.Linfo_string0:
-       .asciz  "clang version 17.0.0 (https://github.com/llvm/llvm-project.git 
73027ae39b1492e5b6033358a13b86d7d1e781ae)" # string offset=0
-.Linfo_string1:
-       .asciz  "main.cpp"                      # string offset=105
-.Linfo_string2:
-       .asciz  "base-lower-then-range-entry" # string offset=114
-.Linfo_string3:
-       .asciz  "main"                          # string offset=179
-.Linfo_string4:
-       .asciz  "int"                           # string offset=184
-.Linfo_string5:
-       .asciz  "_ZL3foob"                      # string offset=188
-.Linfo_string6:
-       .asciz  "foo"                           # string offset=197
-.Linfo_string7:
-       .asciz  "b"                             # string offset=201
-.Linfo_string8:
-       .asciz  "bool"                          # string offset=203
-.Linfo_string9:
-       .asciz  "food"                          # string offset=208
-       .ident  "clang version 17.0.0 (https://github.com/llvm/llvm-project.git 
73027ae39b1492e5b6033358a13b86d7d1e781ae)"
-       .section        ".note.GNU-stack","",@progbits
-       .addrsig
-       .addrsig_sym _ZL3foob
-       .section        .debug_line,"",@progbits
-.Lline_table_start0:
diff --git 
a/lldb/test/Shell/SymbolFile/DWARF/x86/discontinuous-inline-function.s 
b/lldb/test/Shell/SymbolFile/DWARF/x86/discontinuous-inline-function.s
index 399f4e4db5b2f..9afb272b3496f 100644
--- a/lldb/test/Shell/SymbolFile/DWARF/x86/discontinuous-inline-function.s
+++ b/lldb/test/Shell/SymbolFile/DWARF/x86/discontinuous-inline-function.s
@@ -6,28 +6,13 @@
 # RUN: %lldb %t -o "image lookup -v -n look_me_up" -o exit | FileCheck %s
 
 # CHECK:      1 match found in {{.*}}
-# CHECK:      Summary: {{.*}}`foo + 6 [inlined] foo_inl + 1
-# CHECK-NEXT:          {{.*}}`foo + 5
-# CHECK:      Blocks: id = {{.*}}, ranges = 
[0x00000000-0x00000003)[0x00000004-0x00000008)
-# CHECK-NEXT:         id = {{.*}}, ranges = 
[0x00000001-0x00000002)[0x00000005-0x00000007), name = "foo_inl"
+# CHECK:      Summary: {{.*}}`foo - 3 [inlined] foo_inl + 1
+# CHECK-NEXT:          {{.*}}`foo - 4
+# CHECK:      Blocks: id = {{.*}}, ranges = 
[0x00000000-0x00000004)[0x00000005-0x00000008)
+# CHECK-NEXT:         id = {{.*}}, ranges = 
[0x00000001-0x00000003)[0x00000006-0x00000007), name = "foo_inl"
 
         .text
 
-        .type   foo,@function
-foo:
-        nop
-.Lfoo_inl:
-        nop
-.Lfoo_inl_end:
-        nop
-.Lfoo_end:
-        .size   foo, .Lfoo_end-foo
-
-bar:
-        nop
-.Lbar_end:
-        .size   bar, .Lbar_end-bar
-
         .section        .text.__part1,"ax",@progbits
 foo.__part.1:
         nop
@@ -42,6 +27,21 @@ look_me_up:
         .size   foo.__part.1, .Lfoo.__part.1_end-foo.__part.1
 
 
+bar:
+        nop
+.Lbar_end:
+        .size   bar, .Lbar_end-bar
+
+        .type   foo,@function
+foo:
+        nop
+.Lfoo_inl:
+        nop
+.Lfoo_inl_end:
+        nop
+.Lfoo_end:
+        .size   foo, .Lfoo_end-foo
+
         .section        .debug_abbrev,"",@progbits
         .byte   1                               # Abbreviation Code
         .byte   17                              # DW_TAG_compile_unit

>From b39e73fe196c2562d449b695526978140e16f47d Mon Sep 17 00:00:00 2001
From: Pavel Labath <pa...@labath.sk>
Date: Tue, 22 Apr 2025 17:02:20 +0200
Subject: [PATCH 2/2] rename subprogram_low_pc to function_file_addr, to match
 the name in the caller

---
 lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 6 +++---
 lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h   | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp 
b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 052e9f71eb980..43f8650db4cad 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1323,7 +1323,7 @@ bool SymbolFileDWARF::ParseDebugMacros(CompileUnit 
&comp_unit) {
 
 size_t SymbolFileDWARF::ParseBlocksRecursive(CompileUnit &comp_unit,
                                              Block *parent_block, DWARFDIE die,
-                                             addr_t subprogram_low_pc) {
+                                             addr_t function_file_addr) {
   size_t blocks_added = 0;
   for (; die; die = die.GetSibling()) {
     dw_tag_t tag = die.Tag();
@@ -1347,7 +1347,7 @@ size_t SymbolFileDWARF::ParseBlocksRecursive(CompileUnit 
&comp_unit,
                                  call_column, nullptr)) {
       for (const llvm::DWARFAddressRange &range : ranges) {
         if (range.valid() && range.LowPC >= m_first_code_address)
-          block->AddRange(Block::Range(range.LowPC - subprogram_low_pc,
+          block->AddRange(Block::Range(range.LowPC - function_file_addr,
                                        range.HighPC - range.LowPC));
       }
       block->FinalizeRanges();
@@ -1376,7 +1376,7 @@ size_t SymbolFileDWARF::ParseBlocksRecursive(CompileUnit 
&comp_unit,
 
       if (die.HasChildren()) {
         blocks_added += ParseBlocksRecursive(
-            comp_unit, block, die.GetFirstChild(), subprogram_low_pc);
+            comp_unit, block, die.GetFirstChild(), function_file_addr);
       }
     }
   }
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h 
b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 7309f7a86b659..c9fdfb7b1cf91 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -391,7 +391,7 @@ class SymbolFileDWARF : public SymbolFileCommon {
   Function *ParseFunction(CompileUnit &comp_unit, const DWARFDIE &die);
 
   size_t ParseBlocksRecursive(CompileUnit &comp_unit, Block *parent_block,
-                              DWARFDIE die, lldb::addr_t subprogram_low_pc);
+                              DWARFDIE die, lldb::addr_t function_file_addr);
 
   size_t ParseTypes(const SymbolContext &sc, const DWARFDIE &die,
                     bool parse_siblings, bool parse_children);

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to