Fix typedb reload (#3931)
* Fix typedb reload * Fix `rz_analysis_set_cpu` * Add test
This commit is contained in:
parent
77778e9311
commit
cfb1679b21
3 changed files with 94 additions and 3 deletions
|
|
@ -317,6 +317,9 @@ RZ_API int rz_analysis_get_address_bits(RzAnalysis *analysis) {
|
|||
}
|
||||
|
||||
RZ_API void rz_analysis_set_cpu(RzAnalysis *analysis, const char *cpu) {
|
||||
if (RZ_STR_EQ(cpu, analysis->cpu)) {
|
||||
return;
|
||||
}
|
||||
free(analysis->cpu);
|
||||
analysis->cpu = cpu ? strdup(cpu) : NULL;
|
||||
int v = rz_analysis_archinfo(analysis, RZ_ANALYSIS_ARCHINFO_TEXT_ALIGN);
|
||||
|
|
|
|||
|
|
@ -1700,11 +1700,23 @@ RZ_API void rz_analysis_dwarf_preprocess_info(
|
|||
b = temp; \
|
||||
} while (0)
|
||||
|
||||
static inline void update_base_type(const RzTypeDB *typedb, RzBaseType *type) {
|
||||
RzBaseType *t = rz_type_db_get_base_type(typedb, type->name);
|
||||
if (t && t == type) {
|
||||
return;
|
||||
}
|
||||
rz_type_db_update_base_type(typedb, rz_base_type_clone(type));
|
||||
}
|
||||
|
||||
static void db_save_renamed(RzTypeDB *db, RzBaseType *b, char *name) {
|
||||
if (!name) {
|
||||
rz_warn_if_reached();
|
||||
return;
|
||||
}
|
||||
RzBaseType *t = rz_type_db_get_base_type(db, b->name);
|
||||
if (t == b) {
|
||||
return;
|
||||
}
|
||||
free(b->name);
|
||||
b->name = name;
|
||||
rz_type_db_update_base_type(db, b);
|
||||
|
|
@ -1719,7 +1731,7 @@ static bool store_base_type(void *u, const void *k, const void *v) {
|
|||
RZ_LOG_WARN("BaseType %s has nothing", name);
|
||||
} else if (len == 1) {
|
||||
RzBaseType *t = rz_pvector_head(types);
|
||||
rz_type_db_update_base_type(analysis->typedb, rz_base_type_clone(t));
|
||||
update_base_type(analysis->typedb, t);
|
||||
} else if (len == 2) {
|
||||
RzBaseType *a = rz_pvector_head(types);
|
||||
RzBaseType *b = rz_pvector_tail(types);
|
||||
|
|
@ -1727,7 +1739,7 @@ static bool store_base_type(void *u, const void *k, const void *v) {
|
|||
SWAP(RzBaseType *, a, b);
|
||||
}
|
||||
if (a->kind != RZ_BASE_TYPE_KIND_TYPEDEF) {
|
||||
rz_type_db_update_base_type(analysis->typedb, rz_base_type_clone(a));
|
||||
update_base_type(analysis->typedb, a);
|
||||
db_save_renamed(analysis->typedb, rz_base_type_clone(b), rz_str_newf("%s_0", name));
|
||||
goto beach;
|
||||
}
|
||||
|
|
@ -1743,7 +1755,7 @@ static bool store_base_type(void *u, const void *k, const void *v) {
|
|||
free(a->type->identifier.name);
|
||||
char *newname = rz_str_newf("%s_0", name);
|
||||
a->type->identifier.name = rz_str_new(newname);
|
||||
rz_type_db_update_base_type(analysis->typedb, rz_base_type_clone(a));
|
||||
update_base_type(analysis->typedb, a);
|
||||
|
||||
db_save_renamed(analysis->typedb, rz_base_type_clone(b), newname);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -6496,3 +6496,79 @@ standard_opcode_lengths[DW_LNS_set_isa] = 1
|
|||
0x0000026c - 0 0
|
||||
EOF
|
||||
RUN
|
||||
|
||||
NAME="ARM types"
|
||||
FILE=
|
||||
CMDS=<<EOF
|
||||
e asm.cpu=cortexm
|
||||
o bins/elf/test_app2/test_app2.elf
|
||||
aaa
|
||||
afv @ dbg.main
|
||||
pdf @ dbg.new_some
|
||||
aaa
|
||||
EOF
|
||||
EXPECT=<<EOF
|
||||
var int16_t var_38h @ stack - 0x38
|
||||
var int16_t var_34h @ stack - 0x34
|
||||
var int16_t var_30h @ stack - 0x30
|
||||
var int16_t var_2ch @ stack - 0x2c
|
||||
var int16_t var_1ch @ stack - 0x1c
|
||||
var some_t *s @ stack - 0x1a
|
||||
arg int argc @ r0
|
||||
arg char **argv @ r1
|
||||
var struct Some *gg @ r2
|
||||
var float a @ ...
|
||||
var float b @ ...
|
||||
var double c @ ...
|
||||
; CALL XREFS from dbg.main @ 0x817c, 0x8184
|
||||
;-- new_some:
|
||||
/ some_t * new_some()
|
||||
| ; var struct Some *n @ r4
|
||||
| 0x0000813c push {r4, lr} ; some_t * new_some()
|
||||
| 0x0000813e movs r0, 0x14 ; size_t size
|
||||
| 0x00008140 bl sym.malloc ; void *malloc(size_t size)
|
||||
| 0x00008144 mov r4, r0
|
||||
| 0x00008146 movs r2, 0x14 ; size_t n
|
||||
| 0x00008148 movs r1, 0 ; int c
|
||||
| 0x0000814a bl sym.memset ; void *memset(void *s, int c, size_t n)
|
||||
| 0x0000814e mov r0, r4
|
||||
\ 0x00008150 pop {r4, pc}
|
||||
EOF
|
||||
RUN
|
||||
|
||||
NAME="ARM types"
|
||||
FILE=bins/elf/test_app2/test_app2.elf
|
||||
CMDS=<<EOF
|
||||
aaa
|
||||
afv @ dbg.main
|
||||
pdf @ dbg.new_some
|
||||
aaa
|
||||
EOF
|
||||
EXPECT=<<EOF
|
||||
var int16_t var_38h @ stack - 0x38
|
||||
var int16_t var_34h @ stack - 0x34
|
||||
var int16_t var_30h @ stack - 0x30
|
||||
var int16_t var_2ch @ stack - 0x2c
|
||||
var int16_t var_1ch @ stack - 0x1c
|
||||
var some_t *s @ stack - 0x1a
|
||||
arg int argc @ r0
|
||||
arg char **argv @ r1
|
||||
var struct Some *gg @ r2
|
||||
var float a @ ...
|
||||
var float b @ ...
|
||||
var double c @ ...
|
||||
; CALL XREFS from dbg.main @ 0x817c, 0x8184
|
||||
;-- new_some:
|
||||
/ some_t * new_some()
|
||||
| ; var struct Some *n @ r4
|
||||
| 0x0000813c push {r4, lr} ; some_t * new_some()
|
||||
| 0x0000813e movs r0, 0x14 ; size_t size
|
||||
| 0x00008140 bl sym.malloc ; void *malloc(size_t size)
|
||||
| 0x00008144 mov r4, r0
|
||||
| 0x00008146 movs r2, 0x14 ; size_t n
|
||||
| 0x00008148 movs r1, 0 ; int c
|
||||
| 0x0000814a bl sym.memset ; void *memset(void *s, int c, size_t n)
|
||||
| 0x0000814e mov r0, r4
|
||||
\ 0x00008150 pop {r4, pc}
|
||||
EOF
|
||||
RUN
|
||||
|
|
|
|||
Loading…
Reference in a new issue