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.
#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
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;
};
void *outcbarg, void *symcbarg)
{
const char *save_fmt = fmt;
- char *labelbuf = NULL;
- //size_t labelbufsize = 0;
#define BUFSIZE 512
char initbuf[BUFSIZE];
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;
}
}
do_ret:
- free (labelbuf);
+ free (output_data.labelbuf);
if (buf != initbuf)
free (buf);
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 */);
}
}
/* 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));
+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.