Add support for B tests; add a test for the B operators (finding several

compiler bugs in the process).
This commit is contained in:
David Given 2016-12-31 17:38:52 +00:00
parent 803b81e3f4
commit 1beedca590
3 changed files with 99 additions and 4 deletions

View file

@ -0,0 +1,57 @@
#
zero 0;
one 1;
two 2;
main()
{
extrn zero, one, two;
auto i;
if (!((two + two) == 4)) fail(__LINE__);
if (!((two - two) == 0)) fail(__LINE__);
if (!((two * two) == 4)) fail(__LINE__);
if (!((two / two) == 1)) fail(__LINE__);
if (!((two % two) == 0)) fail(__LINE__);
if (!(zero == zero)) fail(__LINE__);
if (!(zero != one)) fail(__LINE__);
if (!(zero < one)) fail(__LINE__);
if (!(zero <= one)) fail(__LINE__);
if (!(zero <= zero)) fail(__LINE__);
if (!(one > zero)) fail(__LINE__);
if (!(one >= zero)) fail(__LINE__);
if (!(one >= one)) fail(__LINE__);
if (!((one << 1) == 2)) fail(__LINE__);
if (!((two >> 1) == 1)) fail(__LINE__);
if (!((two & 1) == 0)) fail(__LINE__);
if (!((two | 1) == 3)) fail(__LINE__);
if (!((two ^ 2) == 0)) fail(__LINE__);
i = 2; i =+ two; if (!(i == 4)) fail(__LINE__);
i = 2; i =- two; if (!(i == 0)) fail(__LINE__);
i = 2; i =* two; if (!(i == 4)) fail(__LINE__);
i = 2; i =/ two; if (!(i == 1)) fail(__LINE__);
i = 2; i =% two; if (!(i == 0)) fail(__LINE__);
i = zero; i === zero; if (!i) fail(__LINE__);
i = zero; i =!= one; if (!i) fail(__LINE__);
i = zero; i =< one; if (!i) fail(__LINE__);
i = zero; i =<= one; if (!i) fail(__LINE__);
i = zero; i =<= zero; if (!i) fail(__LINE__);
i = one; i => zero; if (!i) fail(__LINE__);
i = one; i =>= zero; if (!i) fail(__LINE__);
i = one; i =>= one; if (!i) fail(__LINE__);
i = one; i =<< one; if (!(i == 2)) fail(__LINE__);
i = two; i =>> one; if (!(i == 1)) fail(__LINE__);
i = two; i =& 1; if (!(i == 0)) fail(__LINE__);
i = two; i =| 1; if (!(i == 3)) fail(__LINE__);
i = two; i =^ 2; if (!(i == 0)) fail(__LINE__);
finished();
}

View file

@ -12,12 +12,16 @@ definerule("plat_testsuite",
"tests/plat/*.c", "tests/plat/*.c",
"tests/plat/*.e", "tests/plat/*.e",
"tests/plat/*.p", "tests/plat/*.p",
"tests/plat/b/*.b",
"tests/plat/bugs/*.mod" "tests/plat/bugs/*.mod"
) )
acklibrary { acklibrary {
name = "lib", name = "lib",
srcs = { "tests/plat/lib/test.c" }, srcs = {
"tests/plat/lib/test.c",
"tests/plat/lib/test_b.c",
},
hdrs = { hdrs = {
"tests/plat/lib/test.h", "tests/plat/lib/test.h",
"tests/plat/lib/Test.def" "tests/plat/lib/Test.def"
@ -40,7 +44,7 @@ definerule("plat_testsuite",
vars = { vars = {
plat = e.plat, plat = e.plat,
lang = lang, lang = lang,
ackcflags = "-O0" ackcflags = "-O0 -Bmain"
} }
} }
@ -53,7 +57,7 @@ definerule("plat_testsuite",
"util/build+testrunner" "util/build+testrunner"
}, },
commands = { commands = {
"(%{ins[2]} "..e.method.." %{ins[1]} 5 %{ins[3]} || echo FAILED) > %{outs}", "(%{ins[2]} "..e.method.." %{ins[1]} 5 %{ins[3]} || echo @@FAIL) > %{outs}",
} }
} }
end end
@ -63,4 +67,4 @@ definerule("plat_testsuite",
srcs = tests, srcs = tests,
} }
end end
) )

34
tests/plat/lib/test_b.c Normal file
View file

@ -0,0 +1,34 @@
#include <stdint.h>
#include "test.h"
extern void patch_addresses(uintptr_t* module);
extern uintptr_t* bmodule_main;
static void i_writehex(intptr_t code)
{
writehex(code);
}
static void i_fail(intptr_t code)
{
fail(code);
}
uintptr_t b_finished = (uintptr_t)&finished;
uintptr_t b_writehex = (uintptr_t)&i_writehex;
uintptr_t b_fail = (uintptr_t)&i_fail;
static uintptr_t* bmodule_test[] =
{
&b_finished,
&b_writehex,
&b_fail,
0
};
void binit(void)
{
patch_addresses(&bmodule_test);
patch_addresses(&bmodule_main);
}