Fix in byte output for globals.

This commit is contained in:
Christoffer Lerno
2021-08-21 22:16:35 +02:00
parent f198e6c53a
commit 7c7ee58b6b
3 changed files with 22 additions and 11 deletions

View File

@@ -349,17 +349,28 @@ void llvm_emit_global_variable_init(GenContext *c, Decl *decl)
ByteSize alignment = type_alloca_alignment(decl->type); ByteSize alignment = type_alloca_alignment(decl->type);
if (decl->var.init_expr) Expr *init_expr = decl->var.init_expr;
if (init_expr)
{ {
if (decl->var.init_expr->expr_kind == EXPR_INITIALIZER_LIST) if (init_expr->expr_kind == EXPR_INITIALIZER_LIST)
{ {
init_value = llvm_emit_const_aggregate(c, decl->var.init_expr, &modified); init_value = llvm_emit_const_aggregate(c, init_expr, &modified);
} }
else else
{ {
BEValue value; BEValue value;
llvm_emit_expr(c, &value, decl->var.init_expr); if (init_expr->expr_kind == EXPR_CONST && init_expr->const_expr.kind == TYPE_ARRAY)
init_value = llvm_value_rvalue_store(c, &value); {
init_value = LLVMConstStringInContext(c->context,
init_expr->const_expr.bytes.ptr,
init_expr->const_expr.bytes.len,
1);
}
else
{
llvm_emit_expr(c, &value, decl->var.init_expr);
init_value = llvm_value_rvalue_store(c, &value);
}
} }
} }
else else

View File

@@ -2499,7 +2499,7 @@ static void llvm_emit_const_expr(GenContext *c, BEValue *be_value, Expr *expr)
1)); 1));
llvm_set_alignment(global_name, 1); llvm_set_alignment(global_name, 1);
global_name = LLVMConstBitCast(global_name, LLVMPointerType(llvm_get_type(c, type_char), 0)); global_name = LLVMConstBitCast(global_name, LLVMPointerType(llvm_get_type(c, type_char), 0));
llvm_value_set(be_value, global_name, type); llvm_value_set_address(be_value, global_name, type);
return; return;
} }
case ALL_INTS: case ALL_INTS:

View File

@@ -6,8 +6,8 @@ char[*] foo64 = b64"SGVsbG8gV29ybGQ=";
// #expect: byte_literals.ll // #expect: byte_literals.ll
@.bytes = private constant [1 x i8] c"\A0", align 1 @byte_literals.foob = global [1 x i8] c"\A0", align 1
@.bytes.5 = private constant [7 x i8] c"\00\AA\BB\CC\DD\EE\FF", align 1 @byte_literals.fooz = global [7 x i8] c"\00\AA\BB\CC\DD\EE\FF", align 1
@.bytes.6 = private constant [4 x i8] c"\DE\AD\BE\EF", align 1 @byte_literals.fooy = global [4 x i8] c"\DE\AD\BE\EF", align 1
@.bytes.7 = private constant [5 x i8] c"EI#M\ED", align 1 @byte_literals.foow = global [5 x i8] c"EI#M\ED", align 1
@.bytes.8 = private constant [11 x i8] c"Hello World", align 1 @byte_literals.foo64 = global [11 x i8] c"Hello World", align 1