Merge pull request #1694 from rtfeldman/wasm-layout-fix

Wasm layout fix
This commit is contained in:
Richard Feldman 2021-09-12 11:56:26 -04:00 committed by GitHub
commit c80534d03b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 8 additions and 35 deletions

View file

@ -1150,8 +1150,8 @@ fn strToBytes(arg: RocStr) RocList {
} }
const FromUtf8Result = extern struct { const FromUtf8Result = extern struct {
string: RocStr,
byte_index: usize, byte_index: usize,
string: RocStr,
is_ok: bool, is_ok: bool,
problem_code: Utf8ByteProblem, problem_code: Utf8ByteProblem,
}; };

View file

@ -1,5 +1,5 @@
use crate::llvm::bitcode::{call_bitcode_fn, call_void_bitcode_fn}; use crate::llvm::bitcode::{call_bitcode_fn, call_void_bitcode_fn};
use crate::llvm::build::{complex_bitcast, struct_from_fields, Env, Scope}; use crate::llvm::build::{complex_bitcast, Env, Scope};
use crate::llvm::build_list::{allocate_list, call_bitcode_fn_returns_list, store_list}; use crate::llvm::build_list::{allocate_list, call_bitcode_fn_returns_list, store_list};
use inkwell::builder::Builder; use inkwell::builder::Builder;
use inkwell::values::{BasicValueEnum, FunctionValue, IntValue, PointerValue, StructValue}; use inkwell::values::{BasicValueEnum, FunctionValue, IntValue, PointerValue, StructValue};
@ -268,48 +268,19 @@ fn decode_from_utf8_result<'a, 'ctx, 'env>(
let ctx = env.context; let ctx = env.context;
let fields = match env.ptr_bytes { let fields = match env.ptr_bytes {
8 => [ 8 | 4 => [
env.ptr_int().into(), env.ptr_int().into(),
super::convert::zig_str_type(env).into(), super::convert::zig_str_type(env).into(),
env.context.bool_type().into(), env.context.bool_type().into(),
ctx.i8_type().into(), ctx.i8_type().into(),
], ],
4 => [
super::convert::zig_str_type(env).into(),
env.ptr_int().into(),
env.context.bool_type().into(),
ctx.i8_type().into(),
],
_ => unreachable!(), _ => unreachable!(),
}; };
let record_type = env.context.struct_type(&fields, false); let record_type = env.context.struct_type(&fields, false);
match env.ptr_bytes { match env.ptr_bytes {
8 => { 8 | 4 => {
let zig_struct = builder
.build_load(pointer, "load_utf8_validate_bytes_result")
.into_struct_value();
let string = builder
.build_extract_value(zig_struct, 0, "string")
.unwrap();
let byte_index = builder
.build_extract_value(zig_struct, 1, "byte_index")
.unwrap();
let is_ok = builder.build_extract_value(zig_struct, 2, "is_ok").unwrap();
let problem_code = builder
.build_extract_value(zig_struct, 3, "problem_code")
.unwrap();
let values = [byte_index, string, is_ok, problem_code];
struct_from_fields(env, record_type, values.iter().copied().enumerate())
}
4 => {
let result_ptr_cast = env let result_ptr_cast = env
.builder .builder
.build_bitcast( .build_bitcast(

View file

@ -1158,8 +1158,8 @@ impl<'a> Builtin<'a> {
// //
// In webassembly, For that to be safe // In webassembly, For that to be safe
// they must be aligned to allow such access // they must be aligned to allow such access
List(_) | EmptyList => pointer_size.max(8), List(_) | EmptyList => pointer_size,
Str | EmptyStr => pointer_size.max(8), Str | EmptyStr => pointer_size,
} }
} }

View file

@ -2531,6 +2531,8 @@ fn pattern_match_unit_tag() {
); );
} }
// see for why this is disabled on wasm32 https://github.com/rtfeldman/roc/issues/1687
#[cfg(not(feature = "wasm-cli-run"))]
#[test] #[test]
fn mirror_llvm_alignment_padding() { fn mirror_llvm_alignment_padding() {
// see https://github.com/rtfeldman/roc/issues/1569 // see https://github.com/rtfeldman/roc/issues/1569