Re-configure the new pass system

This commit is contained in:
gingerBill
2023-09-21 10:54:02 +01:00
parent bc401fa392
commit 7a511308ef
2 changed files with 35 additions and 18 deletions
+8
View File
@@ -314,6 +314,14 @@ gb_internal void array_add(Array<T> *array, T const &t) {
array->count++; array->count++;
} }
gb_internal void array_add(Array<char const *> *array, char const *t) {
if (array->capacity < array->count+1) {
array__grow(array, 0);
}
array->data[array->count] = t;
array->count++;
}
template <typename T> template <typename T>
gb_internal T *array_add_and_get(Array<T> *array) { gb_internal T *array_add_and_get(Array<T> *array) {
if (array->count < array->capacity) { if (array->count < array->capacity) {
+27 -18
View File
@@ -1453,19 +1453,20 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) {
lb_populate_module_pass_manager(wd->target_machine, module_pass_manager, build_context.optimization_level); lb_populate_module_pass_manager(wd->target_machine, module_pass_manager, build_context.optimization_level);
LLVMRunPassManager(module_pass_manager, wd->m->mod); LLVMRunPassManager(module_pass_manager, wd->m->mod);
#if LB_USE_NEW_PASS_SYSTEM #if LB_USE_NEW_PASS_SYSTEM
if (build_context.optimization_level == -1) { auto passes = array_make<char const *>(heap_allocator(), 0, 64);
// don't do any passes defer (array_free(&passes));
return 0;
}
LLVMPassBuilderOptionsRef pb_options = LLVMCreatePassBuilderOptions(); LLVMPassBuilderOptionsRef pb_options = LLVMCreatePassBuilderOptions();
defer (LLVMDisposePassBuilderOptions(pb_options)); defer (LLVMDisposePassBuilderOptions(pb_options));
LLVMPassBuilderOptionsSetVerifyEach(pb_options, true); LLVMPassBuilderOptionsSetVerifyEach(pb_options, true);
int inline_threshold = 0; // int inline_threshold = 0;
LLVMPassBuilderOptionsSetInlinerThreshold(pb_options, inline_threshold); // LLVMPassBuilderOptionsSetInlinerThreshold(pb_options, inline_threshold);
if (build_context.optimization_level >= 2) { if (build_context.optimization_level >= 2) {
LLVMPassBuilderOptionsSetLoopVectorization(pb_options, true); LLVMPassBuilderOptionsSetLoopVectorization(pb_options, true);
@@ -1473,21 +1474,20 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) {
LLVMPassBuilderOptionsSetMergeFunctions (pb_options, true); LLVMPassBuilderOptionsSetMergeFunctions (pb_options, true);
} }
gbString passes = gb_string_make_reserve(heap_allocator(), 1024);
defer (gb_string_free(passes));
switch (build_context.optimization_level) { switch (build_context.optimization_level) {
case 0: default: case -1:
passes = gb_string_appendc(passes, "default<O0>"); break;
case 0:
array_add(&passes, "default<O0>");
break; break;
case 1: case 1:
passes = gb_string_appendc(passes, "default<Os>"); array_add(&passes, "default<Os>");
break; break;
case 2: case 2:
passes = gb_string_appendc(passes, "default<O2>"); array_add(&passes, "default<O2>");
break; break;
case 3: case 3:
passes = gb_string_appendc(passes, "default<O3>"); array_add(&passes, "default<O3>");
break; break;
} }
@@ -1497,16 +1497,25 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) {
// ubsan - Linux, Darwin, Windows (NOT SUPPORTED WITH LLVM C-API) // ubsan - Linux, Darwin, Windows (NOT SUPPORTED WITH LLVM C-API)
if (build_context.sanitizer_flags & SanitizerFlag_Address) { if (build_context.sanitizer_flags & SanitizerFlag_Address) {
passes = gb_string_appendc(passes, ",asan"); array_add(&passes, "asan");
} }
if (build_context.sanitizer_flags & SanitizerFlag_Memory) { if (build_context.sanitizer_flags & SanitizerFlag_Memory) {
passes = gb_string_appendc(passes, ",msan"); array_add(&passes, "msan");
} }
if (build_context.sanitizer_flags & SanitizerFlag_Thread) { if (build_context.sanitizer_flags & SanitizerFlag_Thread) {
passes = gb_string_appendc(passes, ",tsan"); array_add(&passes, "tsan");
} }
LLVMErrorRef llvm_err = LLVMRunPasses(wd->m->mod, passes, wd->target_machine, pb_options); gbString passes_str = gb_string_make_reserve(heap_allocator(), 1024);
defer (gb_string_free(passes_str));
for_array(i, passes) {
if (i != 0) {
passes_str = gb_string_appendc(passes_str, ",");
}
passes_str = gb_string_appendc(passes_str, passes[i]);
}
LLVMErrorRef llvm_err = LLVMRunPasses(wd->m->mod, passes_str, wd->target_machine, pb_options);
defer (LLVMConsumeError(llvm_err)); defer (LLVMConsumeError(llvm_err));
if (llvm_err != nullptr) { if (llvm_err != nullptr) {
char *llvm_error = LLVMGetErrorMessage(llvm_err); char *llvm_error = LLVMGetErrorMessage(llvm_err);