kit

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

api_compile_session.c (3558B)


      1 #include <kit/compile.h>
      2 #include <kit/link.h>
      3 #include <kit/target.h>
      4 
      5 extern void* malloc(size_t size);
      6 extern void* realloc(void* ptr, size_t size);
      7 extern void free(void* ptr);
      8 
      9 static void* audit_alloc(KitHeap* heap, size_t size, size_t align) {
     10   (void)heap;
     11   (void)align;
     12   return malloc(size ? size : 1);
     13 }
     14 
     15 static void* audit_realloc(KitHeap* heap, void* ptr, size_t old_size,
     16                            size_t new_size, size_t align) {
     17   (void)heap;
     18   (void)old_size;
     19   (void)align;
     20   return realloc(ptr, new_size ? new_size : 1);
     21 }
     22 
     23 static void audit_free(KitHeap* heap, void* ptr, size_t size) {
     24   (void)heap;
     25   (void)size;
     26   free(ptr);
     27 }
     28 
     29 static void audit_diag(KitDiagSink* sink, KitDiagKind kind, KitSrcLoc loc,
     30                        const char* fmt, va_list ap) {
     31   (void)sink;
     32   (void)kind;
     33   (void)loc;
     34   (void)fmt;
     35   (void)ap;
     36 }
     37 
     38 static KitStatus build_answer(const KitContext* context, KitHeap* heap,
     39                               size_t* image_size) {
     40   KitTargetSpec spec;
     41   KitTargetOptions target_options = {0};
     42   KitCompileSessionOptions compile_options = {0};
     43   KitSourceInput input = {
     44       .name = KIT_SLICE_LIT("answer.c"),
     45       .bytes = KIT_SLICE_LIT("int answer(void) { return 42; }\n"),
     46       .lang = KIT_LANG_C,
     47       .input_kind = KIT_FRONTEND_INPUT_TRANSLATION_UNIT,
     48   };
     49   KitLinkSessionOptions link_options = {0};
     50   KitTarget* target = NULL;
     51   KitCompiler* compiler = NULL;
     52   KitCompileSession* session = NULL;
     53   KitObjBuilder* object = NULL;
     54   KitLinkSession* link = NULL;
     55   KitWriter* image = NULL;
     56   KitStatus status = KIT_INVALID;
     57   bool staged = false;
     58 
     59   *image_size = 0;
     60   if (!kit_target_from_triple("aarch64-none-elf", &spec)) goto done;
     61   target_options.spec = spec;
     62   status = kit_target_new(context, &target_options, &target);
     63   if (status != KIT_OK) goto done;
     64   status = kit_compiler_new(target, context, &compiler);
     65   if (status != KIT_OK) goto done;
     66 
     67   compile_options.lang = KIT_LANG_C;
     68   compile_options.compile.input_kind = KIT_FRONTEND_INPUT_TRANSLATION_UNIT;
     69   status = kit_compile_session_new(compiler, &compile_options, &session);
     70   if (status != KIT_OK) goto done;
     71   status = kit_compile_session_stage(session, &input, &object);
     72   if (status != KIT_OK) goto done;
     73   staged = true;
     74 
     75   link_options.output_kind = KIT_LINK_OUTPUT_EXE;
     76   link_options.entry = KIT_SLICE_LIT("answer");
     77   link_options.freestanding_strict = true;
     78   status = kit_link_session_new(compiler, &link_options, &link);
     79   if (status != KIT_OK) goto done;
     80   status = kit_link_session_add_obj(link, object);
     81   if (status != KIT_OK) goto done;
     82   status = kit_link_session_resolve(link);
     83   if (status != KIT_OK) goto done;
     84   status = kit_writer_mem(heap, &image);
     85   if (status != KIT_OK) goto done;
     86   status = kit_link_session_emit(link, image);
     87   if (status != KIT_OK) goto done;
     88   (void)kit_writer_mem_bytes(image, image_size);
     89 
     90   kit_compile_session_commit(session);
     91   staged = false;
     92 
     93 done:
     94   if (staged) kit_compile_session_abort(session);
     95   if (image) kit_writer_close(image);
     96   if (link) kit_link_session_free(link);
     97   if (object) kit_obj_builder_free(object);
     98   if (session) kit_compile_session_free(session);
     99   if (compiler) kit_compiler_free(compiler);
    100   if (target) kit_target_free(target);
    101   return status;
    102 }
    103 
    104 int main(void) {
    105   KitHeap heap = {audit_alloc, audit_realloc, audit_free, NULL};
    106   KitDiagSink diag = {audit_diag, NULL, 0, 0};
    107   KitContext context = {&heap, NULL, &diag, NULL, -1};
    108   size_t image_size;
    109 
    110   if (build_answer(&context, &heap, &image_size) != KIT_OK) return 1;
    111   return image_size ? 0 : 2;
    112 }