This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils 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]

[binutils-gdb] Add --inlines option to objdump to include scope backtrace of inlined functions when generating sour


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4a14e306468af630a27302d68b8d4c59733141b4

commit 4a14e306468af630a27302d68b8d4c59733141b4
Author: Andi Kleen <ak@linux.intel.com>
Date:   Tue Mar 21 13:05:19 2017 +0000

    Add --inlines option to objdump to include scope backtrace of inlined functions when generating source line number information.
    
    	* objdump.c (unwind_inlines): Add.
    	(option_values): Add OPTION_INLINES.
    	(show_line): Unwind inlines if requested.
    	(main): Parse OPTION_INLINES.
    	(usage): Document --inlines.
    	* doc/binutils.texi: Document --inlines.
    	* NEWS: Likewise.

Diff:
---
 binutils/ChangeLog         | 10 ++++++++++
 binutils/NEWS              |  3 +++
 binutils/doc/binutils.texi | 13 ++++++++++++-
 binutils/objdump.c         | 20 +++++++++++++++++++-
 4 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index dea3e36..5ee8073 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,13 @@
+2017-03-21  Andi Kleen  <ak@linux.intel.com>
+
+	* objdump.c (unwind_inlines): Add.
+	(option_values): Add OPTION_INLINES.
+	(show_line): Unwind inlines if requested.
+	(main): Parse OPTION_INLINES.
+	(usage): Document --inlines.
+	* doc/binutils.texi: Document --inlines.
+	* NEWS: Likewise.
+
 2017-03-21  Nick Clifton  <nickc@redhat.com>
 
 	* readelf.c (print_gnu_build_attribute_name): Allow stack
diff --git a/binutils/NEWS b/binutils/NEWS
index 3d15765..c98908a 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -1,5 +1,8 @@
 -*- text -*-
 
+* Add --inlines option to objdump, which extends the --line-numbers option
+  so that inlined functions will display their nesting information.
+
 * Add --merge-notes options to objcopy to reduce the size of notes in
   a binary file by merging and deleting redundant notes.
 
diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index 8fe4d3b..ffa7dfd 100644
--- a/binutils/doc/binutils.texi
+++ b/binutils/doc/binutils.texi
@@ -761,7 +761,8 @@ nm [@option{-A}|@option{-o}|@option{--print-file-name}] [@option{-a}|@option{--d
    [@option{-B}|@option{--format=bsd}] [@option{-C}|@option{--demangle}[=@var{style}]]
    [@option{-D}|@option{--dynamic}] [@option{-f}@var{format}|@option{--format=}@var{format}]
    [@option{-g}|@option{--extern-only}] [@option{-h}|@option{--help}]
-   [@option{-l}|@option{--line-numbers}] [@option{-n}|@option{-v}|@option{--numeric-sort}]
+   [@option{-l}|@option{--line-numbers}] [@option{--inlines}]
+   [@option{-n}|@option{-v}|@option{--numeric-sort}]
    [@option{-P}|@option{--portability}] [@option{-p}|@option{--no-sort}]
    [@option{-r}|@option{--reverse-sort}] [@option{-S}|@option{--print-size}]
    [@option{-s}|@option{--print-armap}] [@option{-t} @var{radix}|@option{--radix=}@var{radix}]
@@ -968,6 +969,16 @@ address of the symbol.  For an undefined symbol, look for the line
 number of a relocation entry which refers to the symbol.  If line number
 information can be found, print it after the other symbol information.
 
+@item --inlines
+@cindex objdump inlines
+When option @option{-l} is active, if the address belongs to a
+function that was inlined, then this option causes the source 
+information for all enclosing scopes back to the first non-inlined
+function to be printed as well.  For example, if @code{main} inlines
+@code{callee1} which inlines @code{callee2}, and address is from
+@code{callee2}, the source information for @code{callee1} and @code{main}
+will also be printed.
+
 @item -n
 @itemx -v
 @itemx --numeric-sort
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 6cd8d0b..58521dd 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -117,6 +117,7 @@ static bfd_boolean display_file_offsets;/* -F */
 static const char *prefix;		/* --prefix */
 static int prefix_strip;		/* --prefix-strip */
 static size_t prefix_length;
+static bfd_boolean unwind_inlines;	/* --inlines.  */
 
 /* A structure to record the sections mentioned in -j switches.  */
 struct only
@@ -257,6 +258,7 @@ usage (FILE *stream, int status)
       --insn-width=WIDTH         Display WIDTH bytes on a single line for -d\n\
       --adjust-vma=OFFSET        Add OFFSET to all displayed section addresses\n\
       --special-syms             Include special symbols in symbol dumps\n\
+      --inlines                  Print all inlines for source line (with -l)\n\
       --prefix=PREFIX            Add PREFIX to absolute paths for -S\n\
       --prefix-strip=LEVEL       Strip initial directory names for -S\n"));
       fprintf (stream, _("\
@@ -296,7 +298,8 @@ enum option_values
     OPTION_ADJUST_VMA,
     OPTION_DWARF_DEPTH,
     OPTION_DWARF_CHECK,
-    OPTION_DWARF_START
+    OPTION_DWARF_START,
+    OPTION_INLINES
   };
 
 static struct option long_options[]=
@@ -348,6 +351,7 @@ static struct option long_options[]=
   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
+  {"inlines",          no_argument, 0, OPTION_INLINES},
   {0, no_argument, 0, 0}
 };
 
@@ -1543,6 +1547,17 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
           else
             printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
         }
+      if (unwind_inlines)
+	{
+	  const char *filename2;
+	  const char *functionname2;
+	  unsigned line2;
+
+	  while (bfd_find_inliner_info (abfd, &filename2, &functionname2,
+					&line2))
+	    printf ("inlined by %s:%u (%s)\n", filename2, line2,
+		    functionname2);
+	}
     }
 
   if (with_source_code
@@ -3808,6 +3823,9 @@ main (int argc, char **argv)
 	  if (insn_width <= 0)
 	    fatal (_("error: instruction width must be positive"));
 	  break;
+	case OPTION_INLINES:
+	  unwind_inlines = TRUE;
+	  break;
 	case 'E':
 	  if (strcmp (optarg, "B") == 0)
 	    endian = BFD_ENDIAN_BIG;


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