From ce5e12c2f950052d8109b6b7a56d900547705c08 Mon Sep 17 00:00:00 2001 From: James Lyon Date: Wed, 17 Apr 2013 21:51:51 +0100 Subject: Added ABI compatibility tests with native compiler using libtcc. Only one test so far, which fails on Windows (with MinGW as the native compiler - I've tested the MinGW output against MSVC and it appears the two are compatible). I've also had to modify tcc.h so that tcc_set_lib_path can point to the directory containing libtcc1.a on Windows to make the libtcc dependent tests work. I'm not sure this is the right way to fix this problem. --- tests/abitest.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 tests/abitest.c (limited to 'tests/abitest.c') diff --git a/tests/abitest.c b/tests/abitest.c new file mode 100644 index 0000000..51a30ba --- /dev/null +++ b/tests/abitest.c @@ -0,0 +1,80 @@ +#include +#include +#include +#include + +static const char *tccdir = NULL; + +typedef int (*callback_type) (void*); + +/* + * Compile source code and call a callback with a pointer to the symbol "f". + */ +static int run_callback(const char *src, callback_type callback) { + TCCState *s; + int result; + void *ptr; + + s = tcc_new(); + if (!s) + return -1; + if (tccdir) + tcc_set_lib_path(s, tccdir); + if (tcc_set_output_type(s, TCC_OUTPUT_MEMORY) == -1) + return -1; + if (tcc_compile_string(s, src) == -1) + return -1; + if (tcc_relocate(s, TCC_RELOCATE_AUTO) == -1) + return -1; + + ptr = tcc_get_symbol(s, "f"); + if (!ptr) + return -1; + result = callback(ptr); + + tcc_delete(s); + + return result; +} + +typedef struct test1_type_s {int x, y;} test1_type; +typedef test1_type (*test1_function_type) (); + +static int test1_callback(void *ptr) { + test1_type r; + r = ((test1_function_type)ptr)(); + return ((r.x == 10) && (r.y == 35)) ? 0 : -1; +} + +static int test1() { + const char *src = + "typedef struct test1_type_s {int x, y;} test1_type;" + "test1_type f() {\n" + " test1_type r = {10, 35};\n" + " return r;\n" + "}\n"; + + return run_callback(src, test1_callback); +} + +#define RUN_TEST(t) \ + do { \ + fputs(#t "... ", stdout); \ + fflush(stdout); \ + if (t() == 0) { \ + fputs("success\n", stdout); \ + } else { \ + fputs("failure\n", stdout); \ + retval = EXIT_FAILURE; \ + } \ + } while (0); + +int main(int argc, char **argv) { + int retval = EXIT_SUCCESS; + /* if tcclib.h and libtcc1.a are not installed, where can we find them */ + if (argc == 2 && !memcmp(argv[1], "lib_path=",9)) + tccdir = argv[1] + 9; + + RUN_TEST(test1); + return retval; +} -- cgit v1.3.1