Fixing #380 where const aggregates were copied by value.

This commit is contained in:
Christoffer Lerno
2022-01-20 16:52:28 +01:00
parent ec291d4a9d
commit dce33ba5b5
11 changed files with 43 additions and 9 deletions

View File

@@ -60,7 +60,7 @@ enum Seek
END = 2
}
errtype IoError
optenum IoError
{
FILE_NOT_FOUND,
FILE_NOT_SEEKABLE,

View File

@@ -25,7 +25,7 @@ enum AllocationKind
FREE,
}
errtype AllocationFailure
optenum AllocationFailure
{
OUT_OF_MEMORY
}

View File

@@ -328,6 +328,10 @@ void llvm_emit_global_variable_init(GenContext *c, Decl *decl)
AlignSize alignment = type_alloca_alignment(var_type);
Expr *init_expr = decl->var.init_expr;
if (init_expr && init_expr->expr_kind == EXPR_CONST_IDENTIFIER)
{
init_expr = init_expr->identifier_expr.decl->var.init_expr;
}
if (init_expr)
{
if (init_expr->expr_kind == EXPR_CONST && init_expr->const_expr.const_kind == CONST_LIST)

View File

@@ -661,6 +661,7 @@ static inline bool sema_cast_ident_rvalue(SemaContext *context, Expr *expr)
{
UNREACHABLE
}
if (type_is_abi_aggregate(decl->type)) return true;
expr_replace(expr, copy_expr(decl->var.init_expr));
return sema_analyse_expr(context, expr);
case VARDECL_PARAM_EXPR:

View File

@@ -0,0 +1,29 @@
// #target: x64-darwin
module foo;
const char[100] FOO = { [50] = 1 };
const int[<4>] BAR = { 1, 2, 3, 4 };
fn void test(int z)
{
char s = FOO[z];
int zd = BAR[z];
}
/* #expect: foo.ll
@foo.FOO = local_unnamed_addr constant { [50 x i8], i8, [49 x i8] } { [50 x i8] zeroinitializer, i8 1, [49 x i8] zeroinitializer }, align 16
@foo.BAR = local_unnamed_addr constant <4 x i32> <i32 1, i32 2, i32 3, i32 4>, align 16
define void @foo.test(i32 %0) #0 {
entry:
%s = alloca i8, align 1
%zd = alloca i32, align 4
%sisiext = sext i32 %0 to i64
%1 = getelementptr inbounds [100 x i8], [100 x i8]* bitcast ({ [50 x i8], i8, [49 x i8] }* @foo.FOO to [100 x i8]*), i64 0, i64 %sisiext
%2 = load i8, i8* %1, align 1
store i8 %2, i8* %s, align 1
%sisiext1 = sext i32 %0 to i64
%3 = extractelement <4 x i32> <i32 1, i32 2, i32 3, i32 4>, i64 %sisiext1
store i32 %3, i32* %zd, align 4
ret void
}

View File

@@ -1,6 +1,6 @@
module foo;
errtype Blurg
optenum Blurg
{
Z
}

View File

@@ -1,6 +1,6 @@
module foo;
errtype Blurg
optenum Blurg
{
X, Y, Z
}

View File

@@ -4,7 +4,7 @@ struct Foo
int x, y;
}
errtype MyErr
optenum MyErr
{
FOO
}

View File

@@ -1,6 +1,6 @@
// #target: x64-darwin
errtype MyErr
errnum MyErr
{
TEST
}
@@ -28,7 +28,7 @@ fn int main()
return 0;
}
// #expect: failable_catch.ll
/* #expect: failable_catch.ll
define i32 @main() #0 {
entry:

View File

@@ -205,7 +205,7 @@ fn Type getMult(Type a)
}
Type argh = 234;
errtype MyErr
optenum MyErr
{
X,
Y

View File

@@ -17,7 +17,7 @@ private Foo foo6;
private const Foo FOO7 = { 1, 2 };
private Foo foo8 = FOO7;
// #expect: structo.ll
/* #expect: structo.ll
%Foo = type { i32, i64 }