mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-03 20:22:38 +00:00
Fixing clang flow warnings (#321) ##rizin
This commit is contained in:
parent
2285024b88
commit
5ffe3e4240
@ -86,10 +86,6 @@ static int pyc_op(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *data, int len, RA
|
||||
} else {
|
||||
oparg = data[1] + extended_arg;
|
||||
}
|
||||
extended_arg = 0;
|
||||
if (op_code == ops->extended_arg) {
|
||||
extended_arg = is_python36? (oparg << 8): (oparg * 65536);
|
||||
}
|
||||
}
|
||||
|
||||
if (op_obj->type & HASJABS) {
|
||||
|
@ -420,6 +420,14 @@ const amd29k_instruction_t amd29k_instructions[N_AMD29K_INSTRUCTIONS] = {
|
||||
{ CPU_ANY, "xor", R_ANAL_OP_TYPE_XOR, 0x95 , decode_ra_rb_rci , NULL },
|
||||
};
|
||||
|
||||
static bool is_cpu(const char* cpu, const amd29k_instruction_t *in) {
|
||||
return cpu[0] == in->cpu[0] &&
|
||||
cpu[1] == in->cpu[1] &&
|
||||
cpu[2] == in->cpu[2] &&
|
||||
cpu[3] == in->cpu[3] &&
|
||||
cpu[4] == in->cpu[4];
|
||||
}
|
||||
|
||||
bool amd29k_instr_decode(const ut8* buffer, const ut32 buffer_size, amd29k_instr_t* instruction, const char* cpu) {
|
||||
if (!buffer || buffer_size < 4 || !instruction || (cpu && strlen (cpu) < 5)) {
|
||||
return false;
|
||||
@ -441,12 +449,7 @@ bool amd29k_instr_decode(const ut8* buffer, const ut32 buffer_size, amd29k_instr
|
||||
instruction->mnemonic = in->mnemonic;
|
||||
instruction->op_type = in->op_type;
|
||||
return true;
|
||||
} else if (in->cpu[0] != '*' && in->cpu[3] == '0' && in->mask == buffer[0]) {
|
||||
in->decode (instruction, buffer);
|
||||
instruction->mnemonic = in->mnemonic;
|
||||
instruction->op_type = in->op_type;
|
||||
return true;
|
||||
} else if (in->cpu[0] != '*' && in->cpu[3] == '5' && in->mask == buffer[0]) {
|
||||
} else if (in->cpu[0] != '*' && in->mask == buffer[0] && is_cpu(cpu, in)) {
|
||||
in->decode (instruction, buffer);
|
||||
instruction->mnemonic = in->mnemonic;
|
||||
instruction->op_type = in->op_type;
|
||||
|
@ -3312,7 +3312,6 @@ print_insn_aarch64 (bfd_vma pc,
|
||||
if (get_sym_code_type (info, n, &type))
|
||||
{
|
||||
last_sym = n;
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1715,13 +1715,13 @@ operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx,
|
||||
different from that of the source register size,
|
||||
e.g. in strb/ldrb. */
|
||||
size = aarch64_get_qualifier_esize (qualifier);
|
||||
if (!value_in_range_p (opnd->addr.offset.imm, 0, 4095 * size))
|
||||
if (!value_in_range_p (imm, 0, 4095 * size))
|
||||
{
|
||||
set_offset_out_of_range_error (mismatch_detail, idx,
|
||||
0, 4095 * size);
|
||||
return 0;
|
||||
}
|
||||
if (!value_aligned_p (opnd->addr.offset.imm, size))
|
||||
if (!value_aligned_p (imm, size))
|
||||
{
|
||||
set_unaligned_error (mismatch_detail, idx, size);
|
||||
return 0;
|
||||
|
@ -80,18 +80,18 @@ static int mips_r(ut8 *b, int op, int rs, int rt, int rd, int sa, int fun) {
|
||||
//^this will keep the below mips_r fuctions working
|
||||
// diff instructions use a diff arg order (add is rd, rs, rt - sll is rd, rt, sa - sllv is rd, rt, rs
|
||||
//static int mips_r (ut8 *b, int op, int rd, int rs, int rt, int sa, int fun) {
|
||||
if (rs == -1 || rt == -1) {
|
||||
if (rs < 0 || rt < 0 || rd < 0 || sa < 0) {
|
||||
return -1;
|
||||
}
|
||||
b[3] = ((op<<2)&0xfc) | ((rs>>3)&3); // 2
|
||||
b[2] = (rs<<5) | (rt&0x1f); // 1
|
||||
b[1] = ((rd<<3)&0xff) | (sa>>2); // 0
|
||||
b[0] = (fun&0x3f) | ((sa&3)<<6);
|
||||
b[3] = ((op << 2) & 0xfc) | ((rs >> 3) & 3); // 2
|
||||
b[2] = (rs << 5) | (rt & 0x1f); // 1
|
||||
b[1] = ((rd << 3) & 0xff) | (sa >> 2); // 0
|
||||
b[0] = (fun & 0x3f) | ((sa & 3) << 6);
|
||||
return 4;
|
||||
}
|
||||
|
||||
static int mips_i(ut8 *b, int op, int rs, int rt, int imm, int is_branch) {
|
||||
if (rs == -1 || rt == -1) {
|
||||
if (rs < 0 || rt < 0) {
|
||||
return -1;
|
||||
}
|
||||
if (is_branch) {
|
||||
@ -102,18 +102,18 @@ static int mips_i(ut8 *b, int op, int rs, int rt, int imm, int is_branch) {
|
||||
imm = 0;
|
||||
}
|
||||
}
|
||||
b[3] = ((op<<2)&0xfc) | ((rs>>3)&3);
|
||||
b[2] = (rs<<5) | (rt);
|
||||
b[1] = (imm>>8) &0xff;
|
||||
b[3] = ((op << 2) & 0xfc) | ((rs >> 3) & 3);
|
||||
b[2] = (rs << 5) | (rt);
|
||||
b[1] = (imm >> 8) & 0xff;
|
||||
b[0] = imm & 0xff;
|
||||
return 4;
|
||||
}
|
||||
|
||||
static int mips_j(ut8 *b, int op, int addr) {
|
||||
addr /= 4;
|
||||
b[3] = ((op<<2)&0xfc) | ((addr>>24)&3);
|
||||
b[2] = (addr>>16)&0xff;
|
||||
b[1] = (addr>>8) &0xff;
|
||||
b[3] = ((op << 2) & 0xfc) | ((addr >> 24) & 3);
|
||||
b[2] = (addr >> 16) & 0xff;
|
||||
b[1] = (addr >> 8) & 0xff;
|
||||
b[0] = addr & 0xff;
|
||||
return 4;
|
||||
}
|
||||
@ -145,14 +145,22 @@ static int getreg(const char *p) {
|
||||
}
|
||||
|
||||
R_IPI int mips_assemble(const char *str, ut64 pc, ut8 *out) {
|
||||
int i, hasp, is_branch;
|
||||
char *s = strdup (str);
|
||||
int i, hasp;
|
||||
char w0[32], w1[32], w2[32], w3[32];
|
||||
char *s = strdup (str);
|
||||
if (!s) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
r_str_replace_char (s, ',', ' ');
|
||||
hasp = r_str_replace_char (s, '(', ' ');
|
||||
r_str_replace_char (s, ')', ' ');
|
||||
|
||||
*out = 0;
|
||||
*w0=*w1=*w2=*w3=0;
|
||||
*w0 = 0;
|
||||
*w1 = 0;
|
||||
*w2 = 0;
|
||||
*w3 = 0;
|
||||
|
||||
if (!strncmp (s, "jalr", 4) && !strchr (s, ',')) {
|
||||
char opstr[32];
|
||||
@ -161,6 +169,9 @@ R_IPI int mips_assemble(const char *str, ut64 pc, ut8 *out) {
|
||||
snprintf (opstr, sizeof (opstr), "jalr ra ra %s", arg + 1);
|
||||
free (s);
|
||||
s = strdup (opstr);
|
||||
if (!s) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -184,52 +195,113 @@ R_IPI int mips_assemble(const char *str, ut64 pc, ut8 *out) {
|
||||
strcpy (w3, tmp);
|
||||
}
|
||||
switch (ops[i].type) {
|
||||
case 'R': //reg order diff per instruction 'group' - ordered to number of likelyhood to call (add > mfhi)
|
||||
case 'R': {
|
||||
// reg order diff per instruction 'group' - ordered to number of likelyhood to call (add > mfhi)
|
||||
int op = 0, rs = 0, rt = 0, rd = 0, sa = 0, fn = 0;
|
||||
bool invalid = false;
|
||||
switch (ops[i].args) {
|
||||
case 3: return mips_r (out, 0, getreg (w2), getreg (w3), getreg (w1), 0, ops[i].n); break;
|
||||
case 3:
|
||||
rs = getreg (w2);
|
||||
rt = getreg (w3);
|
||||
rd = getreg (w1);
|
||||
fn = ops[i].n;
|
||||
break;
|
||||
case -3:
|
||||
if (ops[i].n > -1) {
|
||||
return mips_r (out, 0, 0, getreg (w2), getreg (w1), getreg (w3), ops[i].n);
|
||||
break;
|
||||
rt = getreg (w2);
|
||||
rd = getreg (w1);
|
||||
sa = getreg (w3);
|
||||
fn = ops[i].n;
|
||||
} else {
|
||||
return mips_r (out, 0, getreg (w3), getreg (w2), getreg (w1), 0, (-1 * ops[i].n));
|
||||
break;
|
||||
rs = getreg (w3);
|
||||
rt = getreg (w2);
|
||||
rd = getreg (w1);
|
||||
fn = (-1 * ops[i].n);
|
||||
}
|
||||
case 2: return mips_r (out, 0, getreg (w1), getreg (w2), 0, 0, ops[i].n); break;
|
||||
case 1: return mips_r (out, 0, getreg (w1), 0, 0, 0, ops[i].n);
|
||||
case -2: return mips_r (out, 0, getreg (w2), 0, getreg (w1), 0, ops[i].n); break;
|
||||
case -1: return mips_r (out, 0, 0, 0, getreg (w1), 0, ops[i].n);
|
||||
case 0: return mips_r (out, 0, 0, 0, 0, 0, ops[i].n);
|
||||
break;
|
||||
case 2:
|
||||
rs = getreg (w1);
|
||||
rt = getreg (w2);
|
||||
fn = ops[i].n;
|
||||
break;
|
||||
case 1:
|
||||
rs = getreg (w1);
|
||||
fn = ops[i].n;
|
||||
break;
|
||||
case -2:
|
||||
rs = getreg (w2);
|
||||
rd = getreg (w1);
|
||||
fn = ops[i].n;
|
||||
break;
|
||||
case -1:
|
||||
rd = getreg (w1);
|
||||
fn = ops[i].n;
|
||||
break;
|
||||
case 0:
|
||||
fn = ops[i].n;
|
||||
break;
|
||||
default:
|
||||
invalid = true;
|
||||
break;
|
||||
}
|
||||
if (!invalid) {
|
||||
free (s);
|
||||
return mips_r (out, op, rs, rt, rd, sa, fn);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'I':
|
||||
case 'B':
|
||||
is_branch = ops[i].type == 'B';
|
||||
case 'B': {
|
||||
bool invalid = false;
|
||||
int op = 0, rs = 0, rt = 0, imm = 0, is_branch = ops[i].type == 'B';
|
||||
switch (ops[i].args) {
|
||||
case 2: return mips_i (out, ops[i].n, 0, getreg (w1), getreg (w2), is_branch); break;
|
||||
case 3: return mips_i (out, ops[i].n, getreg (w2), getreg (w1), getreg (w3), is_branch); break;
|
||||
case 2:
|
||||
op = ops[i].n;
|
||||
rt = getreg (w1);
|
||||
imm = getreg (w2);
|
||||
break;
|
||||
case 3:
|
||||
op = ops[i].n;
|
||||
rs = getreg (w2);
|
||||
rt = getreg (w1);
|
||||
imm = getreg (w3);
|
||||
break;
|
||||
case -2:
|
||||
if (ops[i].n > 0) {
|
||||
return mips_i (out, ops[i].n, getreg (w1), 0, getreg (w2), is_branch);
|
||||
break;
|
||||
op = ops[i].n;
|
||||
rs = getreg (w1);
|
||||
imm = getreg (w2);
|
||||
} else {
|
||||
return mips_i (out, (-1 * ops[i].n), getreg (w1), ops[i].x, getreg (w2), is_branch);
|
||||
break;
|
||||
op = (-1 * ops[i].n);
|
||||
rs = getreg (w1);
|
||||
rt = ops[i].x;
|
||||
imm = getreg (w2);
|
||||
}
|
||||
|
||||
break;
|
||||
case -1:
|
||||
if (ops[i].n > 0) {
|
||||
return mips_i (out, ops[i].n, 0, 0, getreg (w1), is_branch);
|
||||
break;
|
||||
op = ops[i].n;
|
||||
imm = getreg (w1);
|
||||
} else {
|
||||
return mips_i (out, (-1 * ops[i].n), 0, ops[i].x, getreg (w1), is_branch);
|
||||
break;
|
||||
op = (-1 * ops[i].n);
|
||||
rt = ops[i].x;
|
||||
imm = getreg (w1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
invalid = true;
|
||||
break;
|
||||
}
|
||||
if (!invalid) {
|
||||
free (s);
|
||||
return mips_i (out, op, rs, rt, imm, is_branch);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'J':
|
||||
switch (ops[i].args) {
|
||||
case 1: return mips_j (out, ops[i].n, getreg (w1)); break;
|
||||
if (ops[i].args == 1) {
|
||||
free (s);
|
||||
return mips_j (out, ops[i].n, getreg (w1));
|
||||
}
|
||||
break;
|
||||
case 'N': // nop
|
||||
|
@ -295,6 +295,10 @@ static char *gdb_to_r2_profile(const char *gdb) {
|
||||
}
|
||||
if ((ptr1 = strchr (ptr, '\n'))) {
|
||||
*ptr1 = '\0';
|
||||
} else {
|
||||
eprintf ("Could not parse line: %s (missing \\n)\n", ptr);
|
||||
r_strbuf_free (sb);
|
||||
return false;
|
||||
}
|
||||
ret = sscanf (ptr, " %s %d %d %d %d %s %s", name, &number, &rel,
|
||||
&offset, &size, type, groups);
|
||||
@ -302,6 +306,7 @@ static char *gdb_to_r2_profile(const char *gdb) {
|
||||
if (ret < 6) {
|
||||
if (*ptr != '*') {
|
||||
eprintf ("Could not parse line: %s\n", ptr);
|
||||
r_strbuf_free (sb);
|
||||
return false;
|
||||
}
|
||||
ptr = ptr1 + 1;
|
||||
|
@ -533,6 +533,7 @@ R_API RDiffChar *r_diffchar_new(const ut8 *a, const ut8 *b) {
|
||||
free (align_table);
|
||||
free (align_a);
|
||||
free (align_b);
|
||||
free (diffchar);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user