aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp60
1 files changed, 34 insertions, 26 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index f2e6662c8..27167aefd 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -84,7 +84,7 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i
String link_name = {};
if (ignore_body) {
- lbModule *other_module = lb_module_of_entity(m->gen, entity);
+ lbModule *other_module = lb_module_of_entity(m->gen, entity, m);
link_name = lb_get_entity_name(other_module, entity);
} else {
link_name = lb_get_entity_name(m, entity);
@@ -99,7 +99,6 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i
}
}
-
lbProcedure *p = gb_alloc_item(permanent_allocator(), lbProcedure);
p->module = m;
@@ -241,8 +240,6 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i
}
}
}
- lb_set_linkage_from_entity_flags(p->module, p->value, entity->flags);
-
if (p->is_foreign) {
lb_set_wasm_procedure_import_attributes(p->value, entity, p->name);
@@ -273,7 +270,7 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i
}
if (e->flags&EntityFlag_NoCapture) {
if (is_type_internally_pointer_like(e->type)) {
- lb_add_proc_attribute_at_index(p, offset+parameter_index, "nocapture");
+ lb_add_nocapture_proc_attribute_at_index(p, offset+parameter_index);
}
}
parameter_index += 1;
@@ -285,6 +282,7 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i
LLVMSetLinkage(p->value, LLVMExternalLinkage);
}
+ lb_set_linkage_from_entity_flags(p->module, p->value, entity->flags);
if (m->debug_builder) { // Debug Information
Type *bt = base_type(p->type);
@@ -431,7 +429,7 @@ gb_internal lbProcedure *lb_create_dummy_procedure(lbModule *m, String link_name
if (pt->Proc.calling_convention == ProcCC_Odin) {
lb_add_proc_attribute_at_index(p, offset+parameter_index, "noalias");
lb_add_proc_attribute_at_index(p, offset+parameter_index, "nonnull");
- lb_add_proc_attribute_at_index(p, offset+parameter_index, "nocapture");
+ lb_add_nocapture_proc_attribute_at_index(p, offset+parameter_index);
}
return p;
}
@@ -798,9 +796,8 @@ gb_internal void lb_end_procedure_body(lbProcedure *p) {
gb_internal void lb_build_nested_proc(lbProcedure *p, AstProcLit *pd, Entity *e) {
GB_ASSERT(pd->body != nullptr);
lbModule *m = p->module;
- auto *min_dep_set = &m->info->minimum_dependency_set;
- if (ptr_set_exists(min_dep_set, e) == false) {
+ if (e->min_dep_count.load(std::memory_order_relaxed) == 0) {
// NOTE(bill): Nothing depends upon it so doesn't need to be built
return;
}
@@ -836,7 +833,7 @@ gb_internal void lb_build_nested_proc(lbProcedure *p, AstProcLit *pd, Entity *e)
lb_add_entity(m, e, value);
array_add(&p->children, nested_proc);
- array_add(&m->procedures_to_generate, nested_proc);
+ mpsc_enqueue(&m->procedures_to_generate, nested_proc);
}
@@ -923,13 +920,14 @@ gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue
arg_type != param_type) {
LLVMTypeKind arg_kind = LLVMGetTypeKind(arg_type);
LLVMTypeKind param_kind = LLVMGetTypeKind(param_type);
- if (arg_kind == param_kind &&
- arg_kind == LLVMPointerTypeKind) {
- // NOTE(bill): LLVM's newer `ptr` only type system seems to fail at times
- // I don't know why...
- args[i] = LLVMBuildPointerCast(p->builder, args[i], param_type, "");
- arg_type = param_type;
- continue;
+ if (arg_kind == param_kind) {
+ if (arg_kind == LLVMPointerTypeKind) {
+ // NOTE(bill): LLVM's newer `ptr` only type system seems to fail at times
+ // I don't know why...
+ args[i] = LLVMBuildPointerCast(p->builder, args[i], param_type, "");
+ arg_type = param_type;
+ continue;
+ }
}
}
@@ -2212,7 +2210,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
GB_ASSERT(e != nullptr);
if (e->parent_proc_decl != nullptr && e->parent_proc_decl->entity != nullptr) {
- procedure = e->parent_proc_decl->entity->token.string;
+ procedure = e->parent_proc_decl->entity.load()->token.string;
} else {
procedure = str_lit("");
}
@@ -2239,7 +2237,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
elements[i] = element;
}
- LLVMValueRef backing_array = llvm_const_array(lb_type(m, t_load_directory_file), elements, count);
+ LLVMValueRef backing_array = llvm_const_array(m, lb_type(m, t_load_directory_file), elements, count);
Type *array_type = alloc_type_array(t_load_directory_file, count);
lbAddr backing_array_addr = lb_add_global_generated_from_procedure(p, array_type, {backing_array, array_type});
@@ -2683,7 +2681,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
case BuiltinProc_transpose:
{
lbValue m = lb_build_expr(p, ce->args[0]);
- return lb_emit_matrix_tranpose(p, m, tv.type);
+ return lb_emit_matrix_transpose(p, m, tv.type);
}
case BuiltinProc_outer_product:
@@ -3307,7 +3305,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
if (id == BuiltinProc_fixed_point_div ||
id == BuiltinProc_fixed_point_div_sat) {
- res.value = lb_integer_division_intrinsics(p, x.value, y.value, scale.value, platform_type, name);
+ res.value = lb_integer_division_fixed_point_intrinsics(p, x.value, y.value, scale.value, platform_type, name);
} else {
LLVMTypeRef types[1] = {lb_type(p->module, platform_type)};
@@ -3754,6 +3752,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
case BuiltinProc_objc_register_class: return lb_handle_objc_register_class(p, expr);
case BuiltinProc_objc_ivar_get: return lb_handle_objc_ivar_get(p, expr);
case BuiltinProc_objc_block: return lb_handle_objc_block(p, expr);
+ case BuiltinProc_objc_super: return lb_handle_objc_super(p, expr);
case BuiltinProc_constant_utf16_cstring:
@@ -4123,21 +4122,23 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) {
}
Ast *proc_expr = unparen_expr(ce->proc);
+ Entity *proc_entity = entity_of_node(proc_expr);
+
if (proc_mode == Addressing_Builtin) {
- Entity *e = entity_of_node(proc_expr);
BuiltinProcId id = BuiltinProc_Invalid;
- if (e != nullptr) {
- id = cast(BuiltinProcId)e->Builtin.id;
+ if (proc_entity != nullptr) {
+ id = cast(BuiltinProcId)proc_entity->Builtin.id;
} else {
id = BuiltinProc_DIRECTIVE;
}
return lb_build_builtin_proc(p, expr, tv, id);
}
+ bool is_objc_call = proc_entity && proc_entity->Procedure.is_objc_impl_or_import;
+
// NOTE(bill): Regular call
lbValue value = {};
- Entity *proc_entity = entity_of_node(proc_expr);
if (proc_entity != nullptr) {
if (proc_entity->flags & EntityFlag_Disabled) {
GB_ASSERT(tv.type == nullptr);
@@ -4171,11 +4172,13 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) {
}
}
- if (value.value == nullptr) {
+ if (is_objc_call) {
+ value.type = proc_tv.type;
+ } else if (value.value == nullptr) {
value = lb_build_expr(p, proc_expr);
}
- GB_ASSERT(value.value != nullptr);
+ GB_ASSERT(value.value != nullptr || is_objc_call);
Type *proc_type_ = base_type(value.type);
GB_ASSERT(proc_type_->kind == Type_Proc);
TypeProc *pt = &proc_type_->Proc;
@@ -4403,6 +4406,11 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) {
isize final_count = is_c_vararg ? args.count : pt->param_count;
auto call_args = array_slice(args, 0, final_count);
+
+ if (is_objc_call) {
+ return lb_handle_objc_auto_send(p, expr, slice(call_args, 0, call_args.count));
+ }
+
return lb_emit_call(p, value, call_args, ce->inlining);
}