wip
This commit is contained in:
parent
a6cd3bf713
commit
56060f0624
122
src/compiler.bbb
122
src/compiler.bbb
@ -18479,7 +18479,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8
|
||||
library_names = library_buffer[..library_count];
|
||||
library_paths = { .pointer = &llvm_bindings_library, .length = 1 };
|
||||
}
|
||||
else if (string_equal(base_name, "c_abi"))
|
||||
else if (string_equal(base_name, "tests"))
|
||||
{
|
||||
library_paths = { .pointer = &c_abi_library, .length = 1 };
|
||||
}
|
||||
@ -18509,125 +18509,7 @@ compile_file = fn (arena: &Arena, compile_options: CompileFile, envp: &&u8) []u8
|
||||
|
||||
names: [_][]u8 =
|
||||
[
|
||||
"minimal",
|
||||
"comments",
|
||||
"constant_add",
|
||||
"constant_and",
|
||||
"constant_div",
|
||||
"constant_mul",
|
||||
"constant_rem",
|
||||
"constant_or",
|
||||
"constant_sub",
|
||||
"constant_xor",
|
||||
"constant_shift_left",
|
||||
"constant_shift_right",
|
||||
"minimal_stack",
|
||||
"minimal_stack_arithmetic",
|
||||
"minimal_stack_arithmetic2",
|
||||
"minimal_stack_arithmetic3",
|
||||
"stack_negation",
|
||||
"stack_add",
|
||||
"stack_sub",
|
||||
"extend",
|
||||
"integer_max",
|
||||
"integer_hex",
|
||||
"basic_pointer",
|
||||
"basic_call",
|
||||
"basic_branch",
|
||||
"basic_array",
|
||||
"basic_enum",
|
||||
"basic_slice",
|
||||
"basic_string",
|
||||
"basic_varargs",
|
||||
"basic_while",
|
||||
"pointer",
|
||||
"pointer_cast",
|
||||
"u1_return",
|
||||
"local_type_inference",
|
||||
"global",
|
||||
"function_pointer",
|
||||
"extern",
|
||||
"byte_size",
|
||||
"argv",
|
||||
"assignment_operators",
|
||||
"not_pointer",
|
||||
"bits",
|
||||
"bits_no_backing_type",
|
||||
"bits_return_u1",
|
||||
"bits_zero",
|
||||
"comparison",
|
||||
"global_struct",
|
||||
"if_no_else",
|
||||
"if_no_else_void",
|
||||
"indirect",
|
||||
"indirect_struct",
|
||||
"indirect_varargs",
|
||||
"ret_c_bool",
|
||||
"return_type_builtin",
|
||||
"return_u64_u64",
|
||||
"select",
|
||||
"slice",
|
||||
"small_struct_ints",
|
||||
"struct_assignment",
|
||||
"struct",
|
||||
"struct_u64_u64",
|
||||
"struct_varargs",
|
||||
"struct_zero",
|
||||
"unreachable",
|
||||
"varargs",
|
||||
"c_abi0",
|
||||
"c_abi1",
|
||||
"c_med_struct_ints",
|
||||
"c_ret_struct_array",
|
||||
"c_split_struct_ints",
|
||||
"c_string_to_slice",
|
||||
"c_struct_with_array",
|
||||
"c_function_pointer",
|
||||
"basic_bool_call",
|
||||
"abi_enum_bool",
|
||||
"return_small_struct",
|
||||
"c_abi",
|
||||
"string_to_enum",
|
||||
"empty_if",
|
||||
"else_if",
|
||||
"else_if_complicated",
|
||||
"basic_shortcircuiting_if",
|
||||
"shortcircuiting_if",
|
||||
"field_access_left_assign",
|
||||
"for_each",
|
||||
"pointer_decay",
|
||||
"enum_name",
|
||||
"slice_of_slices",
|
||||
"type_alias",
|
||||
"integer_formats",
|
||||
"for_each_int",
|
||||
"bool_array",
|
||||
"basic_union",
|
||||
"break_continue",
|
||||
"constant_global_reference",
|
||||
"concat_logical_or",
|
||||
"strict_array_type",
|
||||
"pointer_struct_initialization",
|
||||
"slice_array_literal",
|
||||
"slice_only_start",
|
||||
"basic_macro",
|
||||
"generic_macro",
|
||||
"generic_pointer_macro",
|
||||
"noreturn_macro",
|
||||
"generic_pointer_array",
|
||||
"self_referential_struct",
|
||||
"forward_declared_type",
|
||||
"enum_array",
|
||||
"opaque",
|
||||
"basic_struct_passing",
|
||||
"enum_arbitrary_abi",
|
||||
"enum_debug_info",
|
||||
"return_array",
|
||||
"bool_pair",
|
||||
"min_max",
|
||||
"field_parent_pointer",
|
||||
"leading_trailing_zeroes",
|
||||
"pointer_sub",
|
||||
"tests",
|
||||
];
|
||||
|
||||
[export] main = fn [cc(c)] (argument_count: u32, argv: &&u8, envp: &&u8) s32
|
||||
|
126
src/compiler.cpp
126
src/compiler.cpp
@ -339,7 +339,7 @@ fn String compile_file(Arena* arena, Compile options)
|
||||
library_names = { library_buffer, library_count };
|
||||
library_paths = { &llvm_bindings_library, 1 };
|
||||
}
|
||||
else if (base_name.equal(string_literal("c_abi")))
|
||||
else if (base_name.equal(string_literal("tests")))
|
||||
{
|
||||
library_paths = { &c_abi_library, 1 };
|
||||
}
|
||||
@ -370,129 +370,7 @@ fn String compile_file(Arena* arena, Compile options)
|
||||
|
||||
global_variable String names[] =
|
||||
{
|
||||
string_literal("minimal"),
|
||||
string_literal("comments"),
|
||||
string_literal("constant_add"),
|
||||
string_literal("constant_and"),
|
||||
string_literal("constant_div"),
|
||||
string_literal("constant_mul"),
|
||||
string_literal("constant_rem"),
|
||||
string_literal("constant_or"),
|
||||
string_literal("constant_sub"),
|
||||
string_literal("constant_xor"),
|
||||
string_literal("constant_shift_left"),
|
||||
string_literal("constant_shift_right"),
|
||||
string_literal("minimal_stack"),
|
||||
string_literal("minimal_stack_arithmetic"),
|
||||
string_literal("minimal_stack_arithmetic2"),
|
||||
string_literal("minimal_stack_arithmetic3"),
|
||||
string_literal("stack_negation"),
|
||||
string_literal("stack_add"),
|
||||
string_literal("stack_sub"),
|
||||
string_literal("extend"),
|
||||
string_literal("integer_max"),
|
||||
string_literal("integer_hex"),
|
||||
string_literal("basic_pointer"),
|
||||
string_literal("basic_call"),
|
||||
string_literal("basic_branch"),
|
||||
string_literal("basic_array"),
|
||||
string_literal("basic_enum"),
|
||||
string_literal("basic_slice"),
|
||||
string_literal("basic_string"),
|
||||
string_literal("basic_varargs"),
|
||||
string_literal("basic_while"),
|
||||
string_literal("pointer"),
|
||||
string_literal("pointer_cast"),
|
||||
string_literal("u1_return"),
|
||||
string_literal("local_type_inference"),
|
||||
string_literal("global"),
|
||||
string_literal("function_pointer"),
|
||||
string_literal("extern"),
|
||||
string_literal("byte_size"),
|
||||
string_literal("argv"),
|
||||
string_literal("assignment_operators"),
|
||||
string_literal("not_pointer"),
|
||||
string_literal("bits"),
|
||||
string_literal("bits_no_backing_type"),
|
||||
string_literal("bits_return_u1"),
|
||||
string_literal("bits_zero"),
|
||||
string_literal("comparison"),
|
||||
string_literal("global_struct"),
|
||||
string_literal("if_no_else"),
|
||||
string_literal("if_no_else_void"),
|
||||
string_literal("indirect"),
|
||||
string_literal("indirect_struct"),
|
||||
string_literal("indirect_varargs"),
|
||||
string_literal("ret_c_bool"),
|
||||
string_literal("return_type_builtin"),
|
||||
string_literal("return_u64_u64"),
|
||||
string_literal("select"),
|
||||
string_literal("slice"),
|
||||
string_literal("small_struct_ints"),
|
||||
string_literal("struct_assignment"),
|
||||
string_literal("struct"),
|
||||
string_literal("struct_u64_u64"),
|
||||
string_literal("struct_varargs"),
|
||||
string_literal("struct_zero"),
|
||||
string_literal("unreachable"),
|
||||
string_literal("varargs"),
|
||||
string_literal("c_abi0"),
|
||||
string_literal("c_abi1"),
|
||||
string_literal("c_med_struct_ints"),
|
||||
string_literal("c_ret_struct_array"),
|
||||
string_literal("c_split_struct_ints"),
|
||||
string_literal("c_string_to_slice"),
|
||||
string_literal("c_struct_with_array"),
|
||||
string_literal("c_function_pointer"),
|
||||
string_literal("basic_bool_call"),
|
||||
string_literal("abi_enum_bool"),
|
||||
string_literal("return_small_struct"),
|
||||
string_literal("c_abi"),
|
||||
string_literal("string_to_enum"),
|
||||
string_literal("empty_if"),
|
||||
string_literal("else_if"),
|
||||
string_literal("else_if_complicated"),
|
||||
string_literal("basic_shortcircuiting_if"),
|
||||
string_literal("shortcircuiting_if"),
|
||||
string_literal("field_access_left_assign"),
|
||||
string_literal("for_each"),
|
||||
string_literal("pointer_decay"),
|
||||
string_literal("enum_name"),
|
||||
string_literal("slice_of_slices"),
|
||||
string_literal("type_alias"),
|
||||
string_literal("integer_formats"),
|
||||
string_literal("for_each_int"),
|
||||
string_literal("bool_array"),
|
||||
string_literal("basic_union"),
|
||||
string_literal("break_continue"),
|
||||
string_literal("constant_global_reference"),
|
||||
string_literal("concat_logical_or"),
|
||||
string_literal("strict_array_type"),
|
||||
string_literal("pointer_struct_initialization"),
|
||||
string_literal("slice_array_literal"),
|
||||
string_literal("slice_only_start"),
|
||||
|
||||
string_literal("basic_macro"),
|
||||
string_literal("generic_macro"),
|
||||
|
||||
string_literal("generic_pointer_macro"),
|
||||
string_literal("noreturn_macro"),
|
||||
string_literal("generic_pointer_array"),
|
||||
|
||||
string_literal("self_referential_struct"),
|
||||
string_literal("forward_declared_type"),
|
||||
|
||||
string_literal("enum_array"),
|
||||
string_literal("opaque"),
|
||||
string_literal("basic_struct_passing"),
|
||||
string_literal("enum_arbitrary_abi"),
|
||||
string_literal("enum_debug_info"),
|
||||
string_literal("return_array"),
|
||||
string_literal("bool_pair"),
|
||||
string_literal("min_max"),
|
||||
string_literal("field_parent_pointer"),
|
||||
string_literal("leading_trailing_zeroes"),
|
||||
string_literal("pointer_sub"),
|
||||
string_literal("tests"),
|
||||
};
|
||||
|
||||
void entry_point(Slice<char* const> arguments, Slice<char* const> envp)
|
||||
|
280
tests/c_abi.bbb
280
tests/c_abi.bbb
@ -148,146 +148,6 @@ require = fn (ok: u1) void
|
||||
}
|
||||
}
|
||||
|
||||
[export] main = fn [cc(c)] () s32
|
||||
{
|
||||
run_c_tests();
|
||||
c_u8(0xff);
|
||||
c_u16(0xfffe);
|
||||
c_u32(0xfffffffd);
|
||||
c_u64(0xfffffffffffffffc);
|
||||
|
||||
//if (has_i128) {
|
||||
// c_struct_u128({ .value = 0xfffffffffffffffc, });
|
||||
//}
|
||||
|
||||
c_s8(-1);
|
||||
c_s16(-2);
|
||||
c_s32(-3);
|
||||
c_s64(-4);
|
||||
|
||||
//if (has_i128) {
|
||||
// c_struct_i128({ .value = -6, });
|
||||
//}
|
||||
|
||||
c_bool(1);
|
||||
|
||||
c_five_integers(12, 34, 56, 78, 90);
|
||||
|
||||
>s = c_ret_struct_u64_u64();
|
||||
require(s.a == 21);
|
||||
require(s.b == 22);
|
||||
c_struct_u64_u64_0({ .a = 23, .b = 24, });
|
||||
c_struct_u64_u64_1(0, { .a = 25, .b = 26, });
|
||||
c_struct_u64_u64_2(0, 1, { .a = 27, .b = 28, });
|
||||
c_struct_u64_u64_3(0, 1, 2, { .a = 29, .b = 30, });
|
||||
c_struct_u64_u64_4(0, 1, 2, 3, { .a = 31, .b = 32, });
|
||||
c_struct_u64_u64_5(0, 1, 2, 3, 4, { .a = 33, .b = 34, });
|
||||
c_struct_u64_u64_6(0, 1, 2, 3, 4, 5, { .a = 35, .b = 36, });
|
||||
c_struct_u64_u64_7(0, 1, 2, 3, 4, 5, 6, { .a = 37, .b = 38, });
|
||||
c_struct_u64_u64_8(0, 1, 2, 3, 4, 5, 6, 7, { .a = 39, .b = 40, });
|
||||
|
||||
>big_struct: BigStruct = {
|
||||
.a = 1,
|
||||
.b = 2,
|
||||
.c = 3,
|
||||
.d = 4,
|
||||
.e = 5,
|
||||
};
|
||||
c_big_struct(big_struct);
|
||||
|
||||
>small: SmallStructInts = {
|
||||
.a = 1,
|
||||
.b = 2,
|
||||
.c = 3,
|
||||
.d = 4,
|
||||
};
|
||||
c_small_struct_ints(small);
|
||||
>small2 = c_ret_small_struct_ints();
|
||||
require(small2.a == 1);
|
||||
require(small2.b == 2);
|
||||
require(small2.c == 3);
|
||||
require(small2.d == 4);
|
||||
|
||||
>med: MedStructInts = {
|
||||
.x = 1,
|
||||
.y = 2,
|
||||
.z = 3,
|
||||
};
|
||||
c_med_struct_ints(med);
|
||||
>med2 = c_ret_med_struct_ints();
|
||||
require(med2.x == 1);
|
||||
require(med2.y == 2);
|
||||
require(med2.z == 3);
|
||||
|
||||
>p: SmallPackedStruct = { .a = 0, .b = 1, .c = 2, .d = 3, };
|
||||
c_small_packed_struct(p);
|
||||
>p2 = c_ret_small_packed_struct();
|
||||
require(p2.a == 0);
|
||||
require(p2.b == 1);
|
||||
require(p2.c == 2);
|
||||
require(p2.d == 3);
|
||||
|
||||
>split: SplitStructInt = {
|
||||
.a = 1234,
|
||||
.b = 100,
|
||||
.c = 1337,
|
||||
};
|
||||
c_split_struct_ints(split);
|
||||
|
||||
> big: BigStruct = {
|
||||
.a = 1,
|
||||
.b = 2,
|
||||
.c = 3,
|
||||
.d = 4,
|
||||
.e = 5,
|
||||
};
|
||||
>big2 = c_big_struct_both(big);
|
||||
require(big2.a == 10);
|
||||
require(big2.b == 11);
|
||||
require(big2.c == 12);
|
||||
require(big2.d == 13);
|
||||
require(big2.e == 14);
|
||||
|
||||
>r1: Rect = {
|
||||
.left = 1,
|
||||
.right = 21,
|
||||
.top = 16,
|
||||
.bottom = 4,
|
||||
};
|
||||
>r2: Rect = {
|
||||
.left = 178,
|
||||
.right = 189,
|
||||
.top = 21,
|
||||
.bottom = 15,
|
||||
};
|
||||
c_multiple_struct_ints(r1, r2);
|
||||
|
||||
require(c_ret_bool() == 1);
|
||||
|
||||
require(c_ret_u8() == 0xff);
|
||||
require(c_ret_u16() == 0xffff);
|
||||
require(c_ret_u32() == 0xffffffff);
|
||||
require(c_ret_u64() == 0xffffffffffffffff);
|
||||
|
||||
require(c_ret_s8() == -1);
|
||||
require(c_ret_s16() == -1);
|
||||
require(c_ret_s32() == -1);
|
||||
require(c_ret_s64() == -1);
|
||||
|
||||
c_struct_with_array({ .a = 1, .padding = [0, 0, 0, 0], .b = 2, });
|
||||
|
||||
>x = c_ret_struct_with_array();
|
||||
require(x.a == 4);
|
||||
require(x.b == 155);
|
||||
|
||||
>res = c_modify_by_ref_param({ .val = 1, .arr = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] });
|
||||
require(res.val == 42);
|
||||
|
||||
>function_pointer = &c_func_ptr_byval;
|
||||
function_pointer(1, 2, { .origin = { .x = 9, .y = 10, .z = 11, }, .size = { .width = 12, .height = 13, .depth = 14, }, }, 3, 4, 5);
|
||||
return 0;
|
||||
}
|
||||
|
||||
[export] bb_u8 = fn [cc(c)] (x: u8) void
|
||||
{
|
||||
require(x == 0xff);
|
||||
@ -537,3 +397,143 @@ require = fn (ok: u1) void
|
||||
require(s.y == 2);
|
||||
require(s.z == 3);
|
||||
}
|
||||
|
||||
[export] main = fn [cc(c)] () s32
|
||||
{
|
||||
run_c_tests();
|
||||
c_u8(0xff);
|
||||
c_u16(0xfffe);
|
||||
c_u32(0xfffffffd);
|
||||
c_u64(0xfffffffffffffffc);
|
||||
|
||||
//if (has_i128) {
|
||||
// c_struct_u128({ .value = 0xfffffffffffffffc, });
|
||||
//}
|
||||
|
||||
c_s8(-1);
|
||||
c_s16(-2);
|
||||
c_s32(-3);
|
||||
c_s64(-4);
|
||||
|
||||
//if (has_i128) {
|
||||
// c_struct_i128({ .value = -6, });
|
||||
//}
|
||||
|
||||
c_bool(1);
|
||||
|
||||
c_five_integers(12, 34, 56, 78, 90);
|
||||
|
||||
>s = c_ret_struct_u64_u64();
|
||||
require(s.a == 21);
|
||||
require(s.b == 22);
|
||||
c_struct_u64_u64_0({ .a = 23, .b = 24, });
|
||||
c_struct_u64_u64_1(0, { .a = 25, .b = 26, });
|
||||
c_struct_u64_u64_2(0, 1, { .a = 27, .b = 28, });
|
||||
c_struct_u64_u64_3(0, 1, 2, { .a = 29, .b = 30, });
|
||||
c_struct_u64_u64_4(0, 1, 2, 3, { .a = 31, .b = 32, });
|
||||
c_struct_u64_u64_5(0, 1, 2, 3, 4, { .a = 33, .b = 34, });
|
||||
c_struct_u64_u64_6(0, 1, 2, 3, 4, 5, { .a = 35, .b = 36, });
|
||||
c_struct_u64_u64_7(0, 1, 2, 3, 4, 5, 6, { .a = 37, .b = 38, });
|
||||
c_struct_u64_u64_8(0, 1, 2, 3, 4, 5, 6, 7, { .a = 39, .b = 40, });
|
||||
|
||||
>big_struct: BigStruct = {
|
||||
.a = 1,
|
||||
.b = 2,
|
||||
.c = 3,
|
||||
.d = 4,
|
||||
.e = 5,
|
||||
};
|
||||
c_big_struct(big_struct);
|
||||
|
||||
>small: SmallStructInts = {
|
||||
.a = 1,
|
||||
.b = 2,
|
||||
.c = 3,
|
||||
.d = 4,
|
||||
};
|
||||
c_small_struct_ints(small);
|
||||
>small2 = c_ret_small_struct_ints();
|
||||
require(small2.a == 1);
|
||||
require(small2.b == 2);
|
||||
require(small2.c == 3);
|
||||
require(small2.d == 4);
|
||||
|
||||
>med: MedStructInts = {
|
||||
.x = 1,
|
||||
.y = 2,
|
||||
.z = 3,
|
||||
};
|
||||
c_med_struct_ints(med);
|
||||
>med2 = c_ret_med_struct_ints();
|
||||
require(med2.x == 1);
|
||||
require(med2.y == 2);
|
||||
require(med2.z == 3);
|
||||
|
||||
>p: SmallPackedStruct = { .a = 0, .b = 1, .c = 2, .d = 3, };
|
||||
c_small_packed_struct(p);
|
||||
>p2 = c_ret_small_packed_struct();
|
||||
require(p2.a == 0);
|
||||
require(p2.b == 1);
|
||||
require(p2.c == 2);
|
||||
require(p2.d == 3);
|
||||
|
||||
>split: SplitStructInt = {
|
||||
.a = 1234,
|
||||
.b = 100,
|
||||
.c = 1337,
|
||||
};
|
||||
c_split_struct_ints(split);
|
||||
|
||||
> big: BigStruct = {
|
||||
.a = 1,
|
||||
.b = 2,
|
||||
.c = 3,
|
||||
.d = 4,
|
||||
.e = 5,
|
||||
};
|
||||
>big2 = c_big_struct_both(big);
|
||||
require(big2.a == 10);
|
||||
require(big2.b == 11);
|
||||
require(big2.c == 12);
|
||||
require(big2.d == 13);
|
||||
require(big2.e == 14);
|
||||
|
||||
>r1: Rect = {
|
||||
.left = 1,
|
||||
.right = 21,
|
||||
.top = 16,
|
||||
.bottom = 4,
|
||||
};
|
||||
>r2: Rect = {
|
||||
.left = 178,
|
||||
.right = 189,
|
||||
.top = 21,
|
||||
.bottom = 15,
|
||||
};
|
||||
c_multiple_struct_ints(r1, r2);
|
||||
|
||||
require(c_ret_bool() == 1);
|
||||
|
||||
require(c_ret_u8() == 0xff);
|
||||
require(c_ret_u16() == 0xffff);
|
||||
require(c_ret_u32() == 0xffffffff);
|
||||
require(c_ret_u64() == 0xffffffffffffffff);
|
||||
|
||||
require(c_ret_s8() == -1);
|
||||
require(c_ret_s16() == -1);
|
||||
require(c_ret_s32() == -1);
|
||||
require(c_ret_s64() == -1);
|
||||
|
||||
c_struct_with_array({ .a = 1, .padding = [0, 0, 0, 0], .b = 2, });
|
||||
|
||||
>x = c_ret_struct_with_array();
|
||||
require(x.a == 4);
|
||||
require(x.b == 155);
|
||||
|
||||
>res = c_modify_by_ref_param({ .val = 1, .arr = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] });
|
||||
require(res.val == 42);
|
||||
|
||||
>function_pointer = &c_func_ptr_byval;
|
||||
function_pointer(1, 2, { .origin = { .x = 9, .y = 10, .z = 11, }, .size = { .width = 12, .height = 13, .depth = 14, }, }, 3, 4, 5);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
result: s32 = 0;
|
||||
|
||||
[export] main = fn [cc(c)] () s32 {
|
||||
[export] main = fn [cc(c)] () s32
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ foo = fn (slices: [][]u8) void
|
||||
#trap();
|
||||
}
|
||||
}
|
||||
|
||||
[export] main = fn [cc(c)] () s32
|
||||
{
|
||||
>some_bool: u1 = 0;
|
||||
|
2328
tests/tests.bbb
Normal file
2328
tests/tests.bbb
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user