This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: line info


I'm using libdw to:

dwarf_getsrclines(&cuDIE, &lineBuffer, &lineCount);
for (size_t i = 0; i < lineCount; i++) {
        auto line = dwarf_onesrcline(lineBuffer, i);
        dwarf_lineno(line, &current_statement.line_number);
        const char *file_name = dwarf_linesrc(line, NULL, NULL);
        status = dwarf_lineaddr(line, &current_statement.start_addr);
        
        // here add line info to our own structure
}

In the previous email I gave you an example for the line 233, which gdb adds two breakpoints in two different functions. I understand that, because optimizations, lines can generate scattered instructions. 

The following is the start address and corresponding file name for the line 233 that libdw gives me:
> And we find all these locations:
> Compilation Unit name: lulesh.cc
> [403eb0, ffffffffffffffff) /g/g90/devkota1/LULESH/lulesh.cc:233
> [4060a0, ffffffffffffffff) /g/g90/devkota1/LULESH/lulesh.cc:233 
> [409c0c, ffffffffffffffff) /g/g90/devkota1/LULESH/lulesh.cc:233 

That means the line 233 for that file generated three scattered instruction blocks. At 403eb0, 4060a0, and 409c0c. But that doesn't mean it's only one machine instruction. It could be a whole block of instructions. And now I'm trying to find how to determine the end address for each of them. (the ffffffffffffffff address is the address I'm trying to find).

Suppose these addresses:
....
  403eb0:       48 63 5a 0c             movslq 0xc(%rdx),%rbx
  403eb4:       4c 63 5a 14             movslq 0x14(%rdx),%r11
  403eb8:       4c 63 72 04             movslq 0x4(%rdx),%r14
  403ebc:       4c 63 3a                movslq (%rdx),%r15
....
  4060a0:       41 56                   push   %r14
  4060a2:       48 8b 07                mov    (%rdi),%rax
  4060a5:       41 55                   push   %r13
  4060a7:       41 54                   push   %r12
....
  409c0c:       49 8b 04 24             mov    (%r12),%rax
  409c10:       4c 63 3b                movslq (%rbx),%r15
  409c13:       4c 63 73 04             movslq 0x4(%rbx),%r14
  409c17:       4c 63 6b 08             movslq 0x8(%rbx),%r13
  

Libdw says the line 233 are associated with those three address after the dots (....): 403eb0, 4060a0, and 409c0c.
But we need to know how far down this association goes. That's what I call range end. 
For my knowledge about it, this information is not encoded in the dwarf_line state machine instructions. Right? Would you know how to get it?

I know that the state machine will shift line number and address number to encode instructions such as:
DW_LNS_fixed_advance_pc
SPECIAL(2, 0)
DW_LNS_fixed_advance_pc
SPECIAL(2, 0)
DW_LNS_fixed_advance_pc
SPECIAL(1, 0)
DW_LNS_fixed_advance_pc
SPECIAL(1, 0)
DW_LNS_fixed_advance_pc
DW_LNE_end_sequence

And that does not give us range end. Am I correct? Can we make any assumptions for it?

Regards,
Sasha










From: Mark Wielaard <mark@klomp.org>

Sent: Thursday, September 12, 2019 4:00 AM

To: Sasha Da Rocha Pinheiro <darochapinhe@wisc.edu>

Cc: elfutils-devel@sourceware.org <elfutils-devel@sourceware.org>

Subject: Re: line info

 


Hi Sasha,



On Wed, Sep 11, 2019 at 09:52:23PM +0000, Sasha Da Rocha Pinheiro wrote:

> how do we get the line info range end address for a given line and file?



I am not sure I understand your question competely.  What are you

using to get at the line and file?  In theory there is no "range end

address" for a given source file line.  The instructions associated

with a particular source code line can be scattered around by various

compiler optimisations.



> For instance, gdb adds 2 breapoint to:

> (gdb) b /g/g90/devkota1/LULESH/lulesh.cc:233

> Breakpoint 1 at 0x4060a0: /g/g90/devkota1/LULESH/lulesh.cc:233. (2 locations)

> (gdb) i b

> Num     Type           Disp Enb Address            What

> 1       breakpoint     keep y   <MULTIPLE>         

> 1.1                         y     0x00000000004060a0 in CollectDomainNodesToElemNodes(Domain&, Index_t const*, Real_t*, Real_t*, Real_t*) at lulesh.cc:233

> 1.2                         y     0x0000000000409c0c in CalcKinematicsForElems(Domain&, double, int)


>                                                    at lulesh.cc:233

>

> And we find all these locations:

> Compilation Unit name: lulesh.cc

> [403eb0, ffffffffffffffff) /g/g90/devkota1/LULESH/lulesh.cc:233

> [405477, ffffffffffffffff) /g/g90/devkota1/LULESH/lulesh.h:233 

> [4060a0, ffffffffffffffff) /g/g90/devkota1/LULESH/lulesh.cc:233 

> [409c0c, ffffffffffffffff) /g/g90/devkota1/LULESH/lulesh.cc:233 

> 

> But we need to get the whole range, lower and upper addresses.



Is this in gdb? Or do you mean using one of the elfutils tools or

libraries?



To see how addresses map to source code lines using eu-readelf, try

eu-readelf --debug-dump=line and --debug-dump=decodedline



When using the libdw interface you are probably looking for

dwarf_next_lines () and dwarf_linesrc (), you can then use the

different dwarf_line* () functions to get at the attributes.



Cheers,



Mark


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]