From c39ef1b25cc77f0179156430e45ef1d3c2028b7b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 31 Oct 2022 00:25:53 +0000 Subject: Ad-hoc pass source code location directly by pointer without stack copy --- src/llvm_backend.hpp | 2 +- src/llvm_backend_const.cpp | 10 +++++----- src/llvm_backend_proc.cpp | 11 +++++++++-- src/llvm_backend_type.cpp | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 8bd038c16..a8ff1571c 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -457,7 +457,7 @@ lbValue lb_find_value_from_entity(lbModule *m, Entity *e); void lb_store_type_case_implicit(lbProcedure *p, Ast *clause, lbValue value); lbAddr lb_store_range_stmt_val(lbProcedure *p, Ast *stmt_val, lbValue value); -lbValue lb_emit_source_code_location(lbProcedure *p, String const &procedure, TokenPos const &pos); +lbValue lb_emit_source_code_location_const(lbProcedure *p, String const &procedure, TokenPos const &pos); lbValue lb_handle_param_value(lbProcedure *p, Type *parameter_type, ParameterValue const ¶m_value, TokenPos const &pos); diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index a2209a89f..a8b66a0ea 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -256,7 +256,7 @@ lbValue lb_expr_untyped_const_to_typed(lbModule *m, Ast *expr, Type *t) { return lb_const_value(m, t, tv.value); } -lbValue lb_emit_source_code_location(lbProcedure *p, String const &procedure, TokenPos const &pos) { +lbValue lb_emit_source_code_location_const(lbProcedure *p, String const &procedure, TokenPos const &pos) { lbModule *m = p->module; LLVMValueRef fields[4] = {}; @@ -271,7 +271,7 @@ lbValue lb_emit_source_code_location(lbProcedure *p, String const &procedure, To return res; } -lbValue lb_emit_source_code_location(lbProcedure *p, Ast *node) { +lbValue lb_emit_source_code_location_const(lbProcedure *p, Ast *node) { String proc_name = {}; if (p->entity) { proc_name = p->entity->token.string; @@ -280,11 +280,11 @@ lbValue lb_emit_source_code_location(lbProcedure *p, Ast *node) { if (node) { pos = ast_token(node).pos; } - return lb_emit_source_code_location(p, proc_name, pos); + return lb_emit_source_code_location_const(p, proc_name, pos); } lbValue lb_emit_source_code_location_as_global(lbProcedure *p, String const &procedure, TokenPos const &pos) { - lbValue loc = lb_emit_source_code_location(p, procedure, pos); + lbValue loc = lb_emit_source_code_location_const(p, procedure, pos); lbAddr addr = lb_add_global_generated(p->module, loc.type, loc, nullptr); lb_make_global_private_const(addr); return lb_addr_load(p, addr); @@ -292,7 +292,7 @@ lbValue lb_emit_source_code_location_as_global(lbProcedure *p, String const &pro lbValue lb_emit_source_code_location_as_global(lbProcedure *p, Ast *node) { - lbValue loc = lb_emit_source_code_location(p, node); + lbValue loc = lb_emit_source_code_location_const(p, node); lbAddr addr = lb_add_global_generated(p->module, loc.type, loc, nullptr); lb_make_global_private_const(addr); return lb_addr_load(p, addr); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index ed7587bfd..a9de7b231 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -911,6 +911,9 @@ lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, auto processed_args = array_make(permanent_allocator(), 0, args.count); { + + bool is_odin_cc = is_calling_convention_odin(pt->Proc.calling_convention); + lbFunctionType *ft = lb_get_function_type(m, p, pt); bool return_by_pointer = ft->ret.kind == lbArg_Indirect; @@ -946,8 +949,12 @@ lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, } else if (arg->kind == lbArg_Indirect) { lbValue ptr = {}; if (arg->is_byval) { - ptr = lb_copy_value_to_ptr(p, x, original_type, arg->byval_alignment); - } else if (is_calling_convention_odin(pt->Proc.calling_convention)) { + if (is_odin_cc && are_types_identical(original_type, t_source_code_location)) { + ptr = lb_address_from_load_or_generate_local(p, x); + } else { + ptr = lb_copy_value_to_ptr(p, x, original_type, arg->byval_alignment); + } + } else if (is_odin_cc) { // NOTE(bill): Odin parameters are immutable so the original value can be passed if possible // i.e. `T const &` in C++ ptr = lb_address_from_load_or_generate_local(p, x); diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 8a0b794bc..4abf674c5 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -235,7 +235,7 @@ void lb_setup_type_info_data(lbProcedure *p) { // NOTE(bill): Setup type_info da } TokenPos pos = t->Named.type_name->token.pos; - lbValue loc = lb_emit_source_code_location(p, proc_name, pos); + lbValue loc = lb_emit_source_code_location_const(p, proc_name, pos); LLVMValueRef vals[4] = { lb_const_string(p->module, t->Named.type_name->token.string).value, -- cgit v1.2.3