Skip to content

Commit 4f0dcda

Browse files
committed
Fix warnings & improve layout of Dec_Ehdr
1 parent b29d964 commit 4f0dcda

File tree

2 files changed

+50
-30
lines changed

2 files changed

+50
-30
lines changed

include/deemon/dec.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,10 @@ typedef struct dec_rrela Dec_RRela;
194194
#define DeeDec_Ehdr_OFFSETOF__e_mach 4
195195
#define DeeDec_Ehdr_OFFSETOF__e_type 5
196196
#define DeeDec_Ehdr_OFFSETOF__e_version 6
197-
#define DeeDec_Ehdr_OFFSETOF__e_offsetof_eof 8
198-
#define DeeDec_Ehdr_OFFSETOF__e_offsetof_gchead 12
199-
#define DeeDec_Ehdr_OFFSETOF__e_offsetof_gctail 16
197+
#define DeeDec_Ehdr_OFFSETOF__e_offsetof_heap 8
198+
#define DeeDec_Ehdr_OFFSETOF__e_offsetof_eof 12
199+
#define DeeDec_Ehdr_OFFSETOF__e_offsetof_gchead 16
200+
#define DeeDec_Ehdr_OFFSETOF__e_offsetof_gctail 20
200201
#define DeeDec_Ehdr_OFFSETOF__e_typedata 24
201202
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_deemon_timestamp 24
202203
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_deemon_build_id 32
@@ -232,10 +233,11 @@ typedef struct {
232233
uint8_t e_mach; /* [AT(4-4)] Machine identification (`Dee_DEC_MACH') */
233234
uint8_t e_type; /* [AT(5-5)] EHDR type (one of `Dee_DEC_TYPE_*') */
234235
uint16_t e_version; /* [AT(6-7)] DEC version number (One of `DVERSION_*') -- NOTE: __MUST__ remain at this specific offset for backwards compatibility! */
236+
uint16_t e_offsetof_heap; /* Offset from start of this struct to `e_heap' (== `DeeDec_Ehdr_OFFSETOF__e_heap') */
237+
uint16_t _e_unused_zero; /* Unused; must be set to `0' */
235238
Dee_dec_addr32_t e_offsetof_eof; /* [1..1] Offset to EOF of file mapping (should also equal the dec file's size) */
236239
Dee_dec_addr32_t e_offsetof_gchead; /* [0..1] Offset to first `struct gc_head_link' (tracking for these objects must begin after relocations were done) */
237240
Dee_dec_addr32_t e_offsetof_gctail; /* [0..1] Offset to last `struct gc_head_link' (links between these objects were already established via `e_offsetof_srel') */
238-
Dee_dec_addr32_t _e_pad; /* Unused / padding (to get "e_typedata" offset to 32, which is 16-byte aligned) */
239241
union {
240242

241243
struct {

src/deemon/execute/dec.c

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ ASSERT_FIELD(Dec_Ehdr, e_ident, DeeDec_Ehdr_OFFSETOF__e_ident, 4);
6262
ASSERT_FIELD(Dec_Ehdr, e_mach, DeeDec_Ehdr_OFFSETOF__e_mach, 1);
6363
ASSERT_FIELD(Dec_Ehdr, e_type, DeeDec_Ehdr_OFFSETOF__e_type, 1);
6464
ASSERT_FIELD(Dec_Ehdr, e_version, DeeDec_Ehdr_OFFSETOF__e_version, 2);
65+
ASSERT_FIELD(Dec_Ehdr, e_offsetof_heap, DeeDec_Ehdr_OFFSETOF__e_offsetof_heap, 2);
6566
ASSERT_FIELD(Dec_Ehdr, e_offsetof_eof, DeeDec_Ehdr_OFFSETOF__e_offsetof_eof, 4);
6667
ASSERT_FIELD(Dec_Ehdr, e_offsetof_gchead, DeeDec_Ehdr_OFFSETOF__e_offsetof_gchead, 4);
6768
ASSERT_FIELD(Dec_Ehdr, e_offsetof_gctail, DeeDec_Ehdr_OFFSETOF__e_offsetof_gctail, 4);
@@ -706,6 +707,10 @@ DeeDec_OpenFile(/*inherit(on_success)*/ struct DeeMapFile *__restrict fmap,
706707
goto_fail("Bad 'e_type'");
707708
if unlikely(ehdr->e_version != DVERSION_CUR)
708709
goto_fail("Bad 'e_version'");
710+
if unlikely(ehdr->e_offsetof_heap != offsetof(Dec_Ehdr, e_heap))
711+
goto_fail("Bad 'e_offsetof_heap'");
712+
if unlikely(ehdr->_e_unused_zero != 0)
713+
goto_fail("Bad '_e_unused_zero'");
709714
if unlikely(ehdr->e_offsetof_eof != DeeMapFile_GetSize(fmap))
710715
goto_fail("Bad 'e_offsetof_eof' does not match size of file");
711716
if unlikely(ehdr->e_offsetof_eof > DFILE_LIMIT)
@@ -834,7 +839,8 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
834839
ehdr->e_version = DVERSION_CUR;
835840
ehdr->e_offsetof_gchead = self->dw_gchead;
836841
ehdr->e_offsetof_gctail = self->dw_gctail;
837-
ehdr->_e_pad = 0;
842+
ehdr->e_offsetof_heap = offsetof(Dec_Ehdr, e_heap);
843+
ehdr->_e_unused_zero = 0;
838844

839845
/* Space for the heap tail is always pre-allocated! */
840846
{
@@ -849,7 +855,7 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
849855

850856
/* Calculate the total needed buffer size. */
851857
total_need = seraddr32(self->dw_used);
852-
total_need += sizeof(struct Dee_heaptail); /* Heap tail */
858+
total_need += (Dee_dec_addr32_t)sizeof(struct Dee_heaptail); /* Heap tail */
853859

854860
#ifndef CONFIG_NO_DEC
855861
if (!(flags & DeeModule_IMPORT_F_NOGDEC) && !(self->dw_flags & DeeDecWriter_F_NRELOC)) {
@@ -869,38 +875,42 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
869875
/* Module dependency tables. */
870876
if (self->dw_deps.ddpt_depc) {
871877
ehdr->e_typedata.td_reloc.er_offsetof_deps = total_need;
872-
total_need += self->dw_deps.ddpt_depc * sizeof(Dec_Dhdr);
878+
total_need += seraddr32(self->dw_deps.ddpt_depc * sizeof(Dec_Dhdr));
873879
/* Add space for "terminated by a d_modspec.d_mod==NULL-entry" */
874-
total_need += offsetafter(Dec_Dhdr, d_modspec.d_mod);
880+
total_need += (Dee_dec_addr32_t)offsetafter(Dec_Dhdr, d_modspec.d_mod);
875881
} else {
876882
ehdr->e_typedata.td_reloc.er_offsetof_deps = addrof_zero - offsetof(Dec_Dhdr, d_modspec.d_mod);
877883
}
878884

879885
/* Relocations against self. */
880886
if (self->dw_srel.drlt_relc) {
881887
ehdr->e_typedata.td_reloc.er_offsetof_srel = total_need;
882-
total_need += (self->dw_srel.drlt_relc * sizeof(Dec_Rel)) + offsetafter(Dec_Rel, r_addr);
888+
total_need += seraddr32(self->dw_srel.drlt_relc * sizeof(Dec_Rel));
889+
total_need += (Dee_dec_addr32_t)offsetafter(Dec_Rel, r_addr);
883890
} else {
884891
ehdr->e_typedata.td_reloc.er_offsetof_srel = addrof_zero;
885892
}
886893

887894
/* Relocations against deemon. */
888895
if (self->dw_drel.drlt_relc) {
889896
ehdr->e_typedata.td_reloc.er_offsetof_drel = total_need;
890-
total_need += (self->dw_drel.drlt_relc * sizeof(Dec_Rel)) + offsetafter(Dec_Rel, r_addr);
897+
total_need += seraddr32(self->dw_drel.drlt_relc * sizeof(Dec_Rel));
898+
total_need += (Dee_dec_addr32_t)offsetafter(Dec_Rel, r_addr);
891899
} else {
892900
ehdr->e_typedata.td_reloc.er_offsetof_drel = addrof_zero;
893901
}
894902
if (self->dw_drrel.drrt_relc) {
895903
ehdr->e_typedata.td_reloc.er_offsetof_drrel = total_need;
896-
total_need += (self->dw_drrel.drrt_relc * sizeof(Dec_RRel)) + offsetafter(Dec_RRel, r_addr);
904+
total_need += seraddr32(self->dw_drrel.drrt_relc * sizeof(Dec_RRel));
905+
total_need += (Dee_dec_addr32_t)offsetafter(Dec_RRel, r_addr);
897906
} else {
898907
ehdr->e_typedata.td_reloc.er_offsetof_drrel = addrof_zero;
899908
}
900909
ASSERTF(!self->dw_drrela_miss, "This should have been handled by 'DeeDecWriter_F_NRELOC' being checked above!");
901910
if (self->dw_drrela.drat_relc) {
902911
ehdr->e_typedata.td_reloc.er_offsetof_drrela = total_need;
903-
total_need += (self->dw_drrela.drat_relc * sizeof(Dec_RRela)) + offsetafter(Dec_RRela, r_addr);
912+
total_need += seraddr32(self->dw_drrela.drat_relc * sizeof(Dec_RRela));
913+
total_need += (Dee_dec_addr32_t)offsetafter(Dec_RRela, r_addr);
904914
} else {
905915
ehdr->e_typedata.td_reloc.er_offsetof_drrela = addrof_zero;
906916
}
@@ -909,12 +919,17 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
909919
addrof_modrel = total_need;
910920
for (i = 0; i < self->dw_deps.ddpt_depc; ++i) {
911921
struct Dee_dec_depmod *dep = &self->dw_deps.ddpt_depv[i];
912-
if (dep->ddm_rel.drlt_relc)
913-
total_need += (dep->ddm_rel.drlt_relc * sizeof(Dec_Rel)) + offsetafter(Dec_Rel, r_addr);
914-
if (dep->ddm_rrel.drrt_relc)
915-
total_need += (dep->ddm_rrel.drrt_relc * sizeof(Dec_RRel)) + offsetafter(Dec_RRel, r_addr);
922+
if (dep->ddm_rel.drlt_relc) {
923+
total_need += seraddr32(dep->ddm_rel.drlt_relc * sizeof(Dec_Rel));
924+
total_need += (Dee_dec_addr32_t)offsetafter(Dec_Rel, r_addr);
925+
}
926+
if (dep->ddm_rrel.drrt_relc) {
927+
total_need += seraddr32(dep->ddm_rrel.drrt_relc * sizeof(Dec_RRel));
928+
total_need += (Dee_dec_addr32_t)offsetafter(Dec_RRel, r_addr);
929+
}
916930
if (dep->ddm_rrela.drat_relc)
917-
total_need += (dep->ddm_rrela.drat_relc * sizeof(Dec_RRela)) + offsetafter(Dec_RRela, r_addr);
931+
total_need += seraddr32(dep->ddm_rrela.drat_relc * sizeof(Dec_RRela));
932+
total_need += (Dee_dec_addr32_t)offsetafter(Dec_RRela, r_addr);
918933
}
919934

920935
/* String tables */
@@ -924,20 +939,20 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
924939
char const *impstr_utf8;
925940
ASSERT(dep->ddm_impstr);
926941
total_need = CEIL_ALIGN(total_need, __ALIGNOF_SIZE_T__);
927-
total_need += offsetof(Dec_Dstr, ds_string);
942+
total_need += (Dee_dec_addr32_t)offsetof(Dec_Dstr, ds_string);
928943
impstr_utf8 = DeeString_AsUtf8((DeeObject *)dep->ddm_impstr);
929944
if unlikely(!impstr_utf8)
930945
goto err;
931-
total_need += (WSTR_LENGTH(impstr_utf8) + 1) * sizeof(char);
946+
total_need += seraddr32((WSTR_LENGTH(impstr_utf8) + 1) * sizeof(char));
932947
}
933948

934949
/* Additional file dependencies */
935950
if (self->dw_fdeps.dfdt_depc) {
936951
total_need = CEIL_ALIGN(total_need, __ALIGNOF_SIZE_T__);
937952
ehdr->e_typedata.td_reloc.er_offsetof_files = total_need;
938-
total_need += self->dw_fdeps.dfdt_depc;
953+
total_need += seraddr32(self->dw_fdeps.dfdt_depc);
939954
total_need = CEIL_ALIGN(total_need, __ALIGNOF_SIZE_T__);
940-
total_need += offsetafter(Dec_Dstr, ds_length); /* For trailing 0 */
955+
total_need += (Dee_dec_addr32_t)offsetafter(Dec_Dstr, ds_length); /* For trailing 0 */
941956
} else {
942957
ehdr->e_typedata.td_reloc.er_offsetof_files = 0;
943958
}
@@ -971,7 +986,8 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
971986
dep->ddm_rel.drlt_relc,
972987
sizeof(Dec_Rel));
973988
out_rel->r_addr = 0;
974-
addrof_outrel += (dep->ddm_rel.drlt_relc * sizeof(Dec_Rel)) + offsetafter(Dec_Rel, r_addr);
989+
addrof_outrel += seraddr32(dep->ddm_rel.drlt_relc * sizeof(Dec_Rel));
990+
addrof_outrel += (Dee_dec_addr32_t)offsetafter(Dec_Rel, r_addr);
975991
} else {
976992
out_deps->d_modspec.d_file.d_offsetof_rel = addrof_zero;
977993
}
@@ -984,7 +1000,8 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
9841000
dep->ddm_rrel.drrt_relc,
9851001
sizeof(Dec_RRel));
9861002
out_rel->r_addr = 0;
987-
addrof_outrel += (dep->ddm_rrel.drrt_relc * sizeof(Dec_RRel)) + offsetafter(Dec_RRel, r_addr);
1003+
addrof_outrel += seraddr32(dep->ddm_rrel.drrt_relc * sizeof(Dec_RRel));
1004+
addrof_outrel += (Dee_dec_addr32_t)offsetafter(Dec_RRel, r_addr);
9881005
} else {
9891006
out_deps->d_offsetof_rrel = addrof_zero;
9901007
}
@@ -997,7 +1014,8 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
9971014
dep->ddm_rrela.drat_relc,
9981015
sizeof(Dec_RRela));
9991016
out_rel->r_addr = 0;
1000-
addrof_outrel += (dep->ddm_rrela.drat_relc * sizeof(Dec_RRela)) + offsetafter(Dec_RRela, r_addr);
1017+
addrof_outrel += seraddr32(dep->ddm_rrela.drat_relc * sizeof(Dec_RRela));
1018+
addrof_outrel += (Dee_dec_addr32_t)offsetafter(Dec_RRela, r_addr);
10011019
} else {
10021020
out_deps->d_offsetof_rrela = addrof_zero;
10031021
}
@@ -1007,7 +1025,7 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
10071025
ASSERTF(impstr_utf8, "Should have been pre-loaded since was needed to calc buffer size");
10081026
addrof_outname = CEIL_ALIGN(addrof_outname, __ALIGNOF_SIZE_T__);
10091027
out_name = (Dec_Dstr *)((byte_t *)ehdr + addrof_outname);
1010-
out_name->ds_length = WSTR_LENGTH(impstr_utf8);
1028+
out_name->ds_length = seraddr32(WSTR_LENGTH(impstr_utf8));
10111029
*(char *)mempcpyc(out_name->ds_string, impstr_utf8, out_name->ds_length, sizeof(char)) = '\0';
10121030
out_deps->d_modspec.d_file.d_offsetof_modname = addrof_outname;
10131031
addrof_outname += offsetof(Dec_Dstr, ds_string);
@@ -1536,19 +1554,19 @@ decwriter_gcobject_malloc_impl(DeeDecWriter *__restrict self, size_t num_bytes,
15361554
if (self->dw_gctail == 0) {
15371555
/* First GC object... */
15381556
struct gc_head_link *link;
1539-
self->dw_gchead = result;
1557+
self->dw_gchead = seraddr32(result);
15401558
link = DeeDecWriter_Addr2Mem(self, result, struct gc_head_link);
15411559
link->gc_next = NULL;
15421560
link->gc_pself = NULL;
15431561
} else {
15441562
/* Append to end of GC list. */
1545-
if (decwriter_putaddr(self, self->dw_gctail + offsetof(struct gc_head_link, gc_next), result))
1563+
if (decwriter_putaddr(self, self->dw_gctail + (Dee_dec_addr32_t)offsetof(struct gc_head_link, gc_next), result))
15461564
goto err_r;
1547-
if (decwriter_putaddr(self, result + offsetof(struct gc_head_link, gc_pself),
1548-
self->dw_gctail + offsetof(struct gc_head_link, gc_next)))
1565+
if (decwriter_putaddr(self, result + (Dee_dec_addr32_t)offsetof(struct gc_head_link, gc_pself),
1566+
self->dw_gctail + (Dee_dec_addr32_t)offsetof(struct gc_head_link, gc_next)))
15491567
goto err_r;
15501568
}
1551-
self->dw_gctail = result;
1569+
self->dw_gctail = seraddr32(result);
15521570

15531571
/* Initialize "ob_refcnt" and "ob_type" of the newly allocated object */
15541572
copy = DeeDecWriter_Addr2Mem(self, result, struct gc_head);

0 commit comments

Comments
 (0)