summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2008-01-11 10:12:18 +0000
committerUlrich Drepper <drepper@redhat.com>2008-01-11 10:12:18 +0000
commit5eee122f63233ad4df924fedceab5e2649922aeb (patch)
treedc1fb9534fedc5f669eb4c3caa75f5ebeca8675e
parent8a3ca3a85e6fe3f5118142517606f5c89799a903 (diff)
Cleanups in libasm abd objdump.
-rw-r--r--libcpu/ChangeLog2
-rw-r--r--libcpu/i386_data.h2
-rw-r--r--libcpu/i386_disasm.c40
-rw-r--r--src/ChangeLog5
-rw-r--r--src/objdump.c3
5 files changed, 27 insertions, 25 deletions
diff --git a/libcpu/ChangeLog b/libcpu/ChangeLog
index cbfcd755..cb0f4edf 100644
--- a/libcpu/ChangeLog
+++ b/libcpu/ChangeLog
@@ -2,6 +2,8 @@
* 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.
+ (i386_disasm): Store final NUL btye at end of functions.
2008-01-10 Ulrich Drepper <drepper@redhat.com>
diff --git a/libcpu/i386_data.h b/libcpu/i386_data.h
index 5f66c610..89fa3089 100644
--- a/libcpu/i386_data.h
+++ b/libcpu/i386_data.h
@@ -1,4 +1,4 @@
-/* Helper routines for disassembler for x86-64.
+/* Helper routines for disassembler for x86/x86-64.
Copyright (C) 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2007.
diff --git a/libcpu/i386_disasm.c b/libcpu/i386_disasm.c
index dd7bfca4..2a843923 100644
--- a/libcpu/i386_disasm.c
+++ b/libcpu/i386_disasm.c
@@ -188,7 +188,6 @@ struct output_data
{
GElf_Addr addr;
int *prefixes;
- const char *op1str;
size_t opoff1;
size_t opoff2;
size_t opoff3;
@@ -467,9 +466,6 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
data = begin + 1;
++addr;
- /* The string definitely fits. */
- buf[bufcnt++] = '\0';
-
goto out;
}
@@ -659,6 +655,7 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
{
case suffix_none:
break;
+
case suffix_w:
if ((codep[-1] & 0xc0) != 0xc0)
{
@@ -681,14 +678,17 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
ADD_CHAR (ch);
}
break;
+
case suffix_w0:
if ((codep[-1] & 0xc0) != 0xc0)
ADD_CHAR ('l');
break;
+
case suffix_w1:
if ((data[0] & 0x4) == 0)
ADD_CHAR ('l');
break;
+
case suffix_W:
if (prefixes & has_data16)
{
@@ -700,6 +700,7 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
ADD_CHAR ('q');
#endif
break;
+
case suffix_W1:
if (prefixes & has_data16)
{
@@ -720,10 +721,12 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
};
ADD_STRING (tttn[codep[-1 - instrtab[cnt].modrm] & 0x0f]);
break;
+
case suffix_D:
if ((codep[-1] & 0xc0) != 0xc0)
ADD_CHAR ((data[0] & 0x04) == 0 ? 's' : 'l');
break;
+
default:
printf("unknown suffix %d\n", instrtab[cnt].suffix);
abort ();
@@ -739,7 +742,6 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
if (instrtab[cnt].str1 != 0)
ADD_STRING (op1_str[instrtab[cnt].str1]);
- output_data.op1str = op1_str[instrtab[cnt].str1];
output_data.opoff1 = (instrtab[cnt].off1_1
+ OFF1_1_BIAS - opoff);
output_data.opoff2 = (instrtab[cnt].off1_2
@@ -752,7 +754,7 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
if (r > 0)
goto enomem;
- string_end_idx = ~0ul;
+ string_end_idx = bufcnt;
}
else if (prec == 2 && instrtab[cnt].fct2 != 0)
{
@@ -760,7 +762,6 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
if (instrtab[cnt].str2 != 0)
ADD_STRING (op2_str[instrtab[cnt].str2]);
- output_data.op1str = op2_str[instrtab[cnt].str2];
output_data.opoff1 = (instrtab[cnt].off2_1
+ OFF2_1_BIAS - opoff);
output_data.opoff2 = (instrtab[cnt].off2_2
@@ -773,7 +774,7 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
if (r > 0)
goto enomem;
- string_end_idx = ~0ul;
+ string_end_idx = bufcnt;
}
else if (prec == 3 && instrtab[cnt].fct3 != 0)
{
@@ -781,7 +782,6 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
if (instrtab[cnt].str3 != 0)
ADD_STRING (op3_str[instrtab[cnt].str3]);
- output_data.op1str = op3_str[instrtab[cnt].str3];
output_data.opoff1 = (instrtab[cnt].off3_1
+ OFF3_1_BIAS - opoff);
output_data.opoff2 = (instrtab[cnt].off3_2
@@ -798,17 +798,9 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
if (r > 0)
goto enomem;
- string_end_idx = ~0ul;
+ string_end_idx = bufcnt;
}
break;
-
- case 'e':
- /* String end marker. */
- if (string_end_idx == ~0ul)
- string_end_idx = bufcnt;
- /* No padding. */
- width = 0;
- break;
}
/* Pad according to the specified width. */
@@ -820,8 +812,8 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
if ((prefixes & SEGMENT_PREFIXES) != 0)
goto print_prefix;
- if (string_end_idx != ~0ul)
- buf[string_end_idx] = '\0';
+ assert (string_end_idx != ~0ul);
+ bufcnt = string_end_idx;
addr += param_start - begin;
data = param_start;
@@ -837,11 +829,13 @@ i386_disasm (const uint8_t **startp, const uint8_t *end, GElf_Addr addr,
ADD_STRING ("(bad)");
addr += data - begin;
- buf[bufcnt++] = '\0';
-
out:
+ if (bufcnt == bufsize)
+ goto enomem;
+ buf[bufcnt] = '\0';
+
*startp = data;
- retval = outcb (buf, strlen (buf), outcbarg);
+ retval = outcb (buf, bufcnt, outcbarg);
if (retval != 0)
goto do_ret;
}
diff --git a/src/ChangeLog b/src/ChangeLog
index aa9b6241..aeb501bd 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-11 Ulrich Drepper <drepper@redhat.com>
+
+ * objdump.c (show_disasm): Adjust disassembler format string for
+ removal of %e.
+
2008-01-04 Roland McGrath <roland@redhat.com>
* strip.c (handle_elf): Move SHDRIDX defn to silence gcc warning.
diff --git a/src/objdump.c b/src/objdump.c
index 92ab84f8..7b95ddd6 100644
--- a/src/objdump.c
+++ b/src/objdump.c
@@ -756,7 +756,8 @@ 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%e %.1o%e,%.2o%e,%.3o%e", disasm_output, &info,
+ "%7m %.1o,%.2o,%.3o", disasm_output, &info,
NULL /* XXX */);
}
}