We encounter low pc values of 0 quite often macOS, since we leave the DWARF in 
.o file and then use a debug-map to fix up the addresses (and remove unused 
functions).  The first function in a .o file is often at 0.  Just a data point 
in favor of choosing something other than a low pc of 0 to mean discarded.

Jim


> On Mar 9, 2017, at 6:01 AM, James Henderson via lldb-dev 
> <lldb-dev@lists.llvm.org> wrote:
> 
> Thank you for the effort put into this response. It's interesting to see that 
> there are problems with LLDB's handling here. This might mean we need to have 
> a wider discussion about how LLD does its --gc-sections. From experience 
> working with our proprietary linker and debugger, this issue is something 
> that both sides have to agree on. We too ended up going with an invalid 
> address to mark the low_pc field for discarded elements.
> 
> Due to changes in how the compiler emitted DWARF information, we discovered 
> some time ago that we cannot simply patch the high_pc field to be the same as 
> the low_pc field, because the compiler started to use the high_pc field to 
> indicate the size instead. Whilst this reduces the number of relocations the 
> linker has to perform, it does make it difficult for the linker to patch the 
> high_pc field reliably, without parsing the debug_info section.
> 
> Regards,
> 
> James
> 
> 
> On 9 March 2017 at 11:03, Earlam, David <dear...@qti.qualcomm.com 
> <mailto:dear...@qti.qualcomm.com>> wrote:
> Hi James,
> 
> I performed a quick experiment with clang –g –ffunction-sections and link 
> with –gc-sections with Hexagon DSP tools based on llvm3.5.
> 
> This shows an unused function as having DW_AT_low_pc as zero as you predict:
> 
> readelf –W extract of DWARF4 .debug_info)
> 
> <1><2b7>: Abbrev Number: 11 (DW_TAG_subprogram)
>      DW_AT_low_pc      : 0
>      DW_AT_high_pc     : 168
>      DW_AT_frame_base  :
>      DW_AT_name        : (indirect string, offset: 0x1bb): not_used
>      DW_AT_decl_file   : 1
>      DW_AT_decl_line   : 83
>      DW_AT_prototyped  : 1
>      DW_AT_type        : <45d>
>      DW_AT_external    : 1
>      DW_AT_accessibility: 1
> 
> Yet  lldb 3.5.0  and lldb 3.9 both appear to _not_ ignore that DWARF DIE.
> 
> (lldb) expression &not_used
> (int (*)(unsigned char *, const unsigned char *, unsigned long)) $0 = 
> 0x00000000
> 
> and
> 
> (lldb) breakpoint set --name not_used
> Breakpoint 1: where = hexlto.elf`not_used + 20 at lto_test.c:92, address = 
> 0x00000014
> 
> Line 92 would be the first statement after prolog in that source file - if 
> the function were used - but address 0x14 is just wrong
> as it is inside the start-up code. I assume lldb is compensating for the 
> instruction address offset to the first statement in that removed function.
> 
> The command ‘disassemble –name not_used’ reveals the confusion - which makes 
> it appear as though not_used() is present but does not begin with the
> typical Hexagon allocframe instruction that I’d expect for C and instead 
> shows startup code.
> 
> The newest llvm3.9 linker for Hexagon (an internal unreleased version here) 
> sets the DW_AT_low_pc to a none zero value apparently far beyond the end of 
> the .text extent which might be a hint
> to a DWARF consumer or a mistake.
> 
> For a DW_TAG_subprogram would n’t it be more sensible for the linker to set 
> DW_AT_low_pc and DW_AT_high_pc to the same value for garbage collected 
> unreferenced code?
> From the DWARF definition that the high_pc - when of class ADDRESS - is 
> beyond the end of the subprogram extent - It then clearly has no machine code.
> Or for high_pc to also be set to 0 -when of class CONSTANT - it then clearly 
> has no machine code.
> 
> For data  objects and a Harvard architecture address 0 is however valid, as 
> weird as that may seem to C programmers. So for the Qualcomm Kalimba DSP and 
> the XAP RISC CPU used in
> Bluetooth devices our proprietary debuggers look for a specific address  
> value that we hope is greater than we ever expect to be used as a real 
> address of any memory attached to an embedded device.
> 
> As far as I know there’s no way for DWARF to convey that  something has been 
> optimised away except a DW_AT_location empty location list for a variable.
> 
> Of course, a linker should be able to remove the DWARF DIEs for unreferenced 
> code and data when it garbage collects.
> But I’ve not come across one that does this yet. I believe it is difficult 
> for linker implementors because of the inter-section references and relative 
> offsets in DWARF.
> 
> Not tried with llvm 4.0 or lld or gold.
> 
> 
> David Earlam
> Staff-Senior[Engineer]/Manager ? Software : Development Tools() {
> Qualcomm Technologies International, Ltd.
> .
> 
> From: lldb-dev [mailto:lldb-dev-boun...@lists.llvm.org 
> <mailto:lldb-dev-boun...@lists.llvm.org>] On Behalf Of James Henderson via 
> lldb-dev
> Sent: 06 March 2017 13:51
> To: lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>
> Subject: [lldb-dev] LLDB behaviour for GCed sections
> 
> Hi,
>  
> I’m currently investigating the behaviour of different debuggers when 
> functions have been stripped by the linker because they are unused. I tried 
> looking at the source code, but couldn’t really make enough sense of it to 
> answer the question. Would someone be able to explain what LLDB’s behaviour 
> is when it encounters a function in debug information with an address of zero 
> (as is the case for lld and other linker output with --gc-sections)? In 
> particular, does it simply ignore the relevant block of debug information, as 
> appears to be the case for gdb? I’m coming at this from a DWARF perspective, 
> if that makes any difference.
>  
> James
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

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

Reply via email to