Merge pull request #50 from tgtakaoka/opt-lowercase-dis

Add lowercase_dis option
This commit is contained in:
Daniel Beer 2018-04-04 12:28:27 +12:00 committed by GitHub
commit b294df8cc0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 28 deletions

View File

@ -113,7 +113,14 @@ static const struct opdb_key keys[] = {
"\x1b[1mWARNING: this is an irreversible operation!\x1b[0m\n" "\x1b[1mWARNING: this is an irreversible operation!\x1b[0m\n"
"\n" "\n"
"If in doubt, do not enable this option.\n" "If in doubt, do not enable this option.\n"
} },
{
.name = "lowercase_dis",
.type = OPDB_TYPE_BOOLEAN,
.help =
"If set, disassembled instruction and register name are displayed in\n"
"lowercase.\n"
},
}; };
static union opdb_value values[ARRAY_LEN(keys)]; static union opdb_value values[ARRAY_LEN(keys)];

View File

@ -20,12 +20,75 @@
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h>
#include "dis.h" #include "dis.h"
#include "output_util.h" #include "output_util.h"
#include "stab.h" #include "stab.h"
#include "util.h" #include "util.h"
#include "demangle.h" #include "demangle.h"
#include "opdb.h"
static char* copy_string(int lowercase_dis, char *dst, const char *const end,
const char *src)
{
int c;
if (src != NULL) {
while (dst < end && (c = *src++) != '\0') {
if (lowercase_dis && isupper(c))
c = tolower(c);
*dst++ = c;
}
}
*dst = '\0';
return dst;
}
static const char *opcode_name_with_size(const struct msp430_instruction *insn)
{
static char buf[10];
const char *const end = buf + sizeof(buf) - 1;
const char *opname = dis_opcode_name(insn->op);
const int lowercase_dis = opdb_get_boolean("lowercase_dis");
const char *suffix = NULL;
char *dst;
if (!opname)
opname = "???";
if (insn->dsize == MSP430_DSIZE_BYTE)
suffix = ".B";
else if (insn->dsize == MSP430_DSIZE_AWORD)
suffix = ".A";
else if (insn->dsize == MSP430_DSIZE_UNKNOWN)
suffix = ".?";
/* Don't show the .A suffix for these instructions */
if (insn->op == MSP430_OP_MOVA || insn->op == MSP430_OP_CMPA ||
insn->op == MSP430_OP_SUBA || insn->op == MSP430_OP_ADDA ||
insn->op == MSP430_OP_BRA || insn->op == MSP430_OP_RETA)
suffix = NULL;
dst = copy_string(lowercase_dis, buf, end, opname);
dst = copy_string(lowercase_dis, dst, end, suffix);
return buf;
}
static const char *reg_name(const msp430_reg_t reg)
{
static char buf[4];
const char *const end = buf + sizeof(buf) - 1;
const int lowercase_dis = opdb_get_boolean("lowercase_dis");
const char *name = dis_reg_name(reg);
if (!name)
return "???";
if (lowercase_dis == 0)
return name;
copy_string(lowercase_dis, buf, end, name);
return buf;
}
static int format_addr(msp430_amode_t amode, address_t addr) static int format_addr(msp430_amode_t amode, address_t addr)
{ {
@ -59,7 +122,6 @@ static int format_reg(msp430_amode_t amode, msp430_reg_t reg)
{ {
const char *prefix = ""; const char *prefix = "";
const char *suffix = ""; const char *suffix = "";
const char *name;
switch (amode) { switch (amode) {
case MSP430_AMODE_REGISTER: case MSP430_AMODE_REGISTER:
@ -82,11 +144,7 @@ static int format_reg(msp430_amode_t amode, msp430_reg_t reg)
break; break;
} }
name = dis_reg_name(reg); return printc("%s\x1b[33m%s\x1b[0m%s", prefix, reg_name(reg), suffix);
if (!name)
name = "???";
return printc("%s\x1b[33m%s\x1b[0m%s", prefix, name, suffix);
} }
/* Given an operands addressing mode, value and associated register, /* Given an operands addressing mode, value and associated register,
@ -109,26 +167,8 @@ static int format_operand(msp430_amode_t amode, address_t addr,
static int dis_format(const struct msp430_instruction *insn) static int dis_format(const struct msp430_instruction *insn)
{ {
int len = 0; int len = 0;
const char *opname = dis_opcode_name(insn->op);
const char *suffix = "";
if (!opname) len += printc("\x1b[36m%s\x1b[0m", opcode_name_with_size(insn));
opname = "???";
if (insn->dsize == MSP430_DSIZE_BYTE)
suffix = ".B";
else if (insn->dsize == MSP430_DSIZE_AWORD)
suffix = ".A";
else if (insn->dsize == MSP430_DSIZE_UNKNOWN)
suffix = ".?";
/* Don't show the .A suffix for these instructions */
if (insn->op == MSP430_OP_MOVA || insn->op == MSP430_OP_CMPA ||
insn->op == MSP430_OP_SUBA || insn->op == MSP430_OP_ADDA ||
insn->op == MSP430_OP_BRA || insn->op == MSP430_OP_RETA)
suffix = "";
len += printc("\x1b[36m%s%s\x1b[0m", opname, suffix);
while (len < 8) while (len < 8)
len += printc(" "); len += printc(" ");
@ -152,7 +192,7 @@ static int dis_format(const struct msp430_instruction *insn)
/* Repetition count */ /* Repetition count */
if (insn->rep_register) if (insn->rep_register)
len += printc(" [repeat %s]", dis_reg_name(insn->rep_index)); len += printc(" [repeat %s]", reg_name(insn->rep_index));
else if (insn->rep_index) else if (insn->rep_index)
len += printc(" [repeat %d]", insn->rep_index + 1); len += printc(" [repeat %d]", insn->rep_index + 1);
@ -278,7 +318,7 @@ void show_regs(const address_t *regs)
int k = j * 4 + i; int k = j * 4 + i;
printc("(\x1b[1m%3s:\x1b[0m %05x) ", printc("(\x1b[1m%3s:\x1b[0m %05x) ",
dis_reg_name(k), regs[k]); reg_name(k), regs[k]);
} }
printc("\n"); printc("\n");