void backend_init() { ph_init(); block_init(); type_init(); if (global.params.is64bit) { util_set64(); cod3_set64(); } else { util_set32(); cod3_set32(); } rtlsym_init(); // uses fregsaved, so must be after it's set inside cod3_set* out_config_init(); }
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 }