Skip to content

Commit b29d964

Browse files
committed
Fix build error
1 parent e66ebc0 commit b29d964

File tree

4 files changed

+69
-21
lines changed

4 files changed

+69
-21
lines changed

include/deemon/dec.h

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,44 @@ typedef struct dec_rel Dec_Rel;
189189
typedef struct dec_rrel Dec_RRel;
190190
typedef struct dec_rrela Dec_RRela;
191191

192+
193+
#define DeeDec_Ehdr_OFFSETOF__e_ident 0
194+
#define DeeDec_Ehdr_OFFSETOF__e_mach 4
195+
#define DeeDec_Ehdr_OFFSETOF__e_type 5
196+
#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
200+
#define DeeDec_Ehdr_OFFSETOF__e_typedata 24
201+
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_deemon_timestamp 24
202+
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_deemon_build_id 32
203+
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_deemon_host_id 48
204+
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_srel 64
205+
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_drel 68
206+
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_drrel 72
207+
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_drrela 76
208+
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_deps 80
209+
#define DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_files 84
210+
#define DeeDec_Ehdr_OFFSETOF__e_mapping 88
211+
#define DeeDec_Ehdr_OFFSETOF__e_heap \
212+
(88 + Dee_SIZEOF_DeeMapFile + ((Dee_HEAPCHUNK_ALIGN - ((88 + Dee_SIZEOF_DeeMapFile) % Dee_HEAPCHUNK_ALIGN)) % Dee_HEAPCHUNK_ALIGN))
213+
#if DeeDec_Ehdr_OFFSETOF__e_heap == 128
214+
#undef DeeDec_Ehdr_OFFSETOF__e_heap
215+
#define DeeDec_Ehdr_OFFSETOF__e_heap 128
216+
#elif DeeDec_Ehdr_OFFSETOF__e_heap == 120
217+
#undef DeeDec_Ehdr_OFFSETOF__e_heap
218+
#define DeeDec_Ehdr_OFFSETOF__e_heap 120
219+
#elif DeeDec_Ehdr_OFFSETOF__e_heap == 112
220+
#undef DeeDec_Ehdr_OFFSETOF__e_heap
221+
#define DeeDec_Ehdr_OFFSETOF__e_heap 112
222+
#elif DeeDec_Ehdr_OFFSETOF__e_heap == 104
223+
#undef DeeDec_Ehdr_OFFSETOF__e_heap
224+
#define DeeDec_Ehdr_OFFSETOF__e_heap 104
225+
#elif DeeDec_Ehdr_OFFSETOF__e_heap == 96
226+
#undef DeeDec_Ehdr_OFFSETOF__e_heap
227+
#define DeeDec_Ehdr_OFFSETOF__e_heap 96
228+
#endif /* DeeDec_Ehdr_OFFSETOF__e_heap == ... */
229+
192230
typedef struct {
193231
uint8_t e_ident[DI_NIDENT]; /* [AT(0-3)] Identification bytes. (See `DI_*') */
194232
uint8_t e_mach; /* [AT(4-4)] Machine identification (`Dee_DEC_MACH') */
@@ -197,7 +235,7 @@ typedef struct {
197235
Dee_dec_addr32_t e_offsetof_eof; /* [1..1] Offset to EOF of file mapping (should also equal the dec file's size) */
198236
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) */
199237
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') */
200-
Dee_dec_addr32_t _e_pad; /* Unused / padding */
238+
Dee_dec_addr32_t _e_pad; /* Unused / padding (to get "e_typedata" offset to 32, which is 16-byte aligned) */
201239
union {
202240

203241
struct {
@@ -225,6 +263,9 @@ typedef struct {
225263

226264
} e_typedata; /* Data dependent on `e_type' */
227265
struct DeeMapFile e_mapping; /* Uninitialized/unused in file mappings; when mapped into memory, populated with the dec file's own file map descriptor. */
266+
#if ((DeeDec_Ehdr_OFFSETOF__e_mapping + Dee_SIZEOF_DeeMapFile) % Dee_HEAPCHUNK_ALIGN) != 0
267+
__BYTE_TYPE__ _e_heap_pad[Dee_HEAPCHUNK_ALIGN - ((DeeDec_Ehdr_OFFSETOF__e_mapping + Dee_SIZEOF_DeeMapFile) % Dee_HEAPCHUNK_ALIGN)];
268+
#endif /* (Dee_SIZEOF_DeeMapFile % Dee_HEAPCHUNK_ALIGN) != 0 */
228269
struct Dee_heapregion e_heap; /* Heap region descriptor for objects embedded within this dec file. The first chunk of
229270
* this heap is assumed to point at the `DeeModuleObject' describing the dec file itself. */
230271
} Dec_Ehdr;

include/deemon/heap.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,20 +104,20 @@ DECL_BEGIN
104104

105105

106106
#ifdef __CC__
107-
struct Dee_heapchunk {
107+
struct /*ATTR_ALIGNED(Dee_HEAPCHUNK_ALIGN)*/ Dee_heapchunk {
108108
size_t hc_prevsize; /* Size of previous chunk, or "0" if this is the first chunk; must be multiple of "Dee_HEAPCHUNK_ALIGN" */
109109
size_t hc_head; /* Size of this chunk (including this header), but least significant
110110
* 3 bits have special meaning and (when the chunk is allocated, which
111111
* is the only mode explicitly defined by this binary format), must be
112112
* initialized to 0b100 (aka. "4") */
113113
};
114114

115-
struct Dee_heaptail {
115+
struct /*ATTR_ALIGNED(Dee_HEAPCHUNK_ALIGN)*/ Dee_heaptail {
116116
size_t ht_lastsize; /* Size of the last *real* chunk within the region (in bytes); must be multiple of "Dee_HEAPCHUNK_ALIGN" */
117117
size_t ht_zero; /* Always zero */
118118
};
119119

120-
struct Dee_heapregion {
120+
struct /*ATTR_ALIGNED(Dee_HEAPCHUNK_ALIGN)*/ Dee_heapregion {
121121
size_t hr_size; /* [const] Total region size (in bytes, including this header, and the tail) */
122122
/* [1..1][const] Destructor invoked once the region's last chunk is Dee_Free()'d */
123123
void (DCALL *hr_destroy)(struct Dee_heapregion *__restrict self);

include/deemon/mapfile.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,13 @@ DECL_BEGIN
7373

7474
struct DeeMapFile {
7575
#ifdef DeeMapFile_IS_os_mapfile
76+
#define Dee_SIZEOF_DeeMapFile (3 * __SIZEOF_POINTER__) /* TODO: Correct, but not portable */
7677
struct mapfile dmf_map; /* Underlying mapfile */
7778
#define DeeMapFile_GetBase(self) ((void const *)(self)->dmf_map.mf_addr)
7879
#define DeeMapFile_GetSize(self) (self)->dmf_map.mf_size
7980
#define DeeMapFile_UsesMmap(self) mapfile_usesmmap(&(self)->dmf_map)
8081
#elif defined(DeeMapFile_IS_CreateFileMapping)
82+
#define Dee_SIZEOF_DeeMapFile (4 * __SIZEOF_POINTER__)
8183
void const *dmf_addr; /* [0..dmf_size][owned] Base address of the file mapping. */
8284
size_t dmf_size; /* Mapping size (in bytes, excluding trailing NUL-bytes) */
8385
void *_dmf_hmap; /* [0..1] file mapping handle */
@@ -86,13 +88,15 @@ struct DeeMapFile {
8688
#define DeeMapFile_GetSize(self) (self)->dmf_size
8789
#define DeeMapFile_UsesMmap(self) ((self)->_dmf_hmap != NULL)
8890
#elif defined(DeeMapFile_IS_mmap)
91+
#define Dee_SIZEOF_DeeMapFile (3 * __SIZEOF_POINTER__)
8992
void const *dmf_addr; /* [0..dmf_size][owned] Base address of the file mapping. */
9093
size_t dmf_size; /* Mapping size (in bytes, excluding trailing NUL-bytes) */
9194
size_t _dmf_mapsize; /* Used internally: the mmap'd file size, or `0' if `dmf_addr' was malloc'd */
9295
#define DeeMapFile_GetBase(self) (self)->dmf_addr
9396
#define DeeMapFile_GetSize(self) (self)->dmf_size
9497
#define DeeMapFile_UsesMmap(self) ((self)->_dmf_mapsize != 0)
9598
#else /* ... */
99+
#define Dee_SIZEOF_DeeMapFile (2 * __SIZEOF_POINTER__)
96100
void const *dmf_addr; /* [0..dmf_size][owned] Base address of the file mapping. */
97101
size_t dmf_size; /* Mapping size (in bytes, excluding trailing NUL-bytes) */
98102
#define DeeMapFile_GetBase(self) (self)->dmf_addr

src/deemon/execute/dec.c

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -58,23 +58,26 @@ DECL_BEGIN
5858
#define ASSERT_FIELD(T, field, offset, size) \
5959
STATIC_ASSERT(offsetof(T, field) == (offset)); \
6060
STATIC_ASSERT(sizeof(((T *)0)->field) == (size));
61-
ASSERT_FIELD(Dec_Ehdr, e_ident, 0, 4);
62-
ASSERT_FIELD(Dec_Ehdr, e_mach, 4, 1);
63-
ASSERT_FIELD(Dec_Ehdr, e_type, 5, 1);
64-
ASSERT_FIELD(Dec_Ehdr, e_version, 6, 2);
65-
ASSERT_FIELD(Dec_Ehdr, e_offsetof_eof, 8, 4);
66-
ASSERT_FIELD(Dec_Ehdr, e_offsetof_gchead, 12, 4);
67-
ASSERT_FIELD(Dec_Ehdr, e_offsetof_gctail, 16, 4);
68-
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_deemon_timestamp, 24, 8);
69-
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_deemon_build_id, 32, 16);
70-
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_deemon_host_id, 48, 16);
71-
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_srel, 64, 4);
72-
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_drel, 68, 4);
73-
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_drrel, 72, 4);
74-
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_drrela, 76, 4);
75-
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_deps, 80, 4);
76-
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_files, 84, 4);
77-
ASSERT_FIELD(Dec_Ehdr, e_typedata, 24, 64);
61+
ASSERT_FIELD(Dec_Ehdr, e_ident, DeeDec_Ehdr_OFFSETOF__e_ident, 4);
62+
ASSERT_FIELD(Dec_Ehdr, e_mach, DeeDec_Ehdr_OFFSETOF__e_mach, 1);
63+
ASSERT_FIELD(Dec_Ehdr, e_type, DeeDec_Ehdr_OFFSETOF__e_type, 1);
64+
ASSERT_FIELD(Dec_Ehdr, e_version, DeeDec_Ehdr_OFFSETOF__e_version, 2);
65+
ASSERT_FIELD(Dec_Ehdr, e_offsetof_eof, DeeDec_Ehdr_OFFSETOF__e_offsetof_eof, 4);
66+
ASSERT_FIELD(Dec_Ehdr, e_offsetof_gchead, DeeDec_Ehdr_OFFSETOF__e_offsetof_gchead, 4);
67+
ASSERT_FIELD(Dec_Ehdr, e_offsetof_gctail, DeeDec_Ehdr_OFFSETOF__e_offsetof_gctail, 4);
68+
ASSERT_FIELD(Dec_Ehdr, e_typedata, DeeDec_Ehdr_OFFSETOF__e_typedata, 64);
69+
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_deemon_timestamp, DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_deemon_timestamp, 8);
70+
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_deemon_build_id, DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_deemon_build_id, 16);
71+
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_deemon_host_id, DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_deemon_host_id, 16);
72+
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_srel, DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_srel, 4);
73+
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_drel, DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_drel, 4);
74+
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_drrel, DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_drrel, 4);
75+
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_drrela, DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_drrela, 4);
76+
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_deps, DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_deps, 4);
77+
ASSERT_FIELD(Dec_Ehdr, e_typedata.td_reloc.er_offsetof_files, DeeDec_Ehdr_OFFSETOF__e_typedata__td_reloc__er_offsetof_files, 4);
78+
ASSERT_FIELD(Dec_Ehdr, e_mapping, DeeDec_Ehdr_OFFSETOF__e_mapping, Dee_SIZEOF_DeeMapFile);
79+
ASSERT_FIELD(Dec_Ehdr, e_heap, DeeDec_Ehdr_OFFSETOF__e_heap, sizeof(struct Dee_heapregion));
80+
STATIC_ASSERT(IS_ALIGNED(DeeDec_Ehdr_OFFSETOF__e_heap, Dee_HEAPCHUNK_ALIGN));
7881

7982
ASSERT_FIELD(Dec_Rel, r_addr, 0, 4);
8083
STATIC_ASSERT(sizeof(Dec_Rel) == 4);

0 commit comments

Comments
 (0)