mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-26 09:06:02 +00:00
Fix spacing bugs when parsing the calling convention signatures (#17651) ##types
This commit is contained in:
parent
413437e2b6
commit
f15f1af521
@ -15,40 +15,53 @@ R_API void r_anal_cc_del(RAnal *anal, const char *name) {
|
||||
}
|
||||
}
|
||||
|
||||
R_API void r_anal_cc_set(RAnal *anal, const char *expr) {
|
||||
R_API bool r_anal_cc_set(RAnal *anal, const char *expr) {
|
||||
char *e = strdup (expr);
|
||||
char *p = strchr (e, '(');
|
||||
if (p) {
|
||||
*p++ = 0;
|
||||
if (!p) {
|
||||
free (e);
|
||||
return false;
|
||||
}
|
||||
*p++ = 0;
|
||||
char *args = strdup (p);
|
||||
r_str_trim (p);
|
||||
char *end = strchr (args, ')');
|
||||
if (end) {
|
||||
*end++ = 0;
|
||||
RList *retName = r_str_split_list (e, " ", 0);
|
||||
RList *ccArgs = r_str_split_list (args, ",", 0);
|
||||
if (r_list_length (retName) == 2) {
|
||||
const char *ret = r_list_get_n (retName, 0);
|
||||
const char *name = r_list_get_n (retName, 1);
|
||||
sdb_set (DB, name, "cc", 0);
|
||||
sdb_set (DB, sdb_fmt ("cc.%s.ret", name), ret, 0);
|
||||
RListIter *iter;
|
||||
const char *arg;
|
||||
int n = 0;
|
||||
r_list_foreach (ccArgs, iter, arg) {
|
||||
if (!strcmp (arg, "stack")) {
|
||||
sdb_set (DB, sdb_fmt ("cc.%s.argn", name), arg, 0);
|
||||
} else {
|
||||
sdb_set (DB, sdb_fmt ("cc.%s.arg%d", name, n), arg, 0);
|
||||
n++;
|
||||
}
|
||||
}
|
||||
}
|
||||
r_list_free (retName);
|
||||
r_list_free (ccArgs);
|
||||
if (!end) {
|
||||
free (args);
|
||||
free (e);
|
||||
return false;
|
||||
}
|
||||
*end++ = 0;
|
||||
r_str_trim (p);
|
||||
r_str_trim (e);
|
||||
char *ccname = strchr (e, ' ');
|
||||
if (ccname) {
|
||||
*ccname++ = 0;
|
||||
r_str_trim (ccname);
|
||||
} else {
|
||||
free (args);
|
||||
free (e);
|
||||
return false;
|
||||
}
|
||||
sdb_set (DB, ccname, "cc", 0);
|
||||
sdb_set (DB, sdb_fmt ("cc.%s.ret", ccname), e, 0);
|
||||
|
||||
RList *ccArgs = r_str_split_list (args, ",", 0);
|
||||
RListIter *iter;
|
||||
const char *arg;
|
||||
int n = 0;
|
||||
r_list_foreach (ccArgs, iter, arg) {
|
||||
if (!strcmp (arg, "stack")) {
|
||||
sdb_set (DB, sdb_fmt ("cc.%s.argn", ccname), arg, 0);
|
||||
} else {
|
||||
sdb_set (DB, sdb_fmt ("cc.%s.arg%d", ccname, n), arg, 0);
|
||||
n++;
|
||||
}
|
||||
}
|
||||
r_list_free (ccArgs);
|
||||
free (e);
|
||||
free (args);
|
||||
return true;
|
||||
}
|
||||
|
||||
R_API char *r_anal_cc_get(RAnal *anal, const char *name) {
|
||||
@ -92,7 +105,6 @@ R_API char *r_anal_cc_get(RAnal *anal, const char *name) {
|
||||
return r_strbuf_drain (sb);
|
||||
}
|
||||
|
||||
|
||||
R_API bool r_anal_cc_exist(RAnal *anal, const char *convention) {
|
||||
r_return_val_if_fail (anal && convention, false);
|
||||
const char *x = sdb_const_get (DB, convention, 0);
|
||||
|
@ -262,9 +262,12 @@ static void __core_cmd_tcc(RCore *core, const char *input) {
|
||||
break;
|
||||
case ' ':
|
||||
if (strchr (input, '(')) {
|
||||
r_anal_cc_set (core->anal, input + 1);
|
||||
if (!r_anal_cc_set (core->anal, input + 1)) {
|
||||
eprintf ("Invalid syntax in cc signature.");
|
||||
}
|
||||
} else {
|
||||
char *cc = r_anal_cc_get (core->anal, input + 1);
|
||||
const char *ccname = r_str_trim_head_ro (input + 1);
|
||||
char *cc = r_anal_cc_get (core->anal, ccname);
|
||||
if (cc) {
|
||||
r_cons_printf ("%s\n", cc);
|
||||
free (cc);
|
||||
|
@ -1786,7 +1786,7 @@ R_API R_DEPRECATE RList/*<RAnalVarField *>*/ *r_anal_function_get_var_fields(RAn
|
||||
// calling conventions API
|
||||
R_API bool r_anal_cc_exist(RAnal *anal, const char *convention);
|
||||
R_API void r_anal_cc_del(RAnal *anal, const char *name);
|
||||
R_API void r_anal_cc_set(RAnal *anal, const char *expr);
|
||||
R_API bool r_anal_cc_set(RAnal *anal, const char *expr);
|
||||
R_API char *r_anal_cc_get(RAnal *anal, const char *name);
|
||||
R_API const char *r_anal_cc_arg(RAnal *anal, const char *convention, int n);
|
||||
R_API const char *r_anal_cc_self(RAnal *anal, const char *convention);
|
||||
|
@ -25,3 +25,49 @@ tfc rax ms (rcx, rdx, r8, r9, stack);
|
||||
tfc rax swift (rdi, rsi, rdx, rcx, r8, r9, xmm0, xmm1, xmm2, xmm3, xmm4, r13, r12);
|
||||
EOF
|
||||
RUN
|
||||
|
||||
NAME=tcc
|
||||
FILE=-
|
||||
CMDS=<<EOF
|
||||
e asm.arch=x86
|
||||
e asm.bits=32
|
||||
?e 1
|
||||
"tcc eax jeje(ebx, ecx)"
|
||||
tcc jeje
|
||||
tcc- jeje
|
||||
?e 2
|
||||
"tcc eax jeje(ebx, ecx)"
|
||||
tcc jeje
|
||||
tcc- jeje
|
||||
?e 3
|
||||
"tcc eax jeje (ebx, ecx)"
|
||||
tcc jeje
|
||||
tcc- jeje
|
||||
?e 4
|
||||
"tcc eax jeje (ebx, ecx)"
|
||||
tcc jeje
|
||||
tcc- jeje
|
||||
?e 5
|
||||
"tcc eax jeje ( ebx, ecx )"
|
||||
tcc jeje
|
||||
tcc- jeje
|
||||
?e 6
|
||||
"tcc eax jeje ( ebx , ecx )"
|
||||
tcc jeje
|
||||
tcc- jeje
|
||||
EOF
|
||||
EXPECT=<<EOF
|
||||
1
|
||||
eax jeje (ebx, ecx);
|
||||
2
|
||||
eax jeje (ebx, ecx);
|
||||
3
|
||||
eax jeje (ebx, ecx);
|
||||
4
|
||||
eax jeje (ebx, ecx);
|
||||
5
|
||||
eax jeje (ebx, ecx);
|
||||
6
|
||||
eax jeje (ebx, ecx);
|
||||
EOF
|
||||
RUN
|
||||
|
Loading…
x
Reference in New Issue
Block a user