21#define EMIT_DEFAULT_SECTION_CAPACITY 4096
22#define EMIT_SECTION_GROWTH_FACTOR 2
75 section->
name = strdup(name);
76 section->
flags = flags;
95 if (strcmp(sec->name, name) == 0)
105 if (strcmp(sym->name, name) == 0)
158 if (!ctx || !section_name) {
192 sym->
name = strdup(name);
218 sym->
name = strdup(name);
244 if (needed <= ctx->current_section->capacity)
248 while (new_capacity < needed)
287 uint8_t bytes[2] = {(uint8_t)(value & 0xFF), (uint8_t)((value >> 8) & 0xFF)};
292 uint8_t bytes[4] = {(uint8_t)(value & 0xFF),
293 (uint8_t)((value >> 8) & 0xFF),
294 (uint8_t)((value >> 16) & 0xFF),
295 (uint8_t)((value >> 24) & 0xFF)};
300 uint8_t bytes[8] = {(uint8_t)(value & 0xFF),
301 (uint8_t)((value >> 8) & 0xFF),
302 (uint8_t)((value >> 16) & 0xFF),
303 (uint8_t)((value >> 24) & 0xFF),
304 (uint8_t)((value >> 32) & 0xFF),
305 (uint8_t)((value >> 40) & 0xFF),
306 (uint8_t)((value >> 48) & 0xFF),
307 (uint8_t)((value >> 56) & 0xFF)};
320 uint64_t aligned = (current + alignment - 1) & ~(alignment - 1);
321 uint64_t padding = aligned - current;
323 for (uint64_t i = 0; i < padding; i++) {
369 for (
int i = count - 1; i >= 0; i--) {
371 for (
int j = i + 1; j < count; j++)
372 offset += secs[j]->size;
374 memcpy(buffer + offset, secs[i]->data, secs[i]->size);
395 uint64_t section_offsets[32] = {0};
396 for (
int i = 0; i < count; i++) {
397 section_offsets[i] = 0;
398 for (
int j = i + 1; j < count; j++)
399 section_offsets[i] += secs[j]->size;
412 if (rel->section_name)
416 if (!reloc_sec || reloc_sec->
size == 0 || !reloc_sec->
data)
419 uint64_t target_sec_offset = 0;
420 uint64_t reloc_sec_offset = 0;
421 for (
int i = 0; i < count; i++) {
422 if (secs[i] == target_sec)
423 target_sec_offset = section_offsets[i];
424 if (secs[i] == reloc_sec)
425 reloc_sec_offset = section_offsets[i];
428 uint64_t target_addr = target_sec_offset + sym->
value;
429 uint64_t reloc_addr = reloc_sec_offset + rel->offset;
431 int64_t displacement = (int64_t)target_addr - (int64_t)(reloc_addr + rel->size);
433 if (rel->size == 4) {
434 if (rel->is_pc_relative)
435 *(int32_t *)(reloc_sec->
data + rel->offset) = (int32_t)displacement;
437 *(uint32_t *)(reloc_sec->
data + rel->offset) = (uint32_t)target_addr;
439 else if (rel->size == 8) {
440 if (rel->is_pc_relative)
441 *(int64_t *)(reloc_sec->
data + rel->offset) = displacement;
443 *(uint64_t *)(reloc_sec->
data + rel->offset) = target_addr;
454 for (uint8_t i = 0; i < size; i++) {
473 for (uint64_t i = 0; i < alignment; i++) {
480 for (uint64_t i = 0; i < alignment; i++) {
494 if (!ctx || !out_data || !out_size)
502 uint64_t total_size = 0;
504 total_size += sec->size;
506 uint8_t * buffer = malloc(total_size);
513 *out_size = total_size;
520 if (!ctx || !out_offset)
infix_status status
Definition 103_unions.c:61
Provides forward compatibility macros for C23 features.
#define c23_maybe_unused
A compatibility macro for the C23 [[maybe_unused]] attribute.
Definition compat_c23.h:156
INFIX_API infix_status emit_get_binary(const emit_context_t *ctx, const uint8_t **out_data, size_t *out_size)
Definition emit.c:492
infix_status _emit_arch_align(emit_context_t *ctx, uint64_t alignment)
Definition emit.c:470
#define EMIT_SECTION_GROWTH_FACTOR
Definition emit.c:22
INFIX_API INFIX_NODISCARD infix_status emit_emit_u32(emit_context_t *ctx, uint32_t value)
Definition emit.c:291
INFIX_API infix_status emit_emit_label(emit_context_t *ctx, const char *name)
Definition emit.c:205
INFIX_API infix_status emit_get_offset(const emit_context_t *ctx, uint64_t *out_offset)
Definition emit.c:518
infix_status _emit_resolve_relocations(emit_context_t *ctx)
Definition emit.c:380
void _emit_context_free(emit_context_t *ctx)
Definition emit.c:37
emit_symbol_t * _emit_lookup_symbol(emit_context_t *ctx, const char *name)
Definition emit.c:100
INFIX_API infix_status emit_align(emit_context_t *ctx, uint64_t alignment)
Definition emit.c:311
INFIX_API infix_status emit_define_symbol(emit_context_t *ctx, const char *name, emit_visibility_t visibility, bool is_function)
Definition emit.c:174
static infix_status _ensure_section_capacity(emit_context_t *ctx, uint64_t needed)
Definition emit.c:240
INFIX_API infix_status emit_create_label(emit_context_t *ctx, const char *name)
Definition emit.c:236
static infix_status emit_emit_bytes(emit_context_t *ctx, const void *data, size_t size)
Definition emit.c:260
INFIX_API void emit_destroy(emit_context_t *ctx)
Definition emit.c:127
void _emit_arch_nop(emit_context_t *ctx, uint8_t size)
Definition emit.c:451
static void write_raw_binary(emit_context_t *ctx, uint8_t *buffer, c23_maybe_unused uint64_t total_size)
Definition emit.c:357
INFIX_API infix_status emit_emit_u16(emit_context_t *ctx, uint16_t value)
Definition emit.c:286
INFIX_API INFIX_NODISCARD infix_status emit_add_relocation(emit_context_t *ctx, const char *name, uint64_t offset, uint8_t size, uint8_t inst_size)
Definition emit.c:333
INFIX_API infix_status emit_add_section(emit_context_t *ctx, const char *name, emit_section_flags_t flags)
Definition emit.c:132
static emit_section_t * _create_section(const char *name, emit_section_flags_t flags)
Definition emit.c:70
INFIX_API infix_status emit_create(emit_context_t **out_ctx, emit_architecture_t arch, emit_format_t format)
Definition emit.c:110
void _emit_context_init(emit_context_t *ctx, emit_architecture_t arch, emit_format_t format)
Definition emit.c:24
#define EMIT_DEFAULT_SECTION_CAPACITY
Definition emit.c:21
INFIX_API infix_status emit_begin_section(emit_context_t *ctx, const char *section_name)
Definition emit.c:156
INFIX_API INFIX_NODISCARD infix_status emit_emit_u8(emit_context_t *ctx, uint8_t byte)
Definition emit.c:282
emit_section_t * _emit_lookup_section(emit_context_t *ctx, const char *name)
Definition emit.c:90
INFIX_API infix_status emit_emit_u64(emit_context_t *ctx, uint64_t value)
Definition emit.c:299
Public API for the emit JIT code generation system.
emit_section_flags_t
Definition emit.h:41
emit_architecture_t
Definition emit.h:30
@ EMIT_ARCH_X86_64
Definition emit.h:31
@ EMIT_ARCH_AARCH64
Definition emit.h:32
emit_format_t
Definition emit.h:35
@ EMIT_STATE_IDLE
Definition emit.h:55
@ EMIT_STATE_SECTION_ACTIVE
Definition emit.h:56
emit_visibility_t
Definition emit.h:48
@ EMIT_VISIBILITY_DEFAULT
Definition emit.h:49
Internal structures for the emit JIT code generation system.
@ INFIX_CODE_INVALID_KEYWORD
Definition infix.h:1378
@ INFIX_CATEGORY_PARSER
Definition infix.h:1355
infix_status
Enumerates the possible status codes returned by infix API functions.
Definition infix.h:435
@ INFIX_ERROR_ALLOCATION_FAILED
Definition infix.h:437
@ INFIX_SUCCESS
Definition infix.h:436
@ INFIX_ERROR_INVALID_ARGUMENT
Definition infix.h:438
#define INFIX_NODISCARD
A compatibility macro for the C23 [[nodiscard]] attribute.
Definition infix.h:141
#define INFIX_API
Symbol visibility macro.
Definition infix.h:114
INFIX_INTERNAL void _infix_clear_error(void)
Clears the thread-local error state.
Definition error.c:268
INFIX_INTERNAL void _infix_set_error(infix_error_category_t category, infix_error_code_t code, size_t position)
Sets the thread-local error state with detailed information.
Definition error.c:175
Definition emit_internals.h:50
emit_format_t format
Definition emit_internals.h:52
emit_relocation_t * relocations
Definition emit_internals.h:57
emit_symbol_t * symbols
Definition emit_internals.h:56
emit_section_t * sections
Definition emit_internals.h:54
emit_state_t state
Definition emit_internals.h:53
int section_count
Definition emit_internals.h:60
emit_architecture_t arch
Definition emit_internals.h:51
void * binary_spec
Definition emit_internals.h:58
emit_section_t * current_section
Definition emit_internals.h:55
char * current_block_name
Definition emit_internals.h:59
Definition emit_internals.h:40
uint8_t size
Definition emit_internals.h:44
uint8_t inst_size
Definition emit_internals.h:45
char * section_name
Definition emit_internals.h:42
uint64_t offset
Definition emit_internals.h:43
struct emit_relocation * next
Definition emit_internals.h:47
char * symbol_name
Definition emit_internals.h:41
bool is_pc_relative
Definition emit_internals.h:46
Definition emit_internals.h:22
uint64_t size
Definition emit_internals.h:26
char * name
Definition emit_internals.h:23
uint8_t * data
Definition emit_internals.h:25
uint64_t capacity
Definition emit_internals.h:27
struct emit_section * next
Definition emit_internals.h:28
emit_section_flags_t flags
Definition emit_internals.h:24
Definition emit_internals.h:31
bool is_function
Definition emit_internals.h:34
bool is_defined
Definition emit_internals.h:33
uint64_t value
Definition emit_internals.h:36
struct emit_symbol * next
Definition emit_internals.h:37
emit_section_t * section
Definition emit_internals.h:35
char * name
Definition emit_internals.h:32