|
@@ -10167,6 +10167,33 @@ void lb_generate_code(lbGenerator *gen) {
|
|
|
|
|
|
|
|
auto *min_dep_set = &info->minimum_dependency_set;
|
|
auto *min_dep_set = &info->minimum_dependency_set;
|
|
|
|
|
|
|
|
|
|
+ TIME_SECTION("LLVM Initializtion");
|
|
|
|
|
+
|
|
|
|
|
+ LLVMInitializeAllTargetInfos();
|
|
|
|
|
+ LLVMInitializeAllTargets();
|
|
|
|
|
+ LLVMInitializeAllTargetMCs();
|
|
|
|
|
+ LLVMInitializeAllAsmPrinters();
|
|
|
|
|
+ LLVMInitializeAllAsmParsers();
|
|
|
|
|
+ LLVMInitializeAllDisassemblers();
|
|
|
|
|
+ LLVMInitializeNativeTarget();
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ char const *target_triple = "x86_64-pc-windows-msvc";
|
|
|
|
|
+ char const *target_data_layout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128";
|
|
|
|
|
+ LLVMSetTarget(mod, target_triple);
|
|
|
|
|
+
|
|
|
|
|
+ LLVMTargetRef target = {};
|
|
|
|
|
+ char *llvm_error = nullptr;
|
|
|
|
|
+ LLVMGetTargetFromTriple(target_triple, &target, &llvm_error);
|
|
|
|
|
+ GB_ASSERT(target != nullptr);
|
|
|
|
|
+
|
|
|
|
|
+ TIME_SECTION("LLVM Create Target Machine");
|
|
|
|
|
+
|
|
|
|
|
+ LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, "generic", "", LLVMCodeGenLevelNone, LLVMRelocDefault, LLVMCodeModelDefault);
|
|
|
|
|
+ defer (LLVMDisposeTargetMachine(target_machine));
|
|
|
|
|
+
|
|
|
|
|
+ LLVMSetModuleDataLayout(mod, LLVMCreateTargetDataLayout(target_machine));
|
|
|
|
|
+
|
|
|
{ // Debug Info
|
|
{ // Debug Info
|
|
|
for_array(i, info->files.entries) {
|
|
for_array(i, info->files.entries) {
|
|
|
AstFile *f = info->files.entries[i].value;
|
|
AstFile *f = info->files.entries[i].value;
|
|
@@ -10477,9 +10504,10 @@ void lb_generate_code(lbGenerator *gen) {
|
|
|
LLVMPassManagerRef function_pass_manager = LLVMCreateFunctionPassManagerForModule(mod);
|
|
LLVMPassManagerRef function_pass_manager = LLVMCreateFunctionPassManagerForModule(mod);
|
|
|
defer (LLVMDisposePassManager(function_pass_manager));
|
|
defer (LLVMDisposePassManager(function_pass_manager));
|
|
|
|
|
|
|
|
|
|
+ LLVMAddMemCpyOptPass(function_pass_manager);
|
|
|
LLVMAddPromoteMemoryToRegisterPass(function_pass_manager);
|
|
LLVMAddPromoteMemoryToRegisterPass(function_pass_manager);
|
|
|
LLVMAddMergedLoadStoreMotionPass(function_pass_manager);
|
|
LLVMAddMergedLoadStoreMotionPass(function_pass_manager);
|
|
|
- LLVMAddDeadStoreEliminationPass(function_pass_manager);
|
|
|
|
|
|
|
+ // LLVMAddDeadStoreEliminationPass(function_pass_manager);
|
|
|
LLVMAddAggressiveInstCombinerPass(function_pass_manager);
|
|
LLVMAddAggressiveInstCombinerPass(function_pass_manager);
|
|
|
LLVMAddConstantPropagationPass(function_pass_manager);
|
|
LLVMAddConstantPropagationPass(function_pass_manager);
|
|
|
LLVMAddAggressiveDCEPass(function_pass_manager);
|
|
LLVMAddAggressiveDCEPass(function_pass_manager);
|
|
@@ -10605,6 +10633,7 @@ void lb_generate_code(lbGenerator *gen) {
|
|
|
defer (LLVMDisposePassManager(module_pass_manager));
|
|
defer (LLVMDisposePassManager(module_pass_manager));
|
|
|
LLVMAddAlwaysInlinerPass(module_pass_manager);
|
|
LLVMAddAlwaysInlinerPass(module_pass_manager);
|
|
|
LLVMAddStripDeadPrototypesPass(module_pass_manager);
|
|
LLVMAddStripDeadPrototypesPass(module_pass_manager);
|
|
|
|
|
+ // LLVMAddConstantMergePass(module_pass_manager);
|
|
|
|
|
|
|
|
LLVMPassManagerBuilderRef pass_manager_builder = LLVMPassManagerBuilderCreate();
|
|
LLVMPassManagerBuilderRef pass_manager_builder = LLVMPassManagerBuilderCreate();
|
|
|
defer (LLVMPassManagerBuilderDispose(pass_manager_builder));
|
|
defer (LLVMPassManagerBuilderDispose(pass_manager_builder));
|
|
@@ -10614,10 +10643,7 @@ void lb_generate_code(lbGenerator *gen) {
|
|
|
LLVMPassManagerBuilderPopulateLTOPassManager(pass_manager_builder, module_pass_manager, false, false);
|
|
LLVMPassManagerBuilderPopulateLTOPassManager(pass_manager_builder, module_pass_manager, false, false);
|
|
|
LLVMRunPassManager(module_pass_manager, mod);
|
|
LLVMRunPassManager(module_pass_manager, mod);
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- char *llvm_error = nullptr;
|
|
|
|
|
|
|
+ llvm_error = nullptr;
|
|
|
defer (LLVMDisposeMessage(llvm_error));
|
|
defer (LLVMDisposeMessage(llvm_error));
|
|
|
|
|
|
|
|
String filepath_ll = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".ll"));
|
|
String filepath_ll = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".ll"));
|
|
@@ -10634,30 +10660,6 @@ void lb_generate_code(lbGenerator *gen) {
|
|
|
LLVMVerifyModule(mod, LLVMAbortProcessAction, &llvm_error);
|
|
LLVMVerifyModule(mod, LLVMAbortProcessAction, &llvm_error);
|
|
|
llvm_error = nullptr;
|
|
llvm_error = nullptr;
|
|
|
|
|
|
|
|
- TIME_SECTION("LLVM Initializtion");
|
|
|
|
|
-
|
|
|
|
|
- LLVMInitializeAllTargetInfos();
|
|
|
|
|
- LLVMInitializeAllTargets();
|
|
|
|
|
- LLVMInitializeAllTargetMCs();
|
|
|
|
|
- LLVMInitializeAllAsmPrinters();
|
|
|
|
|
- LLVMInitializeAllAsmParsers();
|
|
|
|
|
- LLVMInitializeAllDisassemblers();
|
|
|
|
|
- LLVMInitializeNativeTarget();
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- char const *target_triple = "x86_64-pc-windows-msvc";
|
|
|
|
|
- char const *target_data_layout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128";
|
|
|
|
|
- LLVMSetTarget(mod, target_triple);
|
|
|
|
|
-
|
|
|
|
|
- LLVMTargetRef target = {};
|
|
|
|
|
- LLVMGetTargetFromTriple(target_triple, &target, &llvm_error);
|
|
|
|
|
- GB_ASSERT(target != nullptr);
|
|
|
|
|
-
|
|
|
|
|
- TIME_SECTION("LLVM Create Target Machine");
|
|
|
|
|
-
|
|
|
|
|
- LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, "generic", "", LLVMCodeGenLevelNone, LLVMRelocDefault, LLVMCodeModelDefault);
|
|
|
|
|
- defer (LLVMDisposeTargetMachine(target_machine));
|
|
|
|
|
-
|
|
|
|
|
TIME_SECTION("LLVM Object Generation");
|
|
TIME_SECTION("LLVM Object Generation");
|
|
|
|
|
|
|
|
LLVMBool ok = LLVMTargetMachineEmitToFile(target_machine, mod, cast(char *)filepath_obj.text, LLVMObjectFile, &llvm_error);
|
|
LLVMBool ok = LLVMTargetMachineEmitToFile(target_machine, mod, cast(char *)filepath_obj.text, LLVMObjectFile, &llvm_error);
|