https://sourceware.org/bugzilla/show_bug.cgi?id=32886

            Bug ID: 32886
           Summary: wrong mapping from instruction to line number
           Product: binutils
           Version: 2.44
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: gprofng
          Assignee: vladimir.mezentsev at oracle dot com
          Reporter: bruno at clisp dot org
  Target Milestone: ---

Created attachment 16032
  --> https://sourceware.org/bugzilla/attachment.cgi?id=16032&action=edit
gprofng-gui screenshot

I'm using GNU binutils 2.44 with GNU gprofng-gui 2.0 on x86_64. In the "Lines",
"Source", and "Source/Disassembly" views of the GUI, the counts on each line
and the line highlighting are misleading, because program counter (%rip) values
found on the stack are mapped to wrong line numbers.

Here's an example (but the problem occurs throughout the program!):

This code accesses the first element of a linked list. In the "experiment",
there are many long such linked lists.
=============================================
/* Access to first element of list.  */
template <class KT>
  INLINE KT *
  Keyword_List<KT>::first () const
  {
    return _car;
  }
=============================================

Find attached (gui.png) the Source/Disassembly view.

In both view parts (Source and Disassembly) view, the line that is highlighted
as consuming 7% of the Total CPU time is the instruction "pop %rbp",
corresponding to the function exit of method 'Keyword_List<KT>::first ()
const'.

But this is nonsense. A "pop %rbp" instruction executes quickly, because it's
done entirely within CPU and L1 cache. The instruction that takes 7% of the
Total CPU Time is instead the *previous* one, "mov 0x8(%rax),%rax". This is the
instruction that fetches the '_car' member of the class instance (linked list
node). That is because a linked-list representation of a list has bad cache
locality; in other words, there are many L1 or L2 cache misses at this point.

Therefore, the line that should be attributed with 7% of Total CPU Time and
with the yellow/orange highlight colour is
  - in the Instruction part: mov 0x8(%rax),%rax
  - in the Source part:     return _car;

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Reply via email to