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