infix
A JIT-Powered FFI Library for C
Loading...
Searching...
No Matches
emit.c File Reference

Implementation of the emit API for generating machine code. More...

#include "emit/emit.h"
#include "common/compat_c23.h"
#include "emit_internals.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Include dependency graph for emit.c:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define INFIX_BUILDING
 
#define EMIT_DEFAULT_SECTION_CAPACITY   4096
 
#define EMIT_SECTION_GROWTH_FACTOR   2
 

Functions

void _emit_context_init (emit_context_t *ctx, emit_architecture_t arch, emit_format_t format)
 
void _emit_context_free (emit_context_t *ctx)
 
static emit_section_t_create_section (const char *name, emit_section_flags_t flags)
 
emit_section_t_emit_lookup_section (emit_context_t *ctx, const char *name)
 
emit_symbol_t_emit_lookup_symbol (emit_context_t *ctx, const char *name)
 
INFIX_API infix_status emit_create (emit_context_t **out_ctx, emit_architecture_t arch, emit_format_t format)
 
INFIX_API void emit_destroy (emit_context_t *ctx)
 
INFIX_API infix_status emit_add_section (emit_context_t *ctx, const char *name, emit_section_flags_t flags)
 
INFIX_API infix_status emit_begin_section (emit_context_t *ctx, const char *section_name)
 
INFIX_API infix_status emit_define_symbol (emit_context_t *ctx, const char *name, emit_visibility_t visibility, bool is_function)
 
INFIX_API infix_status emit_emit_label (emit_context_t *ctx, const char *name)
 
INFIX_API infix_status emit_create_label (emit_context_t *ctx, const char *name)
 
static infix_status _ensure_section_capacity (emit_context_t *ctx, uint64_t needed)
 
static infix_status emit_emit_bytes (emit_context_t *ctx, const void *data, size_t size)
 
INFIX_API INFIX_NODISCARD infix_status emit_emit_u8 (emit_context_t *ctx, uint8_t byte)
 
INFIX_API infix_status emit_emit_u16 (emit_context_t *ctx, uint16_t value)
 
INFIX_API INFIX_NODISCARD infix_status emit_emit_u32 (emit_context_t *ctx, uint32_t value)
 
INFIX_API infix_status emit_emit_u64 (emit_context_t *ctx, uint64_t value)
 
INFIX_API infix_status emit_align (emit_context_t *ctx, uint64_t alignment)
 
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)
 
static void write_raw_binary (emit_context_t *ctx, uint8_t *buffer, c23_maybe_unused uint64_t total_size)
 
infix_status _emit_resolve_relocations (emit_context_t *ctx)
 
void _emit_arch_nop (emit_context_t *ctx, uint8_t size)
 
infix_status _emit_arch_align (emit_context_t *ctx, uint64_t alignment)
 
INFIX_API infix_status emit_get_binary (const emit_context_t *ctx, const uint8_t **out_data, size_t *out_size)
 
INFIX_API infix_status emit_get_offset (const emit_context_t *ctx, uint64_t *out_offset)
 

Detailed Description

Implementation of the emit API for generating machine code.

Copyright (c) 2025 Sanko Robinson

This source code is dual-licensed under the Artistic License 2.0 or the MIT License. You may choose to use the code under the terms of either license.

SPDX-License-Identifier: (Artistic-2.0 OR MIT)

Macro Definition Documentation

◆ EMIT_DEFAULT_SECTION_CAPACITY

#define EMIT_DEFAULT_SECTION_CAPACITY   4096

◆ EMIT_SECTION_GROWTH_FACTOR

#define EMIT_SECTION_GROWTH_FACTOR   2

◆ INFIX_BUILDING

#define INFIX_BUILDING

Function Documentation

◆ _create_section()

static emit_section_t * _create_section ( const char *  name,
emit_section_flags_t  flags 
)
static

◆ _emit_arch_align()

infix_status _emit_arch_align ( emit_context_t ctx,
uint64_t  alignment 
)

◆ _emit_arch_nop()

void _emit_arch_nop ( emit_context_t ctx,
uint8_t  size 
)

◆ _emit_context_free()

void _emit_context_free ( emit_context_t ctx)

◆ _emit_context_init()

void _emit_context_init ( emit_context_t ctx,
emit_architecture_t  arch,
emit_format_t  format 
)

◆ _emit_lookup_section()

emit_section_t * _emit_lookup_section ( emit_context_t ctx,
const char *  name 
)

◆ _emit_lookup_symbol()

emit_symbol_t * _emit_lookup_symbol ( emit_context_t ctx,
const char *  name 
)

◆ _emit_resolve_relocations()

infix_status _emit_resolve_relocations ( emit_context_t ctx)

◆ _ensure_section_capacity()

static infix_status _ensure_section_capacity ( emit_context_t ctx,
uint64_t  needed 
)
static

◆ emit_add_relocation()

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 
)

◆ emit_add_section()

INFIX_API infix_status emit_add_section ( emit_context_t ctx,
const char *  name,
emit_section_flags_t  flags 
)

◆ emit_align()

INFIX_API infix_status emit_align ( emit_context_t ctx,
uint64_t  alignment 
)

◆ emit_begin_section()

INFIX_API infix_status emit_begin_section ( emit_context_t ctx,
const char *  section_name 
)

◆ emit_create()

INFIX_API infix_status emit_create ( emit_context_t **  out_ctx,
emit_architecture_t  arch,
emit_format_t  format 
)

◆ emit_create_label()

INFIX_API infix_status emit_create_label ( emit_context_t ctx,
const char *  name 
)

◆ emit_define_symbol()

INFIX_API infix_status emit_define_symbol ( emit_context_t ctx,
const char *  name,
emit_visibility_t  visibility,
bool  is_function 
)

◆ emit_destroy()

INFIX_API void emit_destroy ( emit_context_t ctx)

◆ emit_emit_bytes()

static infix_status emit_emit_bytes ( emit_context_t ctx,
const void *  data,
size_t  size 
)
static

◆ emit_emit_label()

INFIX_API infix_status emit_emit_label ( emit_context_t ctx,
const char *  name 
)

◆ emit_emit_u16()

INFIX_API infix_status emit_emit_u16 ( emit_context_t ctx,
uint16_t  value 
)

◆ emit_emit_u32()

INFIX_API INFIX_NODISCARD infix_status emit_emit_u32 ( emit_context_t ctx,
uint32_t  value 
)

◆ emit_emit_u64()

INFIX_API infix_status emit_emit_u64 ( emit_context_t ctx,
uint64_t  value 
)

◆ emit_emit_u8()

INFIX_API INFIX_NODISCARD infix_status emit_emit_u8 ( emit_context_t ctx,
uint8_t  byte 
)

◆ emit_get_binary()

INFIX_API infix_status emit_get_binary ( const emit_context_t ctx,
const uint8_t **  out_data,
size_t *  out_size 
)

◆ emit_get_offset()

INFIX_API infix_status emit_get_offset ( const emit_context_t ctx,
uint64_t *  out_offset 
)

◆ write_raw_binary()

static void write_raw_binary ( emit_context_t ctx,
uint8_t *  buffer,
c23_maybe_unused uint64_t  total_size 
)
static