aboutsummaryrefslogtreecommitdiff
path: root/tcc.c
diff options
context:
space:
mode:
authorHenry Kroll III <henry@comptune.com>2010-12-06 16:17:20 -0800
committerHenry Kroll III <henry@comptune.com>2010-12-06 16:17:20 -0800
commitbb7bb37fe2eb47a35edcb4a5d4de62c044aafabf (patch)
tree2d667f99ce2547b807ba262f555f6ce366aad059 /tcc.c
parent33f86ada92cdd25864e37947ecd487f567ee6782 (diff)
downloadtinycc-bb7bb37fe2eb47a35edcb4a5d4de62c044aafabf.tar.gz
tinycc-bb7bb37fe2eb47a35edcb4a5d4de62c044aafabf.tar.bz2
tcc: add -m32 option to x86_64 cross compilers
Diffstat (limited to 'tcc.c')
-rw-r--r--tcc.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/tcc.c b/tcc.c
index 817eb68..692d355 100644
--- a/tcc.c
+++ b/tcc.c
@@ -212,6 +212,36 @@ static int expand_args(char ***pargv, const char *str)
return argc;
}
+void exec_other_tcc(TCCState *s, int argc,char **argv,int optarg)
+{
+#ifdef TCC_TARGET_X86_64
+#define WIN32_CAST
+ char arg[20]="i386-tcc";
+ char sep='/',*tcc;
+ if (32 == optarg) {/* -m32 launches 32 bit tcc */
+#ifdef TCC_TARGET_PE
+#ifdef _WIN32
+#define WIN32_CAST (const char**)(const char *)
+ strcpy(arg,"tcc.exe");
+ sep='\\';
+#else
+ strcpy(arg,"i386-win32-tcc");
+#endif
+#endif
+ if (!(tcc=strrchr(argv[0],sep)))
+ tcc=argv[0];
+ else tcc++;
+ if (0<s->verbose) printf("%s->%s\n",tcc,arg);
+ if (strcmp(tcc,arg)) {
+ execvp(arg, WIN32_CAST (argv));
+ error("cross compiler not found!");
+ exit(1);
+#undef WIN32_CAST
+ } else warning("-m32 infinite loop prevented");
+ } else warning("usupported option \"-m%s\"",optarg);
+#endif
+}
+
static int parse_args(TCCState *s, int argc, char **argv)
{
int optind;
@@ -334,7 +364,10 @@ static int parse_args(TCCState *s, int argc, char **argv)
output_type = TCC_OUTPUT_DLL;
break;
case TCC_OPTION_soname:
- s->soname = optarg;
+ s->soname = optarg;
+ break;
+ case TCC_OPTION_m:
+ exec_other_tcc(s,argc+1,argv-1,atoi(optarg));
break;
case TCC_OPTION_o:
multiple_files = 1;