From 15e0dc08a67003f72c59a1f06d762245824d2ae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gl=C3=B6ckner?= Date: Fri, 5 Sep 2008 21:08:37 +0200 Subject: [PATCH] Allow to use libgcc instead of libtcc1 This patch adds a switch --with-libgcc to configure. When passed it prevents libtcc1.a from being built and links to /lib/libgcc_s.so.1 instead of PREFIX/lib/tcc/libtcc1.a. It will work on ARM when using libgcc from GCC >= 4.2.0. Prior versions don't have the __floatun[sd]i[sdx]f functions. It won't work on i386 because of two missing symbols emitted when floats are cast to integers, but users can provide those symbols (global short constants) in their code if needed. Daniel --- Makefile | 17 +++++++++++++---- configure | 9 +++++++++ tccelf.c | 6 ++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 3ccebe3..1e6adad 100644 --- a/Makefile +++ b/Makefile @@ -51,11 +51,17 @@ PROGS+=c67-tcc$(EXESUF) i386-win32-tcc$(EXESUF) endif endif +ifdef CONFIG_USE_LIBGCC +LIBTCC1= +else +LIBTCC1=libtcc1.a +endif + # run local version of tcc with local libraries and includes TCC=./tcc -B. -I. all: $(PROGS) \ - libtcc1.a $(BCHECK_O) tcc-doc.html tcc.1 libtcc.a \ + $(LIBTCC1) $(BCHECK_O) tcc-doc.html tcc.1 libtcc.a \ libtcc_test$(EXESUF) Makefile: config.mak @@ -214,7 +220,7 @@ bcheck.o: bcheck.c install: tcc_install libinstall -tcc_install: $(PROGS) tcc.1 libtcc1.a $(BCHECK_O) tcc-doc.html +tcc_install: $(PROGS) tcc.1 $(LIBTCC1) $(BCHECK_O) tcc-doc.html mkdir -p "$(DESTDIR)$(bindir)" $(INSTALL) -s -m755 $(PROGS) "$(DESTDIR)$(bindir)" ifndef CONFIG_WIN32 @@ -225,11 +231,14 @@ endif mkdir -p "$(DESTDIR)$(tccdir)/include" ifdef CONFIG_WIN32 mkdir -p "$(DESTDIR)$(tccdir)/lib" - $(INSTALL) -m644 libtcc1.a win32/lib/*.def "$(DESTDIR)$(tccdir)/lib" + $(INSTALL) -m644 $(LIBTCC1) win32/lib/*.def "$(DESTDIR)$(tccdir)/lib" cp -r win32/include/. "$(DESTDIR)$(tccdir)/include" cp -r win32/examples/. "$(DESTDIR)$(tccdir)/examples" else - $(INSTALL) -m644 libtcc1.a $(BCHECK_O) "$(DESTDIR)$(tccdir)" +ifndef CONFIG_USE_LIBGCC + $(INSTALL) -m644 libtcc1.a "$(DESTDIR)$(tccdir)" +endif + $(INSTALL) -m644 $(BCHECK_O) "$(DESTDIR)$(tccdir)" $(INSTALL) -m644 stdarg.h stddef.h stdbool.h float.h varargs.h \ tcclib.h "$(DESTDIR)$(tccdir)/include" endif diff --git a/configure b/configure index 8517485..63328cc 100755 --- a/configure +++ b/configure @@ -19,6 +19,7 @@ TMPH="${TMPDIR1}/tcc-conf-${RANDOM}-$$-${RANDOM}.h" # default parameters build_cross="no" +use_libgcc="no" prefix="" execprefix="" bindir="" @@ -127,6 +128,8 @@ for opt do ;; --enable-cross) build_cross="yes" ;; + --with-libgcc) use_libgcc="yes" + ;; esac done @@ -224,6 +227,7 @@ echo " --cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]" echo " --sysroot=PREFIX prepend PREFIX to library/include paths []" echo " --cc=CC use C compiler CC [$cc]" echo " --make=MAKE use specified make [$make]" +echo " --with-libgcc use /lib/libgcc_s.so.1 instead of libtcc1.a" echo "" #echo "NOTE: The object files are build at the place where configure is launched" exit 1 @@ -279,6 +283,7 @@ echo "CPU $cpu" echo "Big Endian $bigendian" echo "gprof enabled $gprof" echo "cross compilers $build_cross" +echo "use libgcc $use_libgcc" echo "Creating config.mak and config.h" @@ -345,6 +350,10 @@ fi if test "$build_cross" = "yes" ; then echo "CONFIG_CROSS=yes" >> config.mak fi +if test "$use_libgcc" = "yes" ; then + echo "#define CONFIG_USE_LIBGCC" >> $TMPH + echo "CONFIG_USE_LIBGCC=yes" >> config.mak +fi version=`head $source_path/VERSION` echo "VERSION=$version" >>config.mak echo "#define TCC_VERSION \"$version\"" >> $TMPH diff --git a/tccelf.c b/tccelf.c index 7de8a48..aa2df9b 100644 --- a/tccelf.c +++ b/tccelf.c @@ -992,7 +992,9 @@ static void add_init_array_defines(TCCState *s1, const char *section_name) /* add tcc runtime libraries */ static void tcc_add_runtime(TCCState *s1) { +#if defined(CONFIG_TCC_BCHECK) || !defined(CONFIG_USE_LIBGCC) char buf[1024]; +#endif #ifdef CONFIG_TCC_BCHECK if (do_bounds_check) { @@ -1028,8 +1030,12 @@ static void tcc_add_runtime(TCCState *s1) if (!s1->nostdlib) { tcc_add_library(s1, "c"); +#ifdef CONFIG_USE_LIBGCC + tcc_add_file(s1, CONFIG_SYSROOT "/lib/libgcc_s.so.1"); +#else snprintf(buf, sizeof(buf), "%s/%s", tcc_lib_path, "libtcc1.a"); tcc_add_file(s1, buf); +#endif } /* add crt end if not memory output */ if (s1->output_type != TCC_OUTPUT_MEMORY && !s1->nostdlib) {