Skip to content

Commit bebdb22

Browse files
committed
fix: typedef insertion order, size and field offset calculations
1 parent 8ccee92 commit bebdb22

5 files changed

Lines changed: 14 additions & 15 deletions

File tree

‎src/db/db.c‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ void rd_i_db_load(RDContext* ctx) {
133133
// restore NORET status in KB
134134
RDTypeDef** it;
135135
vect_each(it, &ctx->typedefs) {
136+
rd_i_typedef_measure(ctx, *it);
137+
136138
if((*it)->kind == RD_TKIND_FUNC && (*it)->func_.is_noret)
137139
rd_i_kb_add_noret(ctx, (*it)->name);
138140
}

‎src/db/queries.c‎

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -756,18 +756,16 @@ void _rd_i_db_query_set_type_def(RDContext* ctx, const RDTypeDef* tdef) {
756756
if(tdef->kind == RD_TKIND_PRIM) return;
757757

758758
sqlite3_stmt* stmt = _rd_db_prepare_query(ctx, RD_QUERY_SET_TYPE_DEF, "\
759-
INSERT INTO TypeDefs \
760-
VALUES (:name, :kind, :size, :is_noret, :enum_type) \
761-
ON CONFLICT DO \
759+
INSERT INTO TypeDefs (name, kind, is_noret, enum_type) \
760+
VALUES (:name, :kind, :is_noret, :enum_type) \
761+
ON CONFLICT(name) DO \
762762
UPDATE SET kind = EXCLUDED.kind, \
763-
size = EXCLUDED.size, \
764763
is_noret = EXCLUDED.is_noret, \
765764
enum_type = EXCLUDED.enum_type \
766765
");
767766

768767
_rd_db_bind_param_str(ctx, stmt, ":name", tdef->name);
769768
_rd_db_bind_param_int(ctx, stmt, ":kind", (sqlite3_int64)tdef->kind);
770-
_rd_db_bind_param_int(ctx, stmt, ":size", (sqlite3_int64)tdef->size);
771769

772770
if(tdef->kind == RD_TKIND_FUNC)
773771
_rd_db_bind_param_int(ctx, stmt, ":is_noret", tdef->func_.is_noret);
@@ -825,15 +823,15 @@ RDTypeDefVect* _rd_i_db_query_get_all_type_defs(RDContext* ctx,
825823
RDTypeDefVect* v) {
826824
sqlite3_stmt* stmt =
827825
_rd_db_prepare_query(ctx, RD_QUERY_GET_ALL_TYPE_DEFS, "\
828-
SELECT name, kind, size, is_noret, enum_type \
826+
SELECT name, kind, is_noret, enum_type \
829827
FROM TypeDefs \
828+
ORDER BY id \
830829
");
831830

832831
while(_rd_db_step(ctx, stmt) == SQLITE_ROW) {
833832
const char* name = (const char*)sqlite3_column_text(stmt, 0);
834833
RDTypeKind kind = (RDTypeKind)sqlite3_column_int(stmt, 1);
835-
usize size = (usize)sqlite3_column_int64(stmt, 2);
836-
bool is_noret = (bool)sqlite3_column_int(stmt, 3);
834+
bool is_noret = (bool)sqlite3_column_int(stmt, 2);
837835
const char* enum_type = (const char*)sqlite3_column_text(stmt, 4);
838836

839837
sqlite3_stmt* stmt_param = _rd_db_prepare_get_all_type_param(ctx, name);
@@ -853,7 +851,6 @@ RDTypeDefVect* _rd_i_db_query_get_all_type_defs(RDContext* ctx,
853851
unreachable();
854852

855853
assert(tdef);
856-
tdef->size = size;
857854

858855
while(_rd_db_step(ctx, stmt_param) == SQLITE_ROW) {
859856
// clang-format off

‎src/db/schema.c‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ CREATE TABLE IF NOT EXISTS XRefs ( \
3232
); \
3333
\
3434
CREATE TABLE IF NOT EXISTS TypeDefs( \
35-
name TEXT PRIMARY KEY, \
35+
id INTEGER PRIMARY KEY AUTOINCREMENT, \
36+
name TEXT UNIQUE NOT NULL, \
3637
kind INTEGER NOT NULL, \
37-
size INTEGER NOT NULL, \
3838
is_noret INTEGER NOT NULL, \
3939
enum_type TEXT \
4040
); \

‎src/types/def.c‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static RDTypeDef* _rd_typedef_create(const char* name, RDTypeKind kind,
6767
return self;
6868
}
6969

70-
static void _rd_typedef_resolve_size(const RDContext* ctx, RDTypeDef* tdef) {
70+
void rd_i_typedef_measure(const RDContext* ctx, RDTypeDef* tdef) {
7171
if(tdef->size > 0) return;
7272

7373
switch(tdef->kind) {
@@ -317,15 +317,15 @@ bool rd_typedef_register(RDTypeDef* self, RDContext* ctx) {
317317
if(self->kind == RD_TKIND_FUNC && self->func_.is_noret)
318318
rd_i_kb_add_noret(ctx, self->name);
319319

320+
rd_i_typedef_measure(ctx, self);
321+
320322
if(self->kind != RD_TKIND_PRIM) {
321323
rd_i_db_set_type_def(ctx, self); // don't save primitives in DB
322324

323325
RD_LOG_INFO("%s definition '%s' registered",
324326
_rd_typedef_kind_str(self->kind), self->name);
325327
}
326328

327-
_rd_typedef_resolve_size(ctx, self);
328-
329329
if(!self->size) {
330330
RD_LOG_FAIL("type '%s' has unresolved size", self->name);
331331
goto fail;

‎src/types/def.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ typedef struct RDTypeDefVect {
5555
} RDTypeDefVect;
5656

5757
void rd_i_register_primitives(RDContext* ctx);
58-
58+
void rd_i_typedef_measure(const RDContext* ctx, RDTypeDef* tdef);
5959
RDTypeDef* rd_i_typedef_find(const RDContext* ctx, const char* name);
6060

6161
static inline bool rd_i_typedef_is_compound(const RDTypeDef* self) {

0 commit comments

Comments
 (0)