]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Add comment with absolute address to %rip based address modes.
authorUlrich Drepper <drepper@redhat.com>
Sat, 12 Jan 2008 03:06:47 +0000 (03:06 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 12 Jan 2008 03:06:47 +0000 (03:06 +0000)
libcpu/ChangeLog
libcpu/i386_data.h
libcpu/i386_disasm.c
src/objdump.c
tests/ChangeLog
tests/testfile45.expect.bz2

index cb0f4edfa67a869fe97f6dac592cbaa81f3831f7..f4478795fcba3bc4b03783fb26f75f99f1de7b55 100644 (file)
@@ -1,5 +1,12 @@
 2008-01-11  Ulrich Drepper  <drepper@redhat.com>
 
+       * i386_disasm.c (struct output)buffer): Add labelbuf, labelbufsize,
+       symaddr_use, and symaddr fields.
+       (i386_disasm): Remove labelbuf and labelbufsize variables.
+       Add back %e format.  Implement %a and %l formats.
+       * i386_data.h (general_mod$r_m): Set symaddr_use and symaddr for %rip
+       base addressing.
+
        * i386_disasm.c (i386_disasm): Resize output buffer if necessary.
        Optimize output_data initialization.  Free buffers before return.
        (struct output_data): Remove op1str field.  Adjust code.
index 89fa3089f18d8f31c14a90cf98a44a5368ee8967..43eb13f957f8933ddaf3eb72e2499a9965e40c90 100644 (file)
@@ -264,6 +264,9 @@ general_mod$r_m (struct output_data *d)
 #ifdef X86_64
              n = snprintf (tmpbuf, sizeof (tmpbuf), "%s0x%" PRIx32 "(%%rip)",
                            disp < 0 ? "-" : "", disp < 0 ? -disp : disp);
+
+             d->symaddr_use = addr_rel_always;
+             d->symaddr = disp;
 #else
              n = snprintf (tmpbuf, sizeof (tmpbuf), "0x%" PRIx32, disp);
 #endif
index 2a843923a3356f0bd7ca959c3941f3e229593b39..57a870f1f7a943e8623cfe134811271015a9e2fb 100644 (file)
@@ -199,6 +199,17 @@ struct output_data
   const uint8_t *end;
   DisasmGetSymCB_t symcb;
   void *symcbarg;
+  char *labelbuf;
+  size_t labelbufsize;
+  enum
+    {
+      addr_none = 0,
+      addr_abs_symbolic,
+      addr_abs_always,
+      addr_rel_symbolic,
+      addr_rel_always
+    } symaddr_use;
+  GElf_Addr symaddr;
 };
 
 
@@ -233,8 +244,6 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
             void *outcbarg, void *symcbarg)
 {
   const char *save_fmt = fmt;
-  char *labelbuf = NULL;
-  //size_t labelbufsize = 0;
 
 #define BUFSIZE 512
   char initbuf[BUFSIZE];
@@ -800,6 +809,56 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
 
                      string_end_idx = bufcnt;
                    }
+                 else
+                   bufcnt = string_end_idx;
+                 break;
+
+               case 'e':
+                 string_end_idx = bufcnt;
+                 break;
+
+               case 'a':
+                 /* Pad to requested column.  */
+                 while (bufcnt < (size_t) width)
+                   ADD_CHAR (' ');
+                 width = 0;
+                 break;
+
+               case 'l':
+                 if (output_data.labelbuf != NULL
+                     && output_data.labelbuf[0] != '\0')
+                   {
+                     ADD_STRING (output_data.labelbuf);
+                     output_data.labelbuf[0] = '\0';
+                     string_end_idx = bufcnt;
+                   }
+                 else if (output_data.symaddr_use != addr_none)
+                   {
+                     GElf_Addr symaddr = output_data.symaddr;
+                     if (output_data.symaddr_use >= addr_rel_symbolic)
+                       symaddr += addr + param_start - begin;
+
+                     // XXX Lookup symbol based on symaddr
+                     const char *symstr = NULL;
+
+                     size_t bufavail = bufsize - bufcnt;
+                     int r = 0;
+                     if (symstr != NULL)
+                       r = snprintf (&buf[bufcnt], bufavail, "# %s", symstr);
+                     else if (output_data.symaddr_use == addr_abs_always
+                              || output_data.symaddr_use == addr_rel_always)
+                       r = snprintf (&buf[bufcnt], bufavail, "# %#" PRIx64,
+                                     (uint64_t) symaddr);
+
+                     if (r < 0)
+                       goto not;
+                     if ((size_t) r >= bufavail)
+                       goto enomem;
+                     bufcnt += r;
+                     string_end_idx = bufcnt;
+
+                     output_data.symaddr_use = addr_none;
+                   }
                  break;
                }
 
@@ -841,7 +900,7 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
     }
 
  do_ret:
-  free (labelbuf);
+  free (output_data.labelbuf);
   if (buf != initbuf)
     free (buf);
 
index 7b95ddd628d1e939b29dd94fe64d2b55dbb389db..91fa875092461612f9c70084ab0365fdb9943eb3 100644 (file)
@@ -756,8 +756,7 @@ show_disasm (Ebl *ebl, const char *fname, uint32_t shstrndx)
          info.last_end = info.cur = data->d_buf;
 
          disasm_cb (ctx, &info.cur, info.cur + data->d_size, info.addr,
-                    //"%7m%e %.1o%e,%.2o%e,%.3o%e", disasm_output, &info,
-                    "%7m %.1o,%.2o,%.3o", disasm_output, &info,
+                    "%7m %.1o,%.2o,%.3o%34a %l", disasm_output, &info,
                     NULL /* XXX */);
        }
     }
@@ -776,7 +775,7 @@ handle_elf (Elf *elf, const char *prefix, const char *fname,
   /* Get the backend for this object file type.  */
   Ebl *ebl = ebl_openbackend (elf);
 
-  printf (gettext ("%s: elf%d-%s\n\n"),
+  printf ("%s: elf%d-%s\n\n",
          fname, gelf_getclass (elf) == ELFCLASS32 ? 32 : 64,
          ebl_backend_name (ebl));
 
index 458acd1509f0601425dbf0a80ff4b1dfb7ccfa7e..95ed7833765b4a6f5c24858408d31f6a5386bd76 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-11  Ulrich Drepper  <drepper@redhat.com>
+
+       * testfile45.expect.bz2: Adjust for adding of address for %rip based
+       address mode.
+
 2008-01-10  Ulrich Drepper  <drepper@redhat.com>
 
        * testfile45.S.bz2: Add more tests.
index 9236cf7f9089cf81bfb1245ba7133839d0b21d2e..adce5e0ede2e601ecd0dc2e2aaccd8bfd4ed24b4 100644 (file)
Binary files a/tests/testfile45.expect.bz2 and b/tests/testfile45.expect.bz2 differ