kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }