#include #include #include #include #include #include #include "dietfeatures.h" /* goal: * when invoked as * "diet gcc -c t.c" * exec * "gcc -I/path/to/dietlibc/include -c t.c" * * when invoked as * "diet sparc-linux-gcc -o t t.o" * exec * "sparc-linux-gcc -nostdlib -static -o t t.o /path/to/dietlibc/bin-sparc/start.o /path/to/dietlibc/bin-sparc/dietlibc.a" */ static void error(const char *message) { __write2(message); exit(1); } static const char* Os[] = { "i386","-Os","-mpreferred-stack-boundary=2", "-malign-functions=0","-malign-jumps=0", "-malign-loops=0","-fomit-frame-pointer",0, "x86_64","-Os","-fno-omit-frame-pointer",0, "sparc","-Os","-mcpu=supersparc",0, "sparc64","-Os","-m64",0, "alpha","-Os","-fomit-frame-pointer",0, "arm","-Os","-fomit-frame-pointer",0, "mips","-Os","-fomit-frame-pointer","-mno-abicalls","-G","8","-fno-pic",0, "ppc","-Os","-fomit-frame-pointer","-mpowerpc-gpopt","-mpowerpc-gfxopt",0, "s390","-Os","-fomit-frame-pointer",0, "sh","-Os","-fomit-frame-pointer",0, "ia64","-Os","-fno-omit-frame-pointer",0, "x86_64","-Os","-fstrict-aliasing","-momit-leaf-frame-pointer","-mfance-math-387",0, 0}; int main(int argc,char *argv[]) { int _link=0; int compile=0; int preprocess=0; int verbose=0; int profile=0; char diethome[]=DIETHOME; char platform[1000]; #ifdef __DYN_LIB int shared=0; #endif char* shortplatform=0; #ifdef WANT_SAFEGUARD char safeguard1[]="-include"; char safeguard2[]=DIETHOME "/include/dietref.h"; #endif const char *nostdlib="-nostdlib"; const char *libgcc="-lgcc"; char dashL[1000]; char dashstatic[]="-static"; int i; int mangleopts=0; char manglebuf[1024]; #ifdef INSTALLVERSION strcpy(platform,DIETHOME "/lib-"); #else #ifndef __DYN_LIB strcpy(platform,DIETHOME "/bin-"); #else strcpy(platform,DIETHOME "/pic-"); #endif #endif strcpy(dashL,"-L"); if (argc<2) { usage: if (verbose) { __write2( #ifdef __DYN_LIB "dyn-" #endif "diet version " VERSION #ifndef INSTALLVERSION " (non-install version in source tree)" #endif "\n\n"); } error("usage: diet [-v] [-Os] gcc command line\n" "e.g. diet -Os gcc -c t.c\n" "or diet sparc-linux-gcc -o foo foo.c bar.o\n"); } if (!strcmp(argv[1],"-v")) { ++argv; --argc; verbose=1; } if (argv[1] && !strcmp(argv[1],"-Os")) { ++argv; --argc; mangleopts=1; } if (!argv[1]) goto usage; { char *tmp=strchr(argv[1],0)-2; char *tmp2,*tmp3; char *cc=argv[1]; if (tmp90) error("platform name too long!\n"); shortplatform=platform+len; memmove(shortplatform,argv[1],(size_t)(tmp2-cc)); platform[tmp2-cc+len]=0; if (shortplatform[0]=='i' && shortplatform[2]=='8' && shortplatform[3]=='6') shortplatform[1]='3'; } else { #ifdef __sparc__ #ifdef __arch64__ shortplatform="sparc64"; #else shortplatform="sparc"; #endif #endif #ifdef __powerpc__ shortplatform="ppc"; #endif #ifdef __i386__ shortplatform="i386"; #endif #ifdef __alpha__ shortplatform="alpha"; #endif #ifdef __arm__ shortplatform="arm"; #endif #ifdef __mips__ shortplatform="mips"; #endif #ifdef __s390__ shortplatform="s390"; #endif #ifdef __sh__ shortplatform="sh"; #endif #ifdef __hppa__ shortplatform="parisc"; #endif #ifdef __x86_64__ shortplatform="x86_64"; #endif #ifdef __ia64__ shortplatform="ia64"; #endif { char *tmp=platform+strlen(platform); strcpy(tmp,shortplatform); shortplatform=tmp; } } /* MIPS needs special handling. If argv contains -EL, change * platform name to mipsel */ if (!strcmp(shortplatform,"mips")) { int i; for (i=1; i=0) { int len=read(fd,manglebuf,1023); if (len>0) { int i; manglebuf[len]=0; *dest++=manglebuf; for (i=1; i