Fix typedb reload (#3931)

* Fix typedb reload
* Fix `rz_analysis_set_cpu`
* Add test
This commit is contained in:
billow 2023-10-19 18:46:10 +08:00 committed by GitHub
parent 77778e9311
commit cfb1679b21
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 94 additions and 3 deletions

View file

@ -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);

View file

@ -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 {

View file

@ -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