#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=4", "-falign-functions=1","-falign-jumps=1", "-falign-loops=1","-fomit-frame-pointer",0, "x86_64","-Os",0, "x32","-Os",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, "aarch64","-Os","-fomit-frame-pointer",0, "mips","-Os","-fomit-frame-pointer","-march=mips2",0, "mipsel","-Os","-fomit-frame-pointer","-march=mips2",0, "mips64","-Os","-fomit-frame-pointer",0, "ppc","-Os","-fomit-frame-pointer","-mpowerpc-gpopt","-mpowerpc-gfxopt",0, "ppc64","-Os","-fomit-frame-pointer","-mpowerpc-gpopt","-mpowerpc-gfxopt",0, "ppc64le","-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, 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 *libpthread="-lpthread"; char dashL[1000]; char dashstatic[]="-static"; int i; int mangleopts=0; int printpath=0; char manglebuf[1024]; int m,pie; 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); { m=0; pie=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'; if (!strncmp(shortplatform, "powerpc", 7)) { shortplatform[0] = shortplatform[1] = 'p'; shortplatform[2] = 'c'; memmove(&shortplatform[3], &shortplatform[7], strlen(&shortplatform[7]) + 1); } if (!strcmp(shortplatform, "hppa")) strcpy(shortplatform, "parisc"); if (!strcmp(shortplatform, "mips64el")) strcpy(shortplatform, "mips64"); if (!strncmp(cc, "x86_64-linux-gnux32-", 20) || !strncmp(cc, "x86_64-pc-linux-gnux32-", 23)) strcpy(shortplatform, "x32"); } else { #ifdef __sparc__ #ifdef __arch64__ shortplatform="sparc64"; #else shortplatform="sparc"; #endif #endif #ifdef __powerpc__ shortplatform="ppc"; #endif #ifdef __powerpc64__ #ifdef __LITTLE_ENDIAN__ shortplatform="ppc64le"; #else shortplatform="ppc64"; #endif #endif #ifdef __i386__ shortplatform="i386"; #endif #ifdef __alpha__ shortplatform="alpha"; #endif #ifdef __arm__ shortplatform="arm"; #endif #ifdef __aarch64__ shortplatform="aarch64"; #endif #ifdef __mips64__ shortplatform="mips64"; #else #ifdef __MIPSEL__ shortplatform="mipsel"; #endif #ifdef __MIPSEB__ shortplatform="mips"; #endif #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":(m==33?"x32":"x86_64")); #endif #ifdef __ia64__ shortplatform="ia64"; #endif { char *tmp4=platform+strlen(platform); strcpy(tmp4,shortplatform); shortplatform=tmp4; } } /* MIPS needs special handling. If argv contains -EL, change * platform name to mipsel */ if (!strcmp(shortplatform,"mips")) { for (i=1; i=0) { int len=read(fd,manglebuf,1023); if (len>0) { manglebuf[len]=0; *dest++=manglebuf; for (i=1; i