aboutsummaryrefslogtreecommitdiff
path: root/libtcc.c
diff options
context:
space:
mode:
authorThomas Preud'homme <robotux@celest.fr>2014-01-07 15:23:54 +0800
committerThomas Preud'homme <robotux@celest.fr>2014-01-08 15:00:52 +0800
commitb6247d1f3c34e93e8603fddf5fc6da8dc6b81d00 (patch)
tree6515756dee0c2310d59990968675e145c5243651 /libtcc.c
parent70a088af874076d8db5d7c2067afd8f2bcde0592 (diff)
downloadtinycc-b6247d1f3c34e93e8603fddf5fc6da8dc6b81d00.tar.gz
tinycc-b6247d1f3c34e93e8603fddf5fc6da8dc6b81d00.tar.bz2
Add support for runtime selection of float ABI
Diffstat (limited to 'libtcc.c')
-rw-r--r--libtcc.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/libtcc.c b/libtcc.c
index 154a266..127806f 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -757,7 +757,7 @@ static int tcc_compile(TCCState *s1)
func_old_type.t = VT_FUNC;
func_old_type.ref = sym_push(SYM_FIELD, &int_type, FUNC_CDECL, FUNC_OLD);
#ifdef TCC_TARGET_ARM
- arm_init_types();
+ arm_init(s1);
#endif
#if 0
@@ -945,9 +945,12 @@ LIBTCCAPI TCCState *tcc_new(void)
tcc_define_symbol(s, "__ARMEL__", NULL);
#if defined(TCC_ARM_EABI)
tcc_define_symbol(s, "__ARM_EABI__", NULL);
+#endif
#if defined(TCC_ARM_HARDFLOAT)
+ s->float_abi = ARM_HARD_FLOAT;
tcc_define_symbol(s, "__ARM_PCS_VFP", NULL);
-#endif
+#else
+ s->float_abi = ARM_SOFTFP_FLOAT;
#endif
#endif
@@ -1628,6 +1631,7 @@ enum {
TCC_OPTION_b,
TCC_OPTION_g,
TCC_OPTION_c,
+ TCC_OPTION_float_abi,
TCC_OPTION_static,
TCC_OPTION_shared,
TCC_OPTION_soname,
@@ -1680,6 +1684,9 @@ static const TCCOption tcc_options[] = {
#endif
{ "g", TCC_OPTION_g, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },
{ "c", TCC_OPTION_c, 0 },
+#ifdef TCC_TARGET_ARM
+ { "mfloat-abi", TCC_OPTION_float_abi, TCC_OPTION_HAS_ARG },
+#endif
{ "static", TCC_OPTION_static, 0 },
{ "shared", TCC_OPTION_shared, 0 },
{ "soname", TCC_OPTION_soname, TCC_OPTION_HAS_ARG },
@@ -1817,6 +1824,18 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv)
case TCC_OPTION_c:
s->output_type = TCC_OUTPUT_OBJ;
break;
+#ifdef TCC_TARGET_ARM
+ case TCC_OPTION_float_abi:
+ /* tcc doesn't support soft float yet */
+ if (!strcmp(optarg, "softfp")) {
+ s->float_abi = ARM_SOFTFP_FLOAT;
+ tcc_undefine_symbol(s, "__ARM_PCS_VFP");
+ } else if (!strcmp(optarg, "hard"))
+ s->float_abi = ARM_HARD_FLOAT;
+ else
+ tcc_error("unsupported float abi '%s'", optarg);
+ break;
+#endif
case TCC_OPTION_static:
s->static_link = 1;
break;