void out_config_init( int model, // 32: 32 bit code // 64: 64 bit code // Windows: set bit 0 to generate MS-COFF instead of OMF bool exe, // true: exe file // false: dll or shared library (generate PIC code) bool trace, // add profiling code bool nofloat, // do not pull in floating point code bool verbose, // verbose compile bool optimize, // optimize code int symdebug, // add symbolic debug information // 1: D // 2: fake it with C symbolic debug info bool alwaysframe, // always create standard function frame bool stackstomp, // add stack stomping code unsigned char avx, // use AVX instruction set (0, 1, 2) bool betterC // implement "Better C" ) { #if MARS //printf("out_config_init()\n"); if (!config.target_cpu) { config.target_cpu = TARGET_PentiumPro; config.target_scheduler = config.target_cpu; } config.fulltypes = CVNONE; config.fpxmmregs = FALSE; config.inline8087 = 1; config.memmodel = 0; config.flags |= CFGuchar; // make sure TYchar is unsigned tytab[TYchar] |= TYFLuns; bool mscoff = model & 1; model &= 32 | 64; #if TARGET_WINDOS if (model == 64) { config.exe = EX_WIN64; config.fpxmmregs = TRUE; config.avx = avx; config.ehmethod = betterC ? EH_NONE : EH_DM; // Not sure we really need these two lines, try removing them later config.flags |= CFGnoebp; config.flags |= CFGalwaysframe; config.flags |= CFGromable; // put switch tables in code segment config.objfmt = OBJ_MSCOFF; } else { config.exe = EX_WIN32; config.ehmethod = betterC ? EH_NONE : EH_WIN32; config.objfmt = mscoff ? OBJ_MSCOFF : OBJ_OMF; } if (exe) config.wflags |= WFexe; // EXE file only optimizations config.flags4 |= CFG4underscore; #endif #if TARGET_LINUX if (model == 64) { config.exe = EX_LINUX64; config.ehmethod = betterC ? EH_NONE : EH_DWARF; config.fpxmmregs = TRUE; config.avx = avx; } else { config.exe = EX_LINUX; config.ehmethod = betterC ? EH_NONE : EH_DWARF; if (!exe) config.flags |= CFGromable; // put switch tables in code segment } config.flags |= CFGnoebp; if (!exe) { config.flags3 |= CFG3pic; config.flags |= CFGalwaysframe; // PIC needs a frame for TLS fixups } config.objfmt = OBJ_ELF; #endif #if TARGET_OSX config.fpxmmregs = TRUE; config.avx = avx; if (model == 64) { config.exe = EX_OSX64; config.fpxmmregs = TRUE; config.ehmethod = betterC ? EH_NONE : EH_DWARF; } else { config.exe = EX_OSX; config.ehmethod = betterC ? EH_NONE : EH_DWARF; } config.flags |= CFGnoebp; if (!exe) { config.flags3 |= CFG3pic; config.flags |= CFGalwaysframe; // PIC needs a frame for TLS fixups } config.flags |= CFGromable; // put switch tables in code segment config.objfmt = OBJ_MACH; #endif #if TARGET_FREEBSD if (model == 64) { config.exe = EX_FREEBSD64; config.ehmethod = betterC ? EH_NONE : EH_DWARF; config.fpxmmregs = TRUE; config.avx = avx; } else { config.exe = EX_FREEBSD; config.ehmethod = betterC ? EH_NONE : EH_DWARF; if (!exe) config.flags |= CFGromable; // put switch tables in code segment } config.flags |= CFGnoebp; if (!exe) { config.flags3 |= CFG3pic; config.flags |= CFGalwaysframe; // PIC needs a frame for TLS fixups } config.objfmt = OBJ_ELF; #endif #if TARGET_OPENBSD if (model == 64) { config.exe = EX_OPENBSD64; config.fpxmmregs = TRUE; config.avx = avx; } else { config.exe = EX_OPENBSD; if (!exe) config.flags |= CFGromable; // put switch tables in code segment } config.flags |= CFGnoebp; config.flags |= CFGalwaysframe; if (!exe) config.flags3 |= CFG3pic; config.objfmt = OBJ_ELF; config.ehmethod = betterC ? EH_NONE : EH_DM; #endif #if TARGET_SOLARIS if (model == 64) { config.exe = EX_SOLARIS64; config.fpxmmregs = TRUE; config.avx = avx; } else { config.exe = EX_SOLARIS; if (!exe) config.flags |= CFGromable; // put switch tables in code segment } config.flags |= CFGnoebp; config.flags |= CFGalwaysframe; if (!exe) config.flags3 |= CFG3pic; config.objfmt = OBJ_ELF; config.ehmethod = betterC ? EH_NONE : EH_DM; #endif config.flags2 |= CFG2nodeflib; // no default library config.flags3 |= CFG3eseqds; #if 0 if (env->getEEcontext()->EEcompile != 2) config.flags4 |= CFG4allcomdat; if (env->nochecks()) config.flags4 |= CFG4nochecks; // no runtime checking #elif TARGET_OSX #else config.flags4 |= CFG4allcomdat; #endif if (trace) config.flags |= CFGtrace; // turn on profiler if (nofloat) config.flags3 |= CFG3wkfloat; configv.verbose = verbose; if (optimize) go_flag((char *)"-o"); if (symdebug) { #if SYMDEB_DWARF configv.addlinenumbers = 1; config.fulltypes = (symdebug == 1) ? CVDWARF_D : CVDWARF_C; #endif #if SYMDEB_CODEVIEW if (config.objfmt == OBJ_MSCOFF) { configv.addlinenumbers = 1; config.fulltypes = CV8; if(symdebug > 1) config.flags2 |= CFG2gms; } else { configv.addlinenumbers = 1; config.fulltypes = CV4; } #endif if (!optimize) config.flags |= CFGalwaysframe; } else { configv.addlinenumbers = 0; config.fulltypes = CVNONE; //config.flags &= ~CFGalwaysframe; } if (alwaysframe) config.flags |= CFGalwaysframe; if (stackstomp) config.flags2 |= CFG2stomp; config.betterC = betterC; ph_init(); block_init(); cod3_setdefault(); if (model == 64) { util_set64(); type_init(); cod3_set64(); } else { util_set32(); type_init(); cod3_set32(); } rtlsym_init(); // uses fregsaved, so must be after it's set inside cod3_set* #endif }
void out_config_init() { //printf("out_config_init()\n"); Param *params = &global.params; if (!config.target_cpu) { config.target_cpu = TARGET_PentiumPro; config.target_scheduler = config.target_cpu; } config.fulltypes = CVNONE; config.fpxmmregs = FALSE; config.inline8087 = 1; config.memmodel = 0; config.flags |= CFGuchar; // make sure TYchar is unsigned tytab[TYchar] |= TYFLuns; #if TARGET_WINDOS if (params->is64bit) { config.exe = EX_WIN64; config.fpxmmregs = TRUE; // Not sure we really need these two lines, try removing them later config.flags |= CFGnoebp; config.flags |= CFGalwaysframe; } else { config.exe = EX_NT; config.flags2 |= CFG2seh; // Win32 eh } if (params->run) config.wflags |= WFexe; // EXE file only optimizations else if (params->link && !global.params.deffile) config.wflags |= WFexe; // EXE file only optimizations else if (params->exefile) // if writing out EXE file { size_t len = strlen(params->exefile); if (len >= 4 && stricmp(params->exefile + len - 3, "exe") == 0) config.wflags |= WFexe; } config.flags4 |= CFG4underscore; #endif #if TARGET_LINUX if (params->is64bit) { config.exe = EX_LINUX64; config.fpxmmregs = TRUE; } else config.exe = EX_LINUX; config.flags |= CFGnoebp; config.flags |= CFGalwaysframe; if (params->pic) config.flags3 |= CFG3pic; #endif #if TARGET_OSX config.fpxmmregs = TRUE; if (params->is64bit) { config.exe = EX_OSX64; config.fpxmmregs = TRUE; } else config.exe = EX_OSX; config.flags |= CFGnoebp; config.flags |= CFGalwaysframe; if (params->pic) config.flags3 |= CFG3pic; #endif #if TARGET_FREEBSD if (params->is64bit) { config.exe = EX_FREEBSD64; config.fpxmmregs = TRUE; } else config.exe = EX_FREEBSD; config.flags |= CFGnoebp; config.flags |= CFGalwaysframe; if (params->pic) config.flags3 |= CFG3pic; #endif #if TARGET_OPENBSD if (params->is64bit) { config.exe = EX_OPENBSD64; config.fpxmmregs = TRUE; } else config.exe = EX_OPENBSD; config.flags |= CFGnoebp; config.flags |= CFGalwaysframe; if (params->pic) config.flags3 |= CFG3pic; #endif #if TARGET_SOLARIS if (params->is64bit) { config.exe = EX_SOLARIS64; config.fpxmmregs = TRUE; } else config.exe = EX_SOLARIS; config.flags |= CFGnoebp; config.flags |= CFGalwaysframe; if (params->pic) config.flags3 |= CFG3pic; #endif config.flags2 |= CFG2nodeflib; // no default library config.flags3 |= CFG3eseqds; #if 0 if (env->getEEcontext()->EEcompile != 2) config.flags4 |= CFG4allcomdat; if (env->nochecks()) config.flags4 |= CFG4nochecks; // no runtime checking #elif TARGET_OSX #else config.flags4 |= CFG4allcomdat; #endif if (params->trace) config.flags |= CFGtrace; // turn on profiler if (params->nofloat) config.flags3 |= CFG3wkfloat; configv.verbose = params->verbose; if (params->optimize) go_flag((char *)"-o"); if (params->symdebug) { #if SYMDEB_DWARF configv.addlinenumbers = 1; config.fulltypes = (params->symdebug == 1) ? CVDWARF_D : CVDWARF_C; #endif #if SYMDEB_CODEVIEW if (params->is64bit) { } else { configv.addlinenumbers = 1; config.fulltypes = CV4; } #endif if (!params->optimize) config.flags |= CFGalwaysframe; } else { configv.addlinenumbers = 0; config.fulltypes = CVNONE; //config.flags &= ~CFGalwaysframe; } if (params->alwaysframe) config.flags &= ~CFGalwaysframe; #ifdef DEBUG debugb = params->debugb; debugc = params->debugc; debugf = params->debugf; debugr = params->debugr; debugw = params->debugw; debugx = params->debugx; debugy = params->debugy; #endif }