mirror of
https://github.com/frida/tinycc
synced 2024-12-24 05:56:49 +03:00
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.
This commit is contained in:
parent
e31579b076
commit
ce5e12c2f9
2
tcc.h
2
tcc.h
@ -191,7 +191,7 @@
|
||||
/* library search paths */
|
||||
#ifndef CONFIG_TCC_LIBPATHS
|
||||
# ifdef TCC_TARGET_PE
|
||||
# define CONFIG_TCC_LIBPATHS "{B}/lib"
|
||||
# define CONFIG_TCC_LIBPATHS "{B}/lib;{B}"
|
||||
# else
|
||||
# define CONFIG_TCC_LIBPATHS \
|
||||
CONFIG_SYSROOT "/usr/" CONFIG_LDDIR \
|
||||
|
@ -13,6 +13,7 @@ TESTS = \
|
||||
hello-run \
|
||||
libtest \
|
||||
test3 \
|
||||
abitest-exe \
|
||||
moretests
|
||||
|
||||
# test4 -- problem with -static
|
||||
@ -177,6 +178,15 @@ asmtest: asmtest.ref
|
||||
objdump -D asmtest.o > asmtest.out
|
||||
@if diff -u --ignore-matching-lines="file format" asmtest.ref asmtest.out ; then echo "ASM Auto Test OK"; fi
|
||||
|
||||
# Check that code generated by libtcc is binary compatible with
|
||||
# that generated by CC
|
||||
abitest$(EXESUF): abitest.c $(top_builddir)/$(LIBTCC)
|
||||
$(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS) $(NATIVE_DEFINES) $(LIBS) $(LINK_LIBTCC) $(LDFLAGS) -I$(top_srcdir) -g -O0
|
||||
|
||||
abitest-exe: abitest$(EXESUF)
|
||||
@echo ------------ $@ ------------
|
||||
abitest$(EXESUF) lib_path=..
|
||||
|
||||
# targets for development
|
||||
%.bin: %.c tcc
|
||||
$(TCC) -g -o $@ $<
|
||||
|
80
tests/abitest.c
Normal file
80
tests/abitest.c
Normal file
@ -0,0 +1,80 @@
|
||||
#include <libtcc.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user