1 /** 2 * Configures and initializes the backend. 3 * 4 * Copyright: Copyright (C) 1999-2020 by The D Language Foundation, All Rights Reserved 5 * Authors: $(LINK2 http://www.digitalmars.com, Walter Bright) 6 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) 7 * Source: $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/dmsc.d, _dmsc.d) 8 * Documentation: https://dlang.org/phobos/dmd_dmsc.html 9 * Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/dmsc.d 10 */ 11 12 module dmd.dmsc; 13 14 import core.stdc.stdio; 15 import core.stdc..string; 16 import core.stdc.stddef; 17 18 extern (C++): 19 20 import dmd.globals; 21 import dmd.dclass; 22 import dmd.dmodule; 23 import dmd.mtype; 24 25 import dmd.root.filename; 26 27 import dmd.backend.cc; 28 import dmd.backend.cdef; 29 import dmd.backend.global; 30 import dmd.backend.ty; 31 import dmd.backend.type; 32 33 extern (C) void out_config_init( 34 int model, // 32: 32 bit code 35 // 64: 64 bit code 36 // Windows: bit 0 set to generate MS-COFF instead of OMF 37 bool exe, // true: exe file 38 // false: dll or shared library (generate PIC code) 39 bool trace, // add profiling code 40 bool nofloat, // do not pull in floating point code 41 bool verbose, // verbose compile 42 bool optimize, // optimize code 43 int symdebug, // add symbolic debug information 44 // 1: D 45 // 2: fake it with C symbolic debug info 46 bool alwaysframe, // always create standard function frame 47 bool stackstomp, // add stack stomping code 48 ubyte avx, // use AVX instruction set (0, 1, 2) 49 PIC pic, // kind of position independent code 50 bool useModuleInfo, // implement ModuleInfo 51 bool useTypeInfo, // implement TypeInfo 52 bool useExceptions, // implement exception handling 53 string _version // Compiler version 54 ); 55 56 void out_config_debug( 57 bool debugb, 58 bool debugc, 59 bool debugf, 60 bool debugr, 61 bool debugw, 62 bool debugx, 63 bool debugy 64 ); 65 66 /************************************** 67 * Initialize config variables. 68 */ 69 70 void backend_init() 71 { 72 //printf("out_config_init()\n"); 73 Param *params = &global.params; 74 75 bool exe; 76 if (params.dll || params.pic != PIC.fixed) 77 { 78 } 79 else if (params.run) 80 exe = true; // EXE file only optimizations 81 else if (params.link && !params.deffile) 82 exe = true; // EXE file only optimizations 83 else if (params.exefile.length && 84 params.exefile.length >= 4 && 85 FileName.equals(FileName.ext(params.exefile), "exe")) 86 exe = true; // if writing out EXE file 87 88 out_config_init( 89 (params.is64bit ? 64 : 32) | (params.mscoff ? 1 : 0), 90 exe, 91 false, //params.trace, 92 params.nofloat, 93 params.verbose, 94 params.optimize, 95 params.symdebug, 96 params.alwaysframe, 97 params.stackstomp, 98 params.cpu >= CPU.avx2 ? 2 : params.cpu >= CPU.avx ? 1 : 0, 99 params.pic, 100 params.useModuleInfo && Module.moduleinfo, 101 params.useTypeInfo && Type.dtypeinfo, 102 params.useExceptions && ClassDeclaration.throwable, 103 global._version 104 ); 105 106 debug 107 { 108 out_config_debug( 109 params.debugb, 110 params.debugc, 111 params.debugf, 112 params.debugr, 113 false, 114 params.debugx, 115 params.debugy 116 ); 117 } 118 } 119 120 121 /*********************************** 122 * Return aligned 'offset' if it is of size 'size'. 123 */ 124 125 targ_size_t _align(targ_size_t size, targ_size_t offset) 126 { 127 switch (size) 128 { 129 case 1: 130 break; 131 case 2: 132 case 4: 133 case 8: 134 case 16: 135 case 32: 136 case 64: 137 offset = (offset + size - 1) & ~(size - 1); 138 break; 139 default: 140 if (size >= 16) 141 offset = (offset + 15) & ~15; 142 else 143 offset = (offset + _tysize[TYnptr] - 1) & ~(_tysize[TYnptr] - 1); 144 break; 145 } 146 return offset; 147 } 148 149 150 /******************************* 151 * Get size of ty 152 */ 153 154 targ_size_t size(tym_t ty) 155 { 156 int sz = (tybasic(ty) == TYvoid) ? 1 : tysize(ty); 157 debug 158 { 159 if (sz == -1) 160 WRTYxx(ty); 161 } 162 assert(sz!= -1); 163 return sz; 164 } 165 166 /**************************** 167 * Generate symbol of type ty at DATA:offset 168 */ 169 170 Symbol *symboldata(targ_size_t offset,tym_t ty) 171 { 172 Symbol *s = symbol_generate(SClocstat, type_fake(ty)); 173 s.Sfl = FLdata; 174 s.Soffset = offset; 175 s.Stype.Tmangle = mTYman_sys; // writes symbol unmodified in Obj::mangle 176 symbol_keep(s); // keep around 177 return s; 178 } 179 180 /************************************** 181 */ 182 183 void backend_term() 184 { 185 }