{ Type_Kind_Basic, 0, { Basic_Kind_F32, Basic_Flag_Float, 4, 4, "f32" } },
{ Type_Kind_Basic, 0, { Basic_Kind_F64, Basic_Flag_Float, 8, 4, "f64" } },
- { Type_Kind_Basic, 0, { Basic_Kind_Rawptr, Basic_Flag_Pointer, 4, 4, "rawptr" } },
+ { Type_Kind_Basic, 0, { Basic_Kind_Rawptr, Basic_Flag_Pointer, 8, 8, "rawptr" } },
{ Type_Kind_Basic, 0, { Basic_Kind_I8X16, Basic_Flag_SIMD, 16, 16, "i8x16" } },
{ Type_Kind_Basic, 0, { Basic_Kind_I16X8, Basic_Flag_SIMD, 16, 16, "i16x8" } },
switch (type->kind) {
case Type_Kind_Basic: return type->Basic.size;
- case Type_Kind_Pointer: return 4;
+ case Type_Kind_Pointer: return 8;
case Type_Kind_Function: return 4;
case Type_Kind_Array: return type->Array.size;
case Type_Kind_Struct: return type->Struct.size;
case Type_Kind_Enum: return type_size_of(type->Enum.backing);
- case Type_Kind_Slice: return 8;
- case Type_Kind_VarArgs: return 8;
- case Type_Kind_DynArray: return 12;
+ case Type_Kind_Slice: return 16; // HACK: These should not have to be 16 bytes in size, they should only have to be 12,
+ case Type_Kind_VarArgs: return 16; // but there are alignment issues right now with that so I decided to not fight it and just make them 16 bytes in size.
+ case Type_Kind_DynArray: return 16;
case Type_Kind_Compound: return type->Compound.size;
default: return 0;
}
switch (type->kind) {
case Type_Kind_Basic: return type->Basic.alignment;
- case Type_Kind_Pointer: return 4;
+ case Type_Kind_Pointer: return 8;
case Type_Kind_Function: return 4;
case Type_Kind_Array: return type_alignment_of(type->Array.elem);
case Type_Kind_Struct: return type->Struct.alignment;
case Type_Kind_Enum: return type_alignment_of(type->Enum.backing);
- case Type_Kind_Slice: return 4;
- case Type_Kind_VarArgs: return 4;
- case Type_Kind_DynArray: return 4;
+ case Type_Kind_Slice: return 8;
+ case Type_Kind_VarArgs: return 8;
+ case Type_Kind_DynArray: return 8;
case Type_Kind_Compound: return 8; // HACK
default: return 1;
}
}
+u32 type_aligned_size_of(Type* type) {
+ u32 size = type_size_of(type);
+ u32 alignment = type_alignment_of(type);
+
+ bh_align(size, alignment);
+
+ return size;
+}
+
Type* type_build_from_ast(bh_allocator alloc, AstType* type_node) {
if (type_node == NULL) return NULL;
ptr_type->kind = Type_Kind_Pointer;
ptr_type->Pointer.base.flags |= Basic_Flag_Pointer;
- ptr_type->Pointer.base.size = 4;
+ ptr_type->Pointer.base.size = 8;
ptr_type->Pointer.elem = to;
return ptr_type;
}
if (strcmp(member, "count") == 0) {
smem->idx = 1;
- smem->offset = 4;
+ smem->offset = 8;
smem->type = &basic_types[Basic_Kind_U32];
smem->name = "count";
return 1;
}
if (strcmp(member, "count") == 0) {
smem->idx = 1;
- smem->offset = 4;
+ smem->offset = 8;
smem->type = &basic_types[Basic_Kind_U32];
smem->name = "count";
return 1;
}
if (strcmp(member, "capacity") == 0) {
smem->idx = 2;
- smem->offset = 8;
+ smem->offset = 12;
smem->type = &basic_types[Basic_Kind_U32];
smem->name = "capacity";
return 1;
}
if (idx == 1) {
smem->idx = 1;
- smem->offset = 4;
+ smem->offset = 8;
smem->type = &basic_types[Basic_Kind_U32];
smem->name = "count";
return 1;
}
if (idx == 1) {
smem->idx = 1;
- smem->offset = 4;
+ smem->offset = 8;
smem->type = &basic_types[Basic_Kind_U32];
smem->name = "count";
return 1;
}
if (idx == 2) {
smem->idx = 2;
- smem->offset = 8;
+ smem->offset = 12;
smem->type = &basic_types[Basic_Kind_U32];
smem->name = "capacity";
return 1;
i32 is_simd = is_basic && (type->Basic.flags & Basic_Flag_SIMD);
if (is_pointer) {
- WID(WI_I32_STORE, ((WasmInstructionData) { alignment, offset }));
+ WID(WI_I32_STORE, ((WasmInstructionData) { 2, offset }));
} else if (is_integer) {
if (store_size == 1) WID(WI_I32_STORE_8, ((WasmInstructionData) { alignment, offset }));
else if (store_size == 2) WID(WI_I32_STORE_16, ((WasmInstructionData) { alignment, offset }));
if (is_pointer) {
instr = WI_I32_LOAD;
+ alignment = 2;
}
else if (is_integer) {
if (load_size == 1) instr = WI_I32_LOAD_8_S;
WID(WI_GLOBAL_GET, stack_top_idx);
WID(WI_I32_CONST, vararg_offset);
WI(WI_I32_ADD);
- emit_store_instruction(mod, &code, &basic_types[Basic_Kind_I32], stack_grow_amm);
+ emit_store_instruction(mod, &code, &basic_types[Basic_Kind_Rawptr], stack_grow_amm);
+
+ // NOTE: There will be 4 uninitialized bytes here, because pointers are only 4 bytes in WASM.
WID(WI_GLOBAL_GET, stack_top_idx);
WID(WI_I32_CONST, vararg_count);
- emit_store_instruction(mod, &code, &basic_types[Basic_Kind_I32], stack_grow_amm + 4);
+ emit_store_instruction(mod, &code, &basic_types[Basic_Kind_I32], stack_grow_amm + 8);
WID(WI_GLOBAL_GET, stack_top_idx);
WID(WI_I32_CONST, stack_grow_amm);
WI(WI_I32_ADD);
- stack_grow_amm += 8;
+ stack_grow_amm += 12;
break;
}
}
case Ast_Kind_Array_Literal: {
- // assert(("Array literals are not allowed as expressions currently. This will be added in a future update.", 0));
emit_array_literal(mod, &code, (AstArrayLiteral *) expr);
break;
}
// by emit_string_literal.
u32* sdata = (u32 *) data;
sdata[0] = sl->addr;
- sdata[1] = sl->length;
+ sdata[1] = 0x00;
+ sdata[2] = sl->length;
break;
}
case Basic_Kind_I32:
case Basic_Kind_U32:
- case Basic_Kind_Rawptr:
*((i32 *) data) = ((AstNumLit *) node)->value.i;
return;
case Basic_Kind_I64:
case Basic_Kind_U64:
+ case Basic_Kind_Rawptr:
*((i64 *) data) = ((AstNumLit *) node)->value.l;
return;