diff --git a/compiler/builtins/bitcode/src/str.zig b/compiler/builtins/bitcode/src/str.zig index 2172e693d7..801550663c 100644 --- a/compiler/builtins/bitcode/src/str.zig +++ b/compiler/builtins/bitcode/src/str.zig @@ -1150,8 +1150,8 @@ fn strToBytes(arg: RocStr) RocList { } const FromUtf8Result = extern struct { - byte_index: usize, string: RocStr, + byte_index: usize, is_ok: bool, problem_code: Utf8ByteProblem, }; diff --git a/compiler/gen_llvm/src/llvm/build_str.rs b/compiler/gen_llvm/src/llvm/build_str.rs index 3b35d6d9a9..d143d06da6 100644 --- a/compiler/gen_llvm/src/llvm/build_str.rs +++ b/compiler/gen_llvm/src/llvm/build_str.rs @@ -295,8 +295,8 @@ pub fn str_from_utf8_range<'a, 'ctx, 'env>( let record_type = env.context.struct_type( &[ - env.ptr_int().into(), super::convert::zig_str_type(env).into(), + env.ptr_int().into(), env.context.bool_type().into(), ctx.i8_type().into(), ], @@ -343,8 +343,8 @@ pub fn str_from_utf8<'a, 'ctx, 'env>( let record_type = env.context.struct_type( &[ - env.ptr_int().into(), super::convert::zig_str_type(env).into(), + env.ptr_int().into(), env.context.bool_type().into(), ctx.i8_type().into(), ], diff --git a/compiler/mono/src/layout.rs b/compiler/mono/src/layout.rs index 21d50f2715..0afcae5d15 100644 --- a/compiler/mono/src/layout.rs +++ b/compiler/mono/src/layout.rs @@ -1151,10 +1151,13 @@ impl<'a> Builtin<'a> { Float64 => align_of::() as u32, Float32 => align_of::() as u32, Float16 => align_of::() as u32, - Str | EmptyStr => pointer_size, Dict(_, _) | EmptyDict => pointer_size, Set(_) | EmptySet => pointer_size, - List(_) | EmptyList => pointer_size, + // we often treat these as i128 (64-bit systems) + // or i64 (32-bit systems). For that to be safe + // they must be aligned to allow such access + List(_) | EmptyList => 2 * pointer_size, + Str | EmptyStr => 2 * pointer_size, } } @@ -1240,9 +1243,10 @@ impl<'a> Builtin<'a> { Builtin::Str => pointer_size, Builtin::Dict(k, v) => k .alignment_bytes(pointer_size) - .max(v.alignment_bytes(pointer_size)), - Builtin::Set(k) => k.alignment_bytes(pointer_size), - Builtin::List(e) => e.alignment_bytes(pointer_size), + .max(v.alignment_bytes(pointer_size)) + .max(pointer_size), + Builtin::Set(k) => k.alignment_bytes(pointer_size).max(pointer_size), + Builtin::List(e) => e.alignment_bytes(pointer_size).max(pointer_size), Builtin::EmptyStr | Builtin::EmptyList | Builtin::EmptyDict | Builtin::EmptySet => { unreachable!("not heap-allocated") }