diff --git a/src/compiler/llvm_codegen.c b/src/compiler/llvm_codegen.c index 125085f2d..122f2010f 100644 --- a/src/compiler/llvm_codegen.c +++ b/src/compiler/llvm_codegen.c @@ -349,17 +349,28 @@ void llvm_emit_global_variable_init(GenContext *c, Decl *decl) 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 { BEValue value; - llvm_emit_expr(c, &value, decl->var.init_expr); - init_value = llvm_value_rvalue_store(c, &value); + if (init_expr->expr_kind == EXPR_CONST && init_expr->const_expr.kind == TYPE_ARRAY) + { + 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 diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index e4e4731d6..7891c8f45 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -2499,7 +2499,7 @@ static void llvm_emit_const_expr(GenContext *c, BEValue *be_value, Expr *expr) 1)); llvm_set_alignment(global_name, 1); 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; } case ALL_INTS: diff --git a/test/test_suite/constants/byte_literals.c3t b/test/test_suite/constants/byte_literals.c3t index 9afe29751..9909bc1f5 100644 --- a/test/test_suite/constants/byte_literals.c3t +++ b/test/test_suite/constants/byte_literals.c3t @@ -6,8 +6,8 @@ char[*] foo64 = b64"SGVsbG8gV29ybGQ="; // #expect: byte_literals.ll -@.bytes = private constant [1 x i8] c"\A0", align 1 -@.bytes.5 = private constant [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 -@.bytes.7 = private constant [5 x i8] c"EI#M\ED", align 1 -@.bytes.8 = private constant [11 x i8] c"Hello World", align 1 +@byte_literals.foob = global [1 x i8] c"\A0", align 1 +@byte_literals.fooz = global [7 x i8] c"\00\AA\BB\CC\DD\EE\FF", align 1 +@byte_literals.fooy = global [4 x i8] c"\DE\AD\BE\EF", align 1 +@byte_literals.foow = global [5 x i8] c"EI#M\ED", align 1 +@byte_literals.foo64 = global [11 x i8] c"Hello World", align 1