aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-03-23 18:24:49 +0000
committergingerBill <bill@gingerbill.org>2021-03-23 18:24:49 +0000
commit7f6a43f0af49e1ab8aad3b2653fec590ab5ad9dc (patch)
tree6dd2dade7b9427fc4fd34913905dbcbcb33caa3f /src/llvm_backend.cpp
parentccd91aee5c46b55bf452a7b57322ebb5f0ec94a9 (diff)
Move LLVM optimization procedures to a separate file to aid with organization
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp123
1 files changed, 33 insertions, 90 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index d3500d5b6..bca916819 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -1,5 +1,6 @@
#include "llvm_backend.hpp"
#include "llvm_abi.cpp"
+#include "llvm_backend_opt.cpp"
gb_global lbAddr lb_global_type_info_data = {};
gb_global lbAddr lb_global_type_info_member_types = {};
@@ -12832,7 +12833,6 @@ void lb_setup_type_info_data(lbProcedure *p) { // NOTE(bill): Setup type_info da
}
}
-
void lb_generate_code(lbGenerator *gen) {
#define TIME_SECTION(str) do { if (build_context.show_more_timings) timings_start_section(&global_timings, str_lit(str)); } while (0)
@@ -13160,6 +13160,34 @@ void lb_generate_code(lbGenerator *gen) {
lb_add_entity(m, e, g);
lb_add_member(m, name, g);
+
+ if (m->debug_builder) {
+ String global_name = e->token.string;
+ if (global_name.len != 0 && global_name != "_") {
+ LLVMMetadataRef llvm_file = lb_get_llvm_metadata(m, e->file);
+ LLVMMetadataRef llvm_scope = llvm_file;
+
+ LLVMBool local_to_unit = e->flags & EntityFlag_Static;
+
+ LLVMMetadataRef llvm_expr = LLVMDIBuilderCreateExpression(m->debug_builder, nullptr, 0);
+ LLVMMetadataRef llvm_decl = nullptr;
+
+ u32 align_in_bits = cast(u32)(8*type_align_of(e->type));
+
+
+ LLVMMetadataRef global_variable_metadata = LLVMDIBuilderCreateGlobalVariableExpression(
+ m->debug_builder, llvm_scope,
+ cast(char const *)global_name.text, global_name.len,
+ "", 0, // linkage
+ llvm_file, e->token.pos.line,
+ lb_debug_type(m, e->type),
+ local_to_unit,
+ llvm_expr,
+ llvm_decl,
+ align_in_bits
+ );
+ }
+ }
}
@@ -13227,85 +13255,14 @@ void lb_generate_code(lbGenerator *gen) {
defer (LLVMDisposePassManager(default_function_pass_manager));
LLVMInitializeFunctionPassManager(default_function_pass_manager);
- {
- auto dfpm = default_function_pass_manager;
-
- if (build_context.optimization_level == 0) {
- LLVMAddMemCpyOptPass(dfpm);
- LLVMAddPromoteMemoryToRegisterPass(dfpm);
- LLVMAddMergedLoadStoreMotionPass(dfpm);
- LLVMAddEarlyCSEPass(dfpm);
- LLVMAddEarlyCSEMemSSAPass(dfpm);
- LLVMAddConstantPropagationPass(dfpm);
- // LLVMAddAggressiveDCEPass(dfpm);
- LLVMAddMergedLoadStoreMotionPass(dfpm);
- LLVMAddPromoteMemoryToRegisterPass(dfpm);
- LLVMAddCFGSimplificationPass(dfpm);
-
-
- // LLVMAddInstructionCombiningPass(dfpm);
- LLVMAddSLPVectorizePass(dfpm);
- LLVMAddLoopVectorizePass(dfpm);
-
- LLVMAddScalarizerPass(dfpm);
- LLVMAddLoopIdiomPass(dfpm);
- } else {
- bool do_extra_passes = true;
-
- int repeat_count = cast(int)build_context.optimization_level;
- do {
- LLVMAddMemCpyOptPass(dfpm);
- LLVMAddPromoteMemoryToRegisterPass(dfpm);
- LLVMAddMergedLoadStoreMotionPass(dfpm);
- LLVMAddAlignmentFromAssumptionsPass(dfpm);
- LLVMAddEarlyCSEPass(dfpm);
- LLVMAddEarlyCSEMemSSAPass(dfpm);
- LLVMAddConstantPropagationPass(dfpm);
- if (do_extra_passes) {
- // LLVMAddAggressiveDCEPass(dfpm);
- }
- LLVMAddMergedLoadStoreMotionPass(dfpm);
- LLVMAddPromoteMemoryToRegisterPass(dfpm);
- LLVMAddCFGSimplificationPass(dfpm);
- LLVMAddTailCallEliminationPass(dfpm);
-
- if (do_extra_passes) {
- LLVMAddSLPVectorizePass(dfpm);
- LLVMAddLoopVectorizePass(dfpm);
-
- LLVMAddConstantPropagationPass(dfpm);
- LLVMAddScalarizerPass(dfpm);
- LLVMAddLoopIdiomPass(dfpm);
-
- // LLVMAddAggressiveInstCombinerPass(dfpm);
- LLVMAddLowerExpectIntrinsicPass(dfpm);
-
- LLVMAddDeadStoreEliminationPass(dfpm);
- LLVMAddReassociatePass(dfpm);
- LLVMAddAddDiscriminatorsPass(dfpm);
- LLVMAddPromoteMemoryToRegisterPass(dfpm);
- LLVMAddCorrelatedValuePropagationPass(dfpm);
- }
- } while (repeat_count --> 0);
- }
- }
+ lb_populate_function_pass_manager(default_function_pass_manager, false);
LLVMFinalizeFunctionPassManager(default_function_pass_manager);
LLVMPassManagerRef default_function_pass_manager_without_memcpy = LLVMCreateFunctionPassManagerForModule(mod);
defer (LLVMDisposePassManager(default_function_pass_manager_without_memcpy));
LLVMInitializeFunctionPassManager(default_function_pass_manager_without_memcpy);
- {
- auto dfpm = default_function_pass_manager_without_memcpy;
- LLVMAddPromoteMemoryToRegisterPass(dfpm);
- LLVMAddMergedLoadStoreMotionPass(dfpm);
- LLVMAddUnifyFunctionExitNodesPass(dfpm);
- LLVMAddConstantPropagationPass(dfpm);
- // LLVMAddAggressiveDCEPass(dfpm);
- LLVMAddMergedLoadStoreMotionPass(dfpm);
- LLVMAddPromoteMemoryToRegisterPass(dfpm);
- LLVMAddCFGSimplificationPass(dfpm);
- }
+ lb_populate_function_pass_manager(default_function_pass_manager_without_memcpy, true);
LLVMFinalizeFunctionPassManager(default_function_pass_manager_without_memcpy);
TIME_SECTION("LLVM Runtime Type Information Creation");
@@ -13630,22 +13587,8 @@ void lb_generate_code(lbGenerator *gen) {
LLVMPassManagerRef module_pass_manager = LLVMCreatePassManager();
defer (LLVMDisposePassManager(module_pass_manager));
- LLVMAddAlwaysInlinerPass(module_pass_manager);
- LLVMAddStripDeadPrototypesPass(module_pass_manager);
- LLVMAddAnalysisPasses(target_machine, module_pass_manager);
- if (build_context.optimization_level >= 2) {
- LLVMAddArgumentPromotionPass(module_pass_manager);
- LLVMAddConstantMergePass(module_pass_manager);
- LLVMAddGlobalDCEPass(module_pass_manager);
- LLVMAddDeadArgEliminationPass(module_pass_manager);
- }
-
- LLVMPassManagerBuilderRef pass_manager_builder = LLVMPassManagerBuilderCreate();
- defer (LLVMPassManagerBuilderDispose(pass_manager_builder));
- LLVMPassManagerBuilderSetOptLevel(pass_manager_builder, build_context.optimization_level);
- LLVMPassManagerBuilderSetSizeLevel(pass_manager_builder, build_context.optimization_level);
-
- LLVMPassManagerBuilderPopulateLTOPassManager(pass_manager_builder, module_pass_manager, false, false);
+ lb_populate_module_pass_manager(target_machine, module_pass_manager);
+
LLVMRunPassManager(module_pass_manager, mod);
llvm_error = nullptr;