char obuf[MAX_OPERAND_BUFFER_SIZE];
char *obufp;
- char cbuf[COMMENT_BUFFER_SIZE];
- char * cbufp;
+ char *cbufp;
char *mnemonicendp;
const uint8_t *start_codep;
uint8_t *codep;
signed char op_index[MAX_OPERANDS];
bool op_riprel[MAX_OPERANDS];
char *op_out[MAX_OPERANDS];
+ char *cm_out[MAX_OPERANDS];
bfd_vma op_address[MAX_OPERANDS];
bfd_vma start_pc;
.start_codep = priv.the_buffer,
.codep = priv.the_buffer,
.obufp = ins.obuf,
- .cbufp = ins.cbuf,
.last_lock_prefix = -1,
.last_repz_prefix = -1,
.last_repnz_prefix = -1,
.fwait_prefix = -1,
};
char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
+ char cm_out[MAX_OPERANDS][COMMENT_BUFFER_SIZE];
priv.orig_sizeflag = AFLAG | DFLAG;
if ((info->mach & bfd_mach_i386_i386) != 0)
{
op_out[i][0] = 0;
ins.op_out[i] = op_out[i];
+ cm_out[i][0] = 0;
+ ins.cm_out[i] = cm_out[i];
}
sizeflag = priv.orig_sizeflag;
for (i = 0; i < MAX_OPERANDS; ++i)
{
ins.obufp = ins.op_out[i];
+ ins.cbufp = ins.cm_out[i];
ins.op_ad = MAX_OPERANDS - 1 - i;
if (dp->op[i].rtn
&& !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag))
riprel = ins.op_riprel[i];
ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
+
+ char *tmp = ins.cm_out[i];
+ ins.cm_out[i] = ins.cm_out[MAX_OPERANDS - 1 - i];
+ ins.cm_out[MAX_OPERANDS - 1 - i] = tmp;
}
}
else
needcomma = 1;
}
+ const char *sep = " # ";
for (i = 0; i < MAX_OPERANDS; i++)
if (ins.op_index[i] != -1 && ins.op_riprel[i])
{
- i386_dis_printf (info, dis_style_comment_start, " # ");
+ i386_dis_printf (info, dis_style_comment_start, sep);
+ sep = ", ";
(*info->print_address_func)
((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
+ ins.op_address[ins.op_index[i]]),
- info);
- break;
+ info);
+ }
+ else if (*ins.cm_out[i])
+ {
+ i386_dis_printf (info, dis_style_comment_start, sep);
+ sep = ", ";
+ i386_dis_printf (info, dis_style_symbol, "%s", ins.cm_out[i]);
}
- if (ins.cbufp != ins.cbuf)
- {
- if (i == MAX_OPERANDS)
- i386_dis_printf (info, dis_style_comment_start, " # ");
- i386_dis_printf (info, dis_style_comment_start, "%s", ins.cbuf);
- }
ret = ins.codep - priv.the_buffer;
out:
putop (ins, float_mem[fp_indx], sizeflag);
ins->obufp = ins->op_out[0];
+ ins->cbufp = ins->cm_out[0];
ins->op_ad = 2;
return OP_E (ins, float_mem_mode[fp_indx], sizeflag);
}
putop (ins, dp->name, sizeflag);
ins->obufp = ins->op_out[0];
+ ins->cbufp = ins->cm_out[0];
ins->op_ad = 2;
if (dp->op[0].rtn
&& !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag))
return false;
ins->obufp = ins->op_out[1];
+ ins->cbufp = ins->cm_out[1];
ins->op_ad = 1;
if (dp->op[1].rtn
&& !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag))
cappend_with_style (instr_info *ins, const char *s,
enum disassembler_style style)
{
- if (ins->cbufp + strlen (s) + 4 >= ins->cbuf + COMMENT_BUFFER_SIZE)
+ size_t len = strlen (ins->cbufp);
+
+ if (len + !!len + strlen (s) + 4 >= COMMENT_BUFFER_SIZE)
return;
unsigned num = (unsigned) style;
+ if (len)
+ *ins->cbufp++ = ' ';
*ins->cbufp++ = STYLE_MARKER_CHAR;
*ins->cbufp++ = (num < 10 ? ('0' + num)
: ((num < 16) ? ('a' + (num - 10)) : '0'));
*ins->cbufp++ = STYLE_MARKER_CHAR;
- *ins->cbufp = '\0';
ins->cbufp = stpcpy (ins->cbufp, s);
}
char * annotation = NULL;
- if (asprintf (& annotation, " [%s]", sym->name) > 0)
+ if (asprintf (& annotation, "[%s]", sym->name) > 0)
{
/* Display the symbol associated with address 'imm'. */
cappend_with_style (ins, annotation, dis_style_symbol);
ins->op_out[2] = ins->op_out[1];
ins->op_out[1] = tmp;
+
+ tmp = ins->cm_out[2];
+ ins->cm_out[2] = ins->cm_out[1];
+ ins->cm_out[1] = tmp;
}
return true;
}
ins->op_out[3] = ins->op_out[2];
ins->op_out[2] = tmp;
+
+ tmp = ins->cm_out[2];
+ ins->cm_out[3] = ins->cm_out[2];
+ ins->cm_out[2] = tmp;
}
return true;
}