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 }