[Lldb-commits] [lldb] d8de239 - Revert "[lldb] Improve unwinding for discontinuous functions (#111409)"

Shubham Sandeep Rastogi via lldb-commits lldb-commits at lists.llvm.org
Mon Oct 14 15:27:16 PDT 2024


Author: Shubham Sandeep Rastogi
Date: 2024-10-14T15:27:05-07:00
New Revision: d8de2391eb014fb3f750f4c38abc101edc1e2cc2

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

LOG: Revert "[lldb] Improve unwinding for discontinuous functions (#111409)"

This reverts commit a89e01634fe2e6ce0b967ead24280b6693b523dc.

This is being reverted because it broke the test:

Unwind/trap_frame_sym_ctx.test

/Users/ec2-user/jenkins/workspace/llvm.org/lldb-cmake/llvm-project/lldb/test/Shell/Unwind/trap_frame_sym_ctx.test:21:10: error: CHECK: expected string not found in input
 CHECK: frame #2: {{.*}}`main

Added: 
    

Modified: 
    lldb/source/Commands/CommandObjectTarget.cpp
    lldb/source/Symbol/UnwindTable.cpp

Removed: 
    lldb/test/Shell/Unwind/Inputs/basic-block-sections-with-dwarf.s
    lldb/test/Shell/Unwind/Inputs/linux-x86_64.yaml
    lldb/test/Shell/Unwind/basic-block-sections-with-dwarf-static.test
    lldb/test/Shell/Unwind/basic-block-sections-with-dwarf.test


################################################################################
diff  --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp
index 9a4a17eaa124ce..e950fb346c253b 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -3583,12 +3583,10 @@ class CommandObjectTargetModulesShowUnwind : public CommandObjectParsed {
       addr_t start_addr = range.GetBaseAddress().GetLoadAddress(target);
       if (abi)
         start_addr = abi->FixCodeAddress(start_addr);
-      range.GetBaseAddress().SetLoadAddress(start_addr, target);
 
       FuncUnwindersSP func_unwinders_sp(
           sc.module_sp->GetUnwindTable()
-              .GetUncachedFuncUnwindersContainingAddress(range.GetBaseAddress(),
-                                                         sc));
+              .GetUncachedFuncUnwindersContainingAddress(start_addr, sc));
       if (!func_unwinders_sp)
         continue;
 

diff  --git a/lldb/source/Symbol/UnwindTable.cpp b/lldb/source/Symbol/UnwindTable.cpp
index 42ab7ba95b9e6c..da88b0c9c4ea19 100644
--- a/lldb/source/Symbol/UnwindTable.cpp
+++ b/lldb/source/Symbol/UnwindTable.cpp
@@ -99,6 +99,12 @@ UnwindTable::GetAddressRange(const Address &addr, const SymbolContext &sc) {
       m_object_file_unwind_up->GetAddressRange(addr, range))
     return range;
 
+  // Check the symbol context
+  if (sc.GetAddressRange(eSymbolContextFunction | eSymbolContextSymbol, 0,
+                         false, range) &&
+      range.GetBaseAddress().IsValid())
+    return range;
+
   // Does the eh_frame unwind info has a function bounds for this addr?
   if (m_eh_frame_up && m_eh_frame_up->GetAddressRange(addr, range))
     return range;
@@ -107,12 +113,6 @@ UnwindTable::GetAddressRange(const Address &addr, const SymbolContext &sc) {
   if (m_debug_frame_up && m_debug_frame_up->GetAddressRange(addr, range))
     return range;
 
-  // Check the symbol context
-  if (sc.GetAddressRange(eSymbolContextFunction | eSymbolContextSymbol, 0,
-                         false, range) &&
-      range.GetBaseAddress().IsValid())
-    return range;
-
   return std::nullopt;
 }
 

diff  --git a/lldb/test/Shell/Unwind/Inputs/basic-block-sections-with-dwarf.s b/lldb/test/Shell/Unwind/Inputs/basic-block-sections-with-dwarf.s
deleted file mode 100644
index c405e51c227cb6..00000000000000
--- a/lldb/test/Shell/Unwind/Inputs/basic-block-sections-with-dwarf.s
+++ /dev/null
@@ -1,256 +0,0 @@
-# An example of a function which has been split into two parts. Roughly
-# corresponds to this C code.
-# int baz() { return 47; }
-# int bar() { return foo(0); }
-# int foo(int flag) { return flag ? bar() : baz(); }
-# int main() { return foo(1); }
-# The function bar has been placed "in the middle" of foo.
-
-        .text
-
-        .type   baz, at function
-baz:
-        .cfi_startproc
-        movl    $47, %eax
-        retq
-        .cfi_endproc
-.Lbaz_end:
-        .size   baz, .Lbaz_end-baz
-
-        .type   foo, at function
-foo:
-        .cfi_startproc
-        pushq   %rbp
-        .cfi_def_cfa_offset 16
-        .cfi_offset %rbp, -16
-        movq    %rsp, %rbp
-        .cfi_def_cfa_register %rbp
-        subq    $16, %rsp
-        movl    %edi, -8(%rbp)
-        cmpl    $0, -8(%rbp)
-        je      foo.__part.2
-        jmp     foo.__part.1
-        .cfi_endproc
-.Lfoo_end:
-        .size   foo, .Lfoo_end-foo
-
-foo.__part.1:
-        .cfi_startproc
-        .cfi_def_cfa %rbp, 16
-        .cfi_offset %rbp, -16
-        callq   bar
-        movl    %eax, -4(%rbp)
-        jmp     foo.__part.3
-.Lfoo.__part.1_end:
-        .size   foo.__part.1, .Lfoo.__part.1_end-foo.__part.1
-        .cfi_endproc
-
-bar:
-        .cfi_startproc
-# NB: Decrease the stack pointer to make the unwind info for this function
-# 
diff erent from the surrounding foo function.
-        subq    $24, %rsp
-        .cfi_def_cfa_offset 32
-        xorl    %edi, %edi
-        callq   foo
-        addq    $24, %rsp
-        .cfi_def_cfa %rsp, 8
-        retq
-        .cfi_endproc
-.Lbar_end:
-        .size   bar, .Lbar_end-bar
-
-foo.__part.2:
-        .cfi_startproc
-        .cfi_def_cfa %rbp, 16
-        .cfi_offset %rbp, -16
-        callq   baz
-        movl    %eax, -4(%rbp)
-        jmp     foo.__part.3
-.Lfoo.__part.2_end:
-        .size   foo.__part.2, .Lfoo.__part.2_end-foo.__part.2
-        .cfi_endproc
-
-foo.__part.3:
-        .cfi_startproc
-        .cfi_def_cfa %rbp, 16
-        .cfi_offset %rbp, -16
-        movl    -4(%rbp), %eax
-        addq    $16, %rsp
-        popq    %rbp
-        .cfi_def_cfa %rsp, 8
-        retq
-.Lfoo.__part.3_end:
-        .size   foo.__part.3, .Lfoo.__part.3_end-foo.__part.3
-        .cfi_endproc
-
-
-        .globl  main
-        .type   main, at function
-main:
-        .cfi_startproc
-        movl    $1, %edi
-        callq   foo
-        retq
-        .cfi_endproc
-.Lmain_end:
-        .size   main, .Lmain_end-main
-
-        .section        .debug_abbrev,"", at progbits
-        .byte   1                               # Abbreviation Code
-        .byte   17                              # DW_TAG_compile_unit
-        .byte   1                               # DW_CHILDREN_yes
-        .byte   37                              # DW_AT_producer
-        .byte   8                               # DW_FORM_string
-        .byte   19                              # DW_AT_language
-        .byte   5                               # DW_FORM_data2
-        .byte   17                              # DW_AT_low_pc
-        .byte   1                               # DW_FORM_addr
-        .byte   85                              # DW_AT_ranges
-        .byte   35                              # DW_FORM_rnglistx
-        .byte   116                             # DW_AT_rnglists_base
-        .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   1                               # DW_FORM_addr
-        .byte   3                               # DW_AT_name
-        .byte   8                               # DW_FORM_string
-        .byte   0                               # EOM(1)
-        .byte   0                               # EOM(2)
-        .byte   3                               # Abbreviation Code
-        .byte   46                              # DW_TAG_subprogram
-        .byte   1                               # DW_CHILDREN_yes
-        .byte   85                              # DW_AT_ranges
-        .byte   35                              # DW_FORM_rnglistx
-        .byte   64                              # DW_AT_frame_base
-        .byte   24                              # DW_FORM_exprloc
-        .byte   3                               # DW_AT_name
-        .byte   8                               # DW_FORM_string
-        .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   8                               # DW_FORM_string
-        .byte   73                              # DW_AT_type
-        .byte   19                              # DW_FORM_ref4
-        .byte   0                               # EOM(1)
-        .byte   0                               # EOM(2)
-        .byte   5                               # Abbreviation Code
-        .byte   36                              # DW_TAG_base_type
-        .byte   0                               # DW_CHILDREN_no
-        .byte   3                               # DW_AT_name
-        .byte   8                               # DW_FORM_string
-        .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,"", at progbits
-.Lcu_begin0:
-        .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
-.Ldebug_info_start0:
-        .short  5                               # DWARF version number
-        .byte   1                               # DWARF Unit Type
-        .byte   8                               # Address Size (in bytes)
-        .long   .debug_abbrev                   # Offset Into Abbrev. Section
-        .byte   1                               # Abbrev [1] DW_TAG_compile_unit
-        .asciz  "Hand-written DWARF"            # DW_AT_producer
-        .short  29                              # DW_AT_language
-        .quad   0                               # DW_AT_low_pc
-        .byte   1                               # DW_AT_ranges
-        .long   .Lrnglists_table_base0          # DW_AT_rnglists_base
-        .byte   2                               # Abbrev [2] DW_TAG_subprogram
-        .quad   baz                             # DW_AT_low_pc
-        .quad   .Lbaz_end                       # DW_AT_high_pc
-        .asciz  "baz"                           # DW_AT_name
-        .byte   2                               # Abbrev [2] DW_TAG_subprogram
-        .quad   bar                             # DW_AT_low_pc
-        .quad   .Lbar_end                       # DW_AT_high_pc
-        .asciz  "bar"                           # DW_AT_name
-        .byte   3                               # Abbrev [3] DW_TAG_subprogram
-        .byte   0                               # DW_AT_ranges
-        .byte   1                               # DW_AT_frame_base
-        .byte   86
-        .asciz  "foo"                           # DW_AT_name
-        .byte   4                               # Abbrev [4] DW_TAG_formal_parameter
-        .byte   2                               # DW_AT_location
-        .byte   145
-        .byte   120
-        .asciz  "flag"                          # DW_AT_name
-        .long   .Lint-.Lcu_begin0               # DW_AT_type
-        .byte   0                               # End Of Children Mark
-        .byte   2                               # Abbrev [2] DW_TAG_subprogram
-        .quad   main                            # DW_AT_low_pc
-        .quad   .Lmain_end                      # DW_AT_high_pc
-        .asciz  "main"                          # DW_AT_name
-.Lint:
-        .byte   5                               # Abbrev [5] DW_TAG_base_type
-        .asciz  "int"                           # DW_AT_name
-        .byte   5                               # DW_AT_encoding
-        .byte   4                               # DW_AT_byte_size
-        .byte   0                               # End Of Children Mark
-.Ldebug_info_end0:
-
-        .section        .debug_rnglists,"", at progbits
-        .long   .Ldebug_list_header_end0-.Ldebug_list_header_start0 # Length
-.Ldebug_list_header_start0:
-        .short  5                               # Version
-        .byte   8                               # Address size
-        .byte   0                               # Segment selector size
-        .long   2                               # Offset entry count
-.Lrnglists_table_base0:
-        .long   .Ldebug_ranges0-.Lrnglists_table_base0
-        .long   .Ldebug_ranges1-.Lrnglists_table_base0
-.Ldebug_ranges0:
-        .byte   6                               # DW_RLE_start_end
-        .quad   foo
-        .quad   .Lfoo_end
-        .byte   6                               # DW_RLE_start_end
-        .quad   foo.__part.1
-        .quad   .Lfoo.__part.1_end
-        .byte   6                               # DW_RLE_start_end
-        .quad   foo.__part.2
-        .quad   .Lfoo.__part.2_end
-        .byte   6                               # DW_RLE_start_end
-        .quad   foo.__part.3
-        .quad   .Lfoo.__part.3_end
-        .byte   0                               # DW_RLE_end_of_list
-.Ldebug_ranges1:
-        .byte   6                               # DW_RLE_start_end
-        .quad   baz
-        .quad   .Lbaz_end
-        .byte   6                               # DW_RLE_start_end
-        .quad   bar
-        .quad   .Lbar_end
-        .byte   6                               # DW_RLE_start_end
-        .quad   foo.__part.1
-        .quad   .Lfoo.__part.1_end
-        .byte   6                               # DW_RLE_start_end
-        .quad   foo.__part.2
-        .quad   .Lfoo.__part.2_end
-        .byte   6                               # DW_RLE_start_end
-        .quad   foo.__part.3
-        .quad   .Lfoo.__part.3_end
-        .byte   6                               # DW_RLE_start_end
-        .quad   foo
-        .quad   .Lfoo_end
-        .byte   6                               # DW_RLE_start_end
-        .quad   main
-        .quad   .Lmain_end
-        .byte   0                               # DW_RLE_end_of_list
-.Ldebug_list_header_end0:
-
-        .section        ".note.GNU-stack","", at progbits

diff  --git a/lldb/test/Shell/Unwind/Inputs/linux-x86_64.yaml b/lldb/test/Shell/Unwind/Inputs/linux-x86_64.yaml
deleted file mode 100644
index 987462c2a0efc6..00000000000000
--- a/lldb/test/Shell/Unwind/Inputs/linux-x86_64.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
---- !minidump
-Streams:
-  - Type:            ThreadList
-    Threads:
-      - Thread Id:       0x000074DD
-        Context:         0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0010000000000033000000000000000000000002020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040109600000000000100000000000000000000000000000068E7D0C8FF7F000068E7D0C8FF7F000097E6D0C8FF7F000010109600000000000000000000000000020000000000000088E4D0C8FF7F0000603FFF85C77F0000F00340000000000080E7D0C8FF7F000000000000000000000000000000000000E0034000000000007F0300000000000000000000000000000000000000000000801F0000FFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF252525252525252525252525252525250000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-        Stack:
-          Start of Memory Range: 0x00007FFFC8D0E000
-          Content:               DEADBEEFBAADF00D
-  - Type:            Exception
-    Thread ID:       0x000074DD
-    Exception Record:
-      Exception Code:  0x0000000B
-    Thread Context:  00000000
-  - Type:            SystemInfo
-    Processor Arch:  AMD64
-    Processor Level: 6
-    Processor Revision: 15876
-    Number of Processors: 40
-    Platform ID:     Linux
-    CSD Version:     'Linux 3.13.0-91-generic'
-    CPU:
-      Vendor ID:       GenuineIntel
-      Version Info:    0x00000000
-      Feature Info:    0x00000000
-...

diff  --git a/lldb/test/Shell/Unwind/basic-block-sections-with-dwarf-static.test b/lldb/test/Shell/Unwind/basic-block-sections-with-dwarf-static.test
deleted file mode 100644
index 09ea0203e3eeae..00000000000000
--- a/lldb/test/Shell/Unwind/basic-block-sections-with-dwarf-static.test
+++ /dev/null
@@ -1,65 +0,0 @@
-# Test unwind info for functions which have been split into two or more parts.
-# In particular, check that the address ranges of these plans are correct, as
-# overly large ranges have caused a bug in the past.
-
-# REQUIRES: lld, target-x86_64
-
-# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj \
-# RUN:   %S/Inputs/basic-block-sections-with-dwarf.s > %t.o
-# RUN: ld.lld %t.o -o %t
-## NB: This minidump exists only as a receptacle for the object file built
-## above. This is a workaround for the fact that "image show-unwind" does not
-## work without a Process object.
-# RUN: yaml2obj %S/Inputs/linux-x86_64.yaml > %t.core
-# RUN: %lldb -c %t.core %t -o "image load --file %t --slide 0" -s %s -o exit | \
-# RUN:   FileCheck --implicit-check-not="UNWIND PLANS" %s
-
-image show-unwind -n foo
-# CHECK: UNWIND PLANS for {{.*}}`foo
-#
-# CHECK:      Asynchronous (not restricted to call-sites) UnwindPlan is 'eh_frame CFI'
-# CHECK-NEXT: Synchronous (restricted to call-sites) UnwindPlan is 'eh_frame CFI'
-
-# CHECK:      Assembly language inspection UnwindPlan:
-# CHECK-NEXT: This UnwindPlan originally sourced from assembly insn profiling
-# CHECK-NEXT: This UnwindPlan is sourced from the compiler: no.
-# CHECK-NEXT: This UnwindPlan is valid at all instruction locations: yes.
-# CHECK-NEXT: This UnwindPlan is for a trap handler function: no.
-# CHECK-NEXT: Address range of this UnwindPlan: [{{.*}}.text + 6-0x0000000000000019)
-
-# CHECK:      eh_frame UnwindPlan:
-# CHECK-NEXT: This UnwindPlan originally sourced from eh_frame CFI
-# CHECK-NEXT: This UnwindPlan is sourced from the compiler: yes.
-# CHECK-NEXT: This UnwindPlan is valid at all instruction locations: no.
-# CHECK-NEXT: This UnwindPlan is for a trap handler function: no.
-# CHECK-NEXT: Address range of this UnwindPlan: [{{.*}}.text + 6-0x0000000000000019)
-# CHECK-NEXT: row[0]:    0: CFA=rsp +8 => rip=[CFA-8]
-# CHECK-NEXT: row[1]:    1: CFA=rsp+16 => rbp=[CFA-16] rip=[CFA-8]
-# CHECK-NEXT: row[2]:    4: CFA=rbp+16 => rbp=[CFA-16] rip=[CFA-8]
-# CHECK-EMPTY:
-
-image show-unwind -n foo.__part.1
-# CHECK: UNWIND PLANS for {{.*}}`foo.__part.1
-
-## As of this writing (Oct 2024), the async unwind plan is "assembly insn
-## profiling", which isn't ideal, because this "function" does not follow the
-## standard ABI. We end up choosing this plan because the eh_frame unwind plan
-## looks like the unwind plan for a regular function without the prologue
-## information.
-# CHECK: Synchronous (restricted to call-sites) UnwindPlan is 'eh_frame CFI'
-
-# CHECK:      Assembly language inspection UnwindPlan:
-# CHECK-NEXT: This UnwindPlan originally sourced from assembly insn profiling
-# CHECK-NEXT: This UnwindPlan is sourced from the compiler: no.
-# CHECK-NEXT: This UnwindPlan is valid at all instruction locations: yes.
-# CHECK-NEXT: This UnwindPlan is for a trap handler function: no.
-# CHECK-NEXT: Address range of this UnwindPlan: [{{.*}}.text + 25-0x0000000000000023)
-
-# CHECK:      eh_frame UnwindPlan:
-# CHECK-NEXT: This UnwindPlan originally sourced from eh_frame CFI
-# CHECK-NEXT: This UnwindPlan is sourced from the compiler: yes.
-# CHECK-NEXT: This UnwindPlan is valid at all instruction locations: no.
-# CHECK-NEXT: This UnwindPlan is for a trap handler function: no.
-# CHECK-NEXT: Address range of this UnwindPlan: [{{.*}}.text + 25-0x0000000000000023)
-# CHECK-NEXT: row[0]:    0: CFA=rbp+16 => rbp=[CFA-16] rip=[CFA-8]
-# CHECK-EMPTY:

diff  --git a/lldb/test/Shell/Unwind/basic-block-sections-with-dwarf.test b/lldb/test/Shell/Unwind/basic-block-sections-with-dwarf.test
deleted file mode 100644
index 5aa531f80558a5..00000000000000
--- a/lldb/test/Shell/Unwind/basic-block-sections-with-dwarf.test
+++ /dev/null
@@ -1,23 +0,0 @@
-# Test that lldb is able to unwind out of a function which is in between two
-# parts of a split function. This tests a specific bug where lldb would not find
-# unwind info for the "inner" function if it encountered if after the split
-# function. The presence of debug info is important for this test.
-
-# REQUIRES: system-linux, native
-# REQUIRES: target-x86_64
-
-# RUN: %clang_host %S/Inputs/basic-block-sections-with-dwarf.s -o %t
-# RUN: %lldb %t -s %s -o exit | FileCheck %s
-
-breakpoint set -n baz
-# CHECK: Breakpoint 1: where = {{.*}}`baz
-
-process launch
-# CHECK: stop reason = breakpoint 1
-
-thread backtrace
-# CHECK: frame #0: {{.*}}`baz
-# CHECK: frame #1: {{.*}}`foo(flag=0)
-# CHECK: frame #2: {{.*}}`bar
-# CHECK: frame #3: {{.*}}`foo(flag=1)
-# CHECK: frame #4: {{.*}}`main


        


More information about the lldb-commits mailing list