mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-02 12:48:14 +00:00
Re-configure the new pass system
This commit is contained in:
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user