#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", "-falign-functions=1","-falign-jumps=1", "-falign-loops=1","-fomit-frame-pointer",0, "x86_64","-Os","-fno-omit-frame-pointer",0, "sparc","-Os","-mcpu=supersparc",0, "sparc64","-Os","-m64","-mhard-quad-float",0, "alpha","-Os","-fomit-frame-pointer",0, "arm","-Os","-fomit-frame-pointer",0, "mips","-Os","-fomit-frame-pointer","-mno-abicalls","-fno-pic","-G","0",0, "mipsel","-Os","-fomit-frame-pointer","-mno-abicalls","-fno-pic","-G","0",0, "ppc","-Os","-fomit-frame-pointer","-mpowerpc-gpopt","-mpowerpc-gfxopt",0, "ppc64","-Os","-fomit-frame-pointer","-mpowerpc-gpopt","-mpowerpc-gfxopt",0, "s390","-Os","-fomit-frame-pointer",0, "s390x","-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","-mfancy-math-387",0, 0}; static void usage(void) { __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"); } int main(int argc,char *argv[]) { int _link=0; int compile=0; int preprocess=0; int verbose=0; int profile=0; char* diethome; char* platform; #ifdef __DYN_LIB int shared=0; #endif char* shortplatform=0; #ifdef WANT_SAFEGUARD char safeguard1[]="-include"; char* safeguard2; #endif const char *nostdlib="-nostdlib"; const char *libgcc="-lgcc"; char dashL[1000]; char dashstatic[]="-static"; int i; int mangleopts=0; int printpath=0; char manglebuf[1024]; int m; if (!(diethome = getenv("DIETHOME"))) diethome=DIETHOME; #ifdef WANT_SAFEGUARD safeguard2=alloca(strlen(diethome)+30); strcpy(safeguard2, diethome); strcat(safeguard2, "/include/dietref.h"); #endif platform=alloca(strlen(diethome)+100); strcpy(platform,diethome); #ifdef INSTALLVERSION strcat(platform,"/lib-"); #else #ifndef __DYN_LIB strcat(platform,"/bin-"); #else strcat(platform,"/pic-"); #endif #endif strcpy(dashL,"-L"); do { if (!argv[1]) usage(); if (!strcmp(argv[1],"-v")) { ++argv; --argc; verbose=1; } else if (!strcmp(argv[1],"-Os")) { ++argv; --argc; mangleopts=1; } else if (!strcmp(argv[1],"-L")) { ++argv; --argc; printpath=1; } else break; } while (1); { int i; m=0; for (i=1; i90) 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 __powerpc64__ shortplatform="ppc64"; #endif #ifdef __i386__ shortplatform="i386"; #endif #ifdef __alpha__ shortplatform="alpha"; #endif #ifdef __arm__ shortplatform="arm"; #endif #ifdef __mips__ shortplatform="mips"; #endif #ifdef __s390x__ shortplatform="s390x"; #else #ifdef __s390__ shortplatform="s390"; #endif #endif #ifdef __sh__ shortplatform="sh"; #endif #ifdef __hppa__ shortplatform="parisc"; #endif #ifdef __x86_64__ shortplatform=(m==32?"i386":"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