api_context_arena.c (2030B)
1 #include <kit/compile.h> 2 #include <kit/target.h> 3 4 typedef struct AuditArena { 5 unsigned char* data; 6 size_t capacity; 7 size_t used; 8 } AuditArena; 9 10 static void* audit_alloc(KitHeap* heap, size_t size, size_t align) { 11 AuditArena* arena = heap->user; 12 size_t mask = align - 1; 13 size_t start = (arena->used + mask) & ~mask; 14 if (size > arena->capacity - start) return NULL; 15 arena->used = start + size; 16 return arena->data + start; 17 } 18 19 static void* audit_realloc(KitHeap* heap, void* ptr, size_t old_size, 20 size_t new_size, size_t align) { 21 unsigned char* out = audit_alloc(heap, new_size, align); 22 const unsigned char* old = ptr; 23 size_t copy_size = old_size < new_size ? old_size : new_size; 24 size_t i; 25 if (!out) return NULL; 26 for (i = 0; old && i < copy_size; ++i) out[i] = old[i]; 27 return out; 28 } 29 30 static void audit_free(KitHeap* heap, void* ptr, size_t size) { 31 (void)heap; 32 (void)ptr; 33 (void)size; 34 } 35 36 static void audit_diag(KitDiagSink* sink, KitDiagKind kind, KitSrcLoc loc, 37 const char* fmt, va_list ap) { 38 (void)sink; 39 (void)kind; 40 (void)loc; 41 (void)fmt; 42 (void)ap; 43 } 44 45 int main(void) { 46 unsigned char storage[4u * 1024u * 1024u]; 47 AuditArena arena = {storage, sizeof(storage), 0}; 48 KitHeap heap = {audit_alloc, audit_realloc, audit_free, &arena}; 49 KitDiagSink diag = {audit_diag, NULL, 0, 0}; 50 KitContext context = {&heap, NULL, &diag, NULL, -1}; 51 KitTargetSpec spec; 52 KitTargetOptions options = {0}; 53 KitTarget* target = NULL; 54 KitCompiler* compiler = NULL; 55 56 if (!kit_target_from_triple("aarch64-apple-darwin", &spec)) return 10; 57 options.spec = spec; 58 if (kit_target_new(&context, &options, &target) != KIT_OK) return 11; 59 if (kit_compiler_new(target, &context, &compiler) != KIT_OK) { 60 kit_target_free(target); 61 return 12; 62 } 63 if (!kit_language_name(compiler, KIT_LANG_C)) { 64 kit_compiler_free(compiler); 65 kit_target_free(target); 66 return 13; 67 } 68 kit_compiler_free(compiler); 69 kit_target_free(target); 70 return 0; 71 }