mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Add .hash to integer types. Fixup of make and tmake. Updated map.c3 to become a working example. Fix bug in subarray -> pointer conversion. Search extension methods in std::core. Fix slice <-> slice copy.
This commit is contained in:
committed by
Christoffer Lerno
parent
4d5821408d
commit
ad18d9ba48
@@ -1176,6 +1176,17 @@ void llvm_emit_cast(GenContext *c, CastKind cast_kind, Expr *expr, BEValue *valu
|
||||
break;
|
||||
case CAST_SAPTR:
|
||||
llvm_emit_subarray_pointer(c, value, value);
|
||||
if (value->type != to_type)
|
||||
{
|
||||
if (llvm_value_is_addr(value))
|
||||
{
|
||||
value->value = LLVMBuildPointerCast(c->builder, value->value, llvm_get_ptr_type(c, to_type), "saptr");
|
||||
}
|
||||
else
|
||||
{
|
||||
value->value = LLVMBuildPointerCast(c->builder, value->value, llvm_get_ptr_type(c, to_type), "saptr");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CAST_EREU:
|
||||
// This is a no op.
|
||||
@@ -2447,6 +2458,42 @@ static void gencontext_emit_slice(GenContext *c, BEValue *be_value, Expr *expr)
|
||||
llvm_value_aggregate_two(c, be_value, type_lowering(expr->type), start_pointer, size);
|
||||
}
|
||||
|
||||
static void llvm_emit_slice_copy(GenContext *c, BEValue *be_value, Expr *expr)
|
||||
{
|
||||
llvm_emit_exprid(c, be_value, expr->slice_assign_expr.right);
|
||||
llvm_value_rvalue(c, be_value);
|
||||
|
||||
BEValue assigned_to;
|
||||
llvm_emit_exprid(c, &assigned_to, expr->slice_assign_expr.left);
|
||||
llvm_value_rvalue(c, &assigned_to);
|
||||
|
||||
BEValue to_pointer;
|
||||
llvm_emit_subarray_pointer(c, &assigned_to, &to_pointer);
|
||||
llvm_value_rvalue(c, &to_pointer);
|
||||
|
||||
BEValue from_pointer;
|
||||
BEValue from_len;
|
||||
llvm_emit_subarray_pointer(c, be_value, &from_pointer);
|
||||
llvm_value_rvalue(c, &from_pointer);
|
||||
llvm_emit_subarray_len(c, be_value, &from_len);
|
||||
llvm_value_rvalue(c, &from_len);
|
||||
|
||||
if (active_target.feature.safe_mode)
|
||||
{
|
||||
BEValue to_len;
|
||||
llvm_emit_subarray_len(c, &assigned_to, &to_len);
|
||||
BEValue comp;
|
||||
llvm_emit_int_comp(c, &comp, &to_len, &from_len, BINARYOP_NE);
|
||||
llvm_emit_panic_if_true(c, &comp, "Subarray copy length mismatch.", expr->span);
|
||||
}
|
||||
|
||||
Type *pointer_type = to_pointer.type->pointer;
|
||||
unsigned alignment = type_abi_alignment(pointer_type);
|
||||
LLVMValueRef bytes = LLVMBuildMul(c->builder, from_len.value, llvm_const_int(c, from_len.type, type_size(pointer_type)), "");
|
||||
LLVMBuildMemCpy(c->builder, to_pointer.value, alignment, from_pointer.value, alignment, bytes);
|
||||
}
|
||||
|
||||
|
||||
static void llvm_emit_slice_assign(GenContext *c, BEValue *be_value, Expr *expr)
|
||||
{
|
||||
// We will be replacing the slice assign with code that roughly looks like this:
|
||||
@@ -5575,6 +5622,9 @@ void llvm_emit_expr(GenContext *c, BEValue *value, Expr *expr)
|
||||
case EXPR_DECL:
|
||||
llvm_emit_local_decl(c, expr->decl_expr, value);
|
||||
return;
|
||||
case EXPR_SLICE_COPY:
|
||||
llvm_emit_slice_copy(c, value, expr);
|
||||
return;
|
||||
case EXPR_SLICE_ASSIGN:
|
||||
llvm_emit_slice_assign(c, value, expr);
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user