1 1.1 mrg /* d-builtins.cc -- GCC builtins support for D. 2 1.1.1.3 mrg Copyright (C) 2006-2022 Free Software Foundation, Inc. 3 1.1 mrg 4 1.1 mrg GCC is free software; you can redistribute it and/or modify 5 1.1 mrg it under the terms of the GNU General Public License as published by 6 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 7 1.1 mrg any later version. 8 1.1 mrg 9 1.1 mrg GCC is distributed in the hope that it will be useful, 10 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 11 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 1.1 mrg GNU General Public License for more details. 13 1.1 mrg 14 1.1 mrg You should have received a copy of the GNU General Public License 15 1.1 mrg along with GCC; see the file COPYING3. If not see 16 1.1 mrg <http://www.gnu.org/licenses/>. */ 17 1.1 mrg 18 1.1 mrg #include "config.h" 19 1.1 mrg #include "system.h" 20 1.1 mrg #include "coretypes.h" 21 1.1 mrg 22 1.1 mrg #include "dmd/attrib.h" 23 1.1 mrg #include "dmd/aggregate.h" 24 1.1 mrg #include "dmd/cond.h" 25 1.1 mrg #include "dmd/declaration.h" 26 1.1 mrg #include "dmd/expression.h" 27 1.1 mrg #include "dmd/identifier.h" 28 1.1 mrg #include "dmd/module.h" 29 1.1 mrg #include "dmd/mtype.h" 30 1.1.1.3 mrg #include "dmd/target.h" 31 1.1 mrg 32 1.1 mrg #include "tree.h" 33 1.1 mrg #include "fold-const.h" 34 1.1 mrg #include "diagnostic.h" 35 1.1 mrg #include "langhooks.h" 36 1.1 mrg #include "target.h" 37 1.1 mrg #include "common/common-target.h" 38 1.1 mrg #include "stringpool.h" 39 1.1 mrg #include "stor-layout.h" 40 1.1 mrg 41 1.1 mrg #include "d-tree.h" 42 1.1.1.3 mrg #include "d-frontend.h" 43 1.1 mrg #include "d-target.h" 44 1.1 mrg 45 1.1 mrg 46 1.1.1.3 mrg static GTY(()) vec <tree, va_gc> *gcc_builtins_functions = NULL; 47 1.1.1.3 mrg static GTY(()) vec <tree, va_gc> *gcc_builtins_libfuncs = NULL; 48 1.1.1.3 mrg static GTY(()) vec <tree, va_gc> *gcc_builtins_types = NULL; 49 1.1 mrg 50 1.1 mrg /* Record built-in types and their associated decls for re-use when 51 1.1 mrg generating the `gcc.builtins' module. */ 52 1.1 mrg 53 1.1 mrg struct builtin_data 54 1.1 mrg { 55 1.1 mrg Type *dtype; 56 1.1 mrg tree ctype; 57 1.1 mrg Dsymbol *dsym; 58 1.1 mrg 59 1.1 mrg builtin_data (Type *t, tree c, Dsymbol *d = NULL) 60 1.1 mrg : dtype(t), ctype(c), dsym(d) 61 1.1 mrg { } 62 1.1 mrg }; 63 1.1 mrg 64 1.1.1.3 mrg static vec <builtin_data> builtin_converted_decls; 65 1.1 mrg 66 1.1 mrg /* Build D frontend type from tree TYPE type given. This will set the 67 1.1 mrg back-end type symbol directly for complex types to save build_ctype() 68 1.1 mrg the work. For other types, it is not useful or will cause errors, such 69 1.1 mrg as casting from `C char' to `D char', which also means that `char *` 70 1.1 mrg needs to be specially handled. */ 71 1.1 mrg 72 1.1.1.3 mrg Type * 73 1.1 mrg build_frontend_type (tree type) 74 1.1 mrg { 75 1.1 mrg Type *dtype; 76 1.1 mrg MOD mod = 0; 77 1.1 mrg 78 1.1 mrg if (TYPE_READONLY (type)) 79 1.1 mrg mod |= MODconst; 80 1.1 mrg if (TYPE_VOLATILE (type)) 81 1.1 mrg mod |= MODshared; 82 1.1 mrg 83 1.1 mrg /* If we've seen the type before, re-use the converted decl. */ 84 1.1.1.3 mrg unsigned saved_builtin_decls_length = builtin_converted_decls.length (); 85 1.1.1.3 mrg for (size_t i = 0; i < saved_builtin_decls_length; ++i) 86 1.1 mrg { 87 1.1 mrg tree t = builtin_converted_decls[i].ctype; 88 1.1 mrg if (TYPE_MAIN_VARIANT (t) == TYPE_MAIN_VARIANT (type)) 89 1.1 mrg return builtin_converted_decls[i].dtype; 90 1.1 mrg } 91 1.1 mrg 92 1.1 mrg switch (TREE_CODE (type)) 93 1.1 mrg { 94 1.1 mrg case POINTER_TYPE: 95 1.1 mrg dtype = build_frontend_type (TREE_TYPE (type)); 96 1.1 mrg if (dtype) 97 1.1 mrg { 98 1.1 mrg /* Check for char * first. Needs to be done for chars/string. */ 99 1.1 mrg if (TYPE_MAIN_VARIANT (TREE_TYPE (type)) == char_type_node) 100 1.1 mrg return Type::tchar->addMod (dtype->mod)->pointerTo ()->addMod (mod); 101 1.1 mrg 102 1.1.1.3 mrg if (dtype->ty == TY::Tfunction) 103 1.1 mrg return (TypePointer::create (dtype))->addMod (mod); 104 1.1 mrg 105 1.1 mrg return dtype->pointerTo ()->addMod (mod); 106 1.1 mrg } 107 1.1 mrg break; 108 1.1 mrg 109 1.1 mrg case REFERENCE_TYPE: 110 1.1 mrg dtype = build_frontend_type (TREE_TYPE (type)); 111 1.1 mrg if (dtype) 112 1.1 mrg { 113 1.1 mrg /* Want to assign ctype directly so that the REFERENCE_TYPE code 114 1.1 mrg can be turned into as an `inout' argument. Can't use pointerTo(), 115 1.1 mrg because the returned Type is shared. */ 116 1.1 mrg dtype = (TypePointer::create (dtype))->addMod (mod); 117 1.1 mrg dtype->ctype = type; 118 1.1 mrg builtin_converted_decls.safe_push (builtin_data (dtype, type)); 119 1.1 mrg return dtype; 120 1.1 mrg } 121 1.1 mrg break; 122 1.1 mrg 123 1.1 mrg case BOOLEAN_TYPE: 124 1.1 mrg /* Should be no need for size checking. */ 125 1.1 mrg return Type::tbool->addMod (mod); 126 1.1 mrg 127 1.1 mrg case INTEGER_TYPE: 128 1.1 mrg { 129 1.1 mrg unsigned size = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (type)); 130 1.1 mrg bool unsignedp = TYPE_UNSIGNED (type); 131 1.1 mrg 132 1.1 mrg /* For now, skip support for cent/ucent until the frontend 133 1.1 mrg has better support for handling it. */ 134 1.1.1.3 mrg for (size_t i = (size_t) TY::Tint8; i <= (size_t) TY::Tuns64; i++) 135 1.1 mrg { 136 1.1 mrg dtype = Type::basic[i]; 137 1.1 mrg 138 1.1 mrg /* Search for type matching size and signedness. */ 139 1.1 mrg if (unsignedp != dtype->isunsigned () 140 1.1 mrg || size != dtype->size ()) 141 1.1 mrg continue; 142 1.1 mrg 143 1.1 mrg return dtype->addMod (mod); 144 1.1 mrg } 145 1.1 mrg break; 146 1.1 mrg } 147 1.1 mrg 148 1.1 mrg case REAL_TYPE: 149 1.1 mrg { 150 1.1 mrg unsigned size = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (type)); 151 1.1 mrg 152 1.1.1.3 mrg for (size_t i = (size_t) TY::Tfloat32; i <= (size_t) TY::Tfloat80; i++) 153 1.1 mrg { 154 1.1 mrg dtype = Type::basic[i]; 155 1.1 mrg 156 1.1 mrg /* Search for type matching size. */ 157 1.1 mrg if (dtype->size () != size) 158 1.1 mrg continue; 159 1.1 mrg 160 1.1 mrg return dtype->addMod (mod); 161 1.1 mrg } 162 1.1 mrg break; 163 1.1 mrg } 164 1.1 mrg 165 1.1 mrg case COMPLEX_TYPE: 166 1.1 mrg { 167 1.1 mrg unsigned size = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (type)); 168 1.1.1.3 mrg for (size_t i = (size_t) TY::Tcomplex32; i <= (size_t) TY::Tcomplex80; 169 1.1.1.3 mrg i++) 170 1.1 mrg { 171 1.1 mrg dtype = Type::basic[i]; 172 1.1 mrg 173 1.1 mrg /* Search for type matching size. */ 174 1.1 mrg if (dtype->size () != size) 175 1.1 mrg continue; 176 1.1 mrg 177 1.1 mrg return dtype->addMod (mod); 178 1.1 mrg } 179 1.1 mrg break; 180 1.1 mrg } 181 1.1 mrg 182 1.1 mrg case VOID_TYPE: 183 1.1 mrg return Type::tvoid->addMod (mod); 184 1.1 mrg 185 1.1 mrg case ARRAY_TYPE: 186 1.1 mrg dtype = build_frontend_type (TREE_TYPE (type)); 187 1.1 mrg if (dtype) 188 1.1 mrg { 189 1.1 mrg tree index = TYPE_DOMAIN (type); 190 1.1 mrg tree ub = TYPE_MAX_VALUE (index); 191 1.1 mrg tree lb = TYPE_MIN_VALUE (index); 192 1.1 mrg 193 1.1 mrg tree length = fold_build2 (MINUS_EXPR, TREE_TYPE (lb), ub, lb); 194 1.1 mrg length = size_binop (PLUS_EXPR, size_one_node, 195 1.1 mrg convert (sizetype, length)); 196 1.1 mrg 197 1.1 mrg dtype = dtype->sarrayOf (TREE_INT_CST_LOW (length))->addMod (mod); 198 1.1 mrg builtin_converted_decls.safe_push (builtin_data (dtype, type)); 199 1.1 mrg return dtype; 200 1.1 mrg } 201 1.1 mrg break; 202 1.1 mrg 203 1.1 mrg case VECTOR_TYPE: 204 1.1.1.2 mrg { 205 1.1.1.2 mrg unsigned HOST_WIDE_INT nunits; 206 1.1.1.2 mrg if (!TYPE_VECTOR_SUBPARTS (type).is_constant (&nunits)) 207 1.1.1.2 mrg break; 208 1.1 mrg 209 1.1.1.2 mrg dtype = build_frontend_type (TREE_TYPE (type)); 210 1.1.1.2 mrg if (!dtype) 211 1.1.1.2 mrg break; 212 1.1 mrg 213 1.1.1.2 mrg dtype = dtype->sarrayOf (nunits)->addMod (mod); 214 1.1.1.3 mrg if (target.isVectorTypeSupported (dtype->size (), dtype->nextOf ())) 215 1.1.1.2 mrg break; 216 1.1.1.2 mrg 217 1.1.1.3 mrg dtype = (TypeVector::create (dtype))->addMod (mod); 218 1.1.1.2 mrg builtin_converted_decls.safe_push (builtin_data (dtype, type)); 219 1.1.1.2 mrg return dtype; 220 1.1.1.2 mrg } 221 1.1 mrg 222 1.1 mrg case RECORD_TYPE: 223 1.1.1.2 mrg { 224 1.1.1.2 mrg Identifier *ident = TYPE_IDENTIFIER (type) ? 225 1.1.1.2 mrg Identifier::idPool (IDENTIFIER_POINTER (TYPE_IDENTIFIER (type))) : NULL; 226 1.1.1.2 mrg 227 1.1.1.2 mrg /* Neither the `object' and `gcc.builtins' modules will not exist when 228 1.1.1.3 mrg this is called. Use a stub `object' module parent in the meantime. 229 1.1.1.2 mrg If `gcc.builtins' is later imported, the parent will be overridden 230 1.1.1.2 mrg with the correct module symbol. */ 231 1.1.1.2 mrg static Identifier *object = Identifier::idPool ("object"); 232 1.1.1.2 mrg static Module *stubmod = Module::create ("object.d", object, 0, 0); 233 1.1.1.2 mrg 234 1.1.1.2 mrg StructDeclaration *sdecl = StructDeclaration::create (Loc (), ident, 235 1.1.1.2 mrg false); 236 1.1.1.2 mrg sdecl->parent = stubmod; 237 1.1.1.2 mrg sdecl->structsize = int_size_in_bytes (type); 238 1.1.1.2 mrg sdecl->alignsize = TYPE_ALIGN_UNIT (type); 239 1.1.1.3 mrg sdecl->alignment.setDefault (); 240 1.1.1.3 mrg sdecl->sizeok = Sizeok::done; 241 1.1.1.2 mrg sdecl->type = (TypeStruct::create (sdecl))->addMod (mod); 242 1.1.1.2 mrg sdecl->type->ctype = type; 243 1.1.1.2 mrg sdecl->type->merge2 (); 244 1.1.1.2 mrg 245 1.1.1.2 mrg /* Add both named and anonymous fields as members of the struct. 246 1.1.1.3 mrg Anonymous fields still need a name in D, so call them "__pad%u". */ 247 1.1.1.3 mrg unsigned anonfield_id = 0; 248 1.1.1.3 mrg sdecl->members = d_gc_malloc<Dsymbols> (); 249 1.1.1.2 mrg 250 1.1.1.2 mrg for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) 251 1.1 mrg { 252 1.1.1.2 mrg Type *ftype = build_frontend_type (TREE_TYPE (field)); 253 1.1.1.2 mrg if (!ftype) 254 1.1.1.2 mrg { 255 1.1.1.3 mrg /* Drop any field types that got cached before the conversion 256 1.1.1.3 mrg of this record type failed. */ 257 1.1.1.3 mrg builtin_converted_decls.truncate (saved_builtin_decls_length); 258 1.1.1.2 mrg return NULL; 259 1.1.1.2 mrg } 260 1.1.1.2 mrg 261 1.1.1.2 mrg Identifier *fident; 262 1.1.1.2 mrg if (DECL_NAME (field) == NULL_TREE) 263 1.1.1.3 mrg { 264 1.1.1.3 mrg char name[16]; 265 1.1.1.3 mrg snprintf (name, sizeof (name), "__pad%u", anonfield_id++); 266 1.1.1.3 mrg fident = Identifier::idPool (name); 267 1.1.1.3 mrg } 268 1.1.1.2 mrg else 269 1.1.1.2 mrg { 270 1.1.1.2 mrg const char *name = IDENTIFIER_POINTER (DECL_NAME (field)); 271 1.1.1.2 mrg fident = Identifier::idPool (name); 272 1.1.1.2 mrg } 273 1.1.1.2 mrg 274 1.1.1.2 mrg VarDeclaration *vd = VarDeclaration::create (Loc (), ftype, fident, 275 1.1.1.2 mrg NULL); 276 1.1.1.2 mrg vd->parent = sdecl; 277 1.1.1.2 mrg vd->offset = tree_to_uhwi (byte_position (field)); 278 1.1.1.3 mrg vd->semanticRun = PASS::semanticdone; 279 1.1.1.2 mrg vd->csym = field; 280 1.1.1.2 mrg sdecl->members->push (vd); 281 1.1.1.2 mrg sdecl->fields.push (vd); 282 1.1 mrg } 283 1.1.1.2 mrg 284 1.1.1.2 mrg dtype = sdecl->type; 285 1.1.1.2 mrg builtin_converted_decls.safe_push (builtin_data (dtype, type, sdecl)); 286 1.1.1.2 mrg return dtype; 287 1.1.1.2 mrg } 288 1.1 mrg 289 1.1 mrg case FUNCTION_TYPE: 290 1.1 mrg dtype = build_frontend_type (TREE_TYPE (type)); 291 1.1 mrg if (dtype) 292 1.1 mrg { 293 1.1 mrg tree parms = TYPE_ARG_TYPES (type); 294 1.1.1.3 mrg VarArg varargs_p = VARARGvariadic; 295 1.1 mrg 296 1.1.1.3 mrg Parameters *args = d_gc_malloc<Parameters> (); 297 1.1 mrg args->reserve (list_length (parms)); 298 1.1 mrg 299 1.1 mrg /* Attempt to convert all parameter types. */ 300 1.1 mrg for (tree parm = parms; parm != NULL_TREE; parm = TREE_CHAIN (parm)) 301 1.1 mrg { 302 1.1 mrg tree argtype = TREE_VALUE (parm); 303 1.1 mrg if (argtype == void_type_node) 304 1.1 mrg { 305 1.1.1.3 mrg varargs_p = VARARGnone; 306 1.1 mrg break; 307 1.1 mrg } 308 1.1 mrg 309 1.1 mrg StorageClass sc = STCundefined; 310 1.1 mrg if (TREE_CODE (argtype) == REFERENCE_TYPE) 311 1.1 mrg { 312 1.1 mrg argtype = TREE_TYPE (argtype); 313 1.1 mrg sc |= STCref; 314 1.1 mrg } 315 1.1 mrg 316 1.1 mrg Type *targ = build_frontend_type (argtype); 317 1.1 mrg if (!targ) 318 1.1 mrg { 319 1.1.1.3 mrg /* Drop any parameter types that got cached before the 320 1.1.1.3 mrg conversion of this function type failed. */ 321 1.1.1.3 mrg builtin_converted_decls.truncate (saved_builtin_decls_length); 322 1.1 mrg return NULL; 323 1.1 mrg } 324 1.1 mrg 325 1.1.1.3 mrg args->push (Parameter::create (sc, targ, NULL, NULL, NULL)); 326 1.1 mrg } 327 1.1 mrg 328 1.1 mrg /* GCC generic and placeholder built-ins are marked as variadic, yet 329 1.1 mrg have no named parameters, and so can't be represented in D. */ 330 1.1.1.3 mrg if (args->length != 0 || varargs_p == VARARGnone) 331 1.1 mrg { 332 1.1.1.3 mrg dtype = TypeFunction::create (args, dtype, varargs_p, LINK::c); 333 1.1 mrg return dtype->addMod (mod); 334 1.1 mrg } 335 1.1 mrg } 336 1.1 mrg break; 337 1.1 mrg 338 1.1 mrg default: 339 1.1 mrg break; 340 1.1 mrg } 341 1.1 mrg 342 1.1 mrg return NULL; 343 1.1 mrg } 344 1.1 mrg 345 1.1 mrg /* Attempt to convert GCC evaluated CST to a D Frontend Expression. 346 1.1.1.3 mrg LOC is the location in the source file where this CST is being evaluated. 347 1.1 mrg This is used for getting the CTFE value out of a const-folded builtin, 348 1.1 mrg returns NULL if it cannot convert CST. */ 349 1.1 mrg 350 1.1 mrg Expression * 351 1.1.1.3 mrg d_eval_constant_expression (const Loc &loc, tree cst) 352 1.1 mrg { 353 1.1 mrg STRIP_TYPE_NOPS (cst); 354 1.1 mrg Type *type = build_frontend_type (TREE_TYPE (cst)); 355 1.1 mrg 356 1.1 mrg if (type) 357 1.1 mrg { 358 1.1 mrg /* Convert our GCC CST tree into a D Expression. This seems like we are 359 1.1 mrg trying too hard, as these will only be converted back to a tree again 360 1.1 mrg later in the codegen pass, but satisfies the need to have GCC built-ins 361 1.1 mrg CTFE-able in the frontend. */ 362 1.1 mrg tree_code code = TREE_CODE (cst); 363 1.1 mrg if (code == COMPLEX_CST) 364 1.1 mrg { 365 1.1 mrg real_value re = TREE_REAL_CST (TREE_REALPART (cst)); 366 1.1 mrg real_value im = TREE_REAL_CST (TREE_IMAGPART (cst)); 367 1.1 mrg complex_t value = complex_t (ldouble (re), ldouble (im)); 368 1.1.1.3 mrg return ComplexExp::create (loc, value, type); 369 1.1 mrg } 370 1.1 mrg else if (code == INTEGER_CST) 371 1.1 mrg { 372 1.1 mrg dinteger_t value = TREE_INT_CST_LOW (cst); 373 1.1.1.3 mrg return IntegerExp::create (loc, value, type); 374 1.1 mrg } 375 1.1 mrg else if (code == REAL_CST) 376 1.1 mrg { 377 1.1 mrg real_value value = TREE_REAL_CST (cst); 378 1.1.1.3 mrg return RealExp::create (loc, ldouble (value), type); 379 1.1 mrg } 380 1.1 mrg else if (code == STRING_CST) 381 1.1 mrg { 382 1.1 mrg const void *string = TREE_STRING_POINTER (cst); 383 1.1.1.3 mrg size_t len = TREE_STRING_LENGTH (cst) - 1; 384 1.1.1.3 mrg return StringExp::create (loc, CONST_CAST (void *, string), len); 385 1.1 mrg } 386 1.1 mrg else if (code == VECTOR_CST) 387 1.1 mrg { 388 1.1 mrg dinteger_t nunits = VECTOR_CST_NELTS (cst).to_constant (); 389 1.1.1.3 mrg Expressions *elements = d_gc_malloc<Expressions> (); 390 1.1 mrg elements->setDim (nunits); 391 1.1 mrg 392 1.1 mrg for (size_t i = 0; i < nunits; i++) 393 1.1 mrg { 394 1.1 mrg Expression *elem 395 1.1.1.3 mrg = d_eval_constant_expression (loc, VECTOR_CST_ELT (cst, i)); 396 1.1 mrg if (elem == NULL) 397 1.1 mrg return NULL; 398 1.1 mrg 399 1.1 mrg (*elements)[i] = elem; 400 1.1 mrg } 401 1.1 mrg 402 1.1.1.3 mrg Expression *e = ArrayLiteralExp::create (loc, elements); 403 1.1.1.3 mrg e->type = type->isTypeVector ()->basetype; 404 1.1.1.3 mrg 405 1.1.1.3 mrg return VectorExp::create (loc, e, type); 406 1.1.1.3 mrg } 407 1.1.1.3 mrg else if (code == ADDR_EXPR) 408 1.1.1.3 mrg { 409 1.1.1.3 mrg /* Special handling for trees constructed by build_string_literal. 410 1.1.1.3 mrg What we receive is an `&"string"[0]' expression, strip off the 411 1.1.1.3 mrg outer ADDR_EXPR and ARRAY_REF to get to the underlying CST. */ 412 1.1.1.3 mrg tree pointee = TREE_OPERAND (cst, 0); 413 1.1.1.3 mrg 414 1.1.1.3 mrg if (TREE_CODE (pointee) != ARRAY_REF 415 1.1.1.3 mrg || TREE_OPERAND (pointee, 1) != integer_zero_node 416 1.1.1.3 mrg || TREE_CODE (TREE_OPERAND (pointee, 0)) != STRING_CST) 417 1.1.1.3 mrg return NULL; 418 1.1 mrg 419 1.1.1.3 mrg return d_eval_constant_expression (loc, TREE_OPERAND (pointee, 0)); 420 1.1 mrg } 421 1.1 mrg } 422 1.1 mrg 423 1.1 mrg return NULL; 424 1.1 mrg } 425 1.1 mrg 426 1.1 mrg /* Callback for TARGET_D_CPU_VERSIONS and TARGET_D_OS_VERSIONS. 427 1.1 mrg Adds IDENT to the list of predefined version identifiers. */ 428 1.1 mrg 429 1.1 mrg void 430 1.1 mrg d_add_builtin_version (const char* ident) 431 1.1 mrg { 432 1.1 mrg VersionCondition::addPredefinedGlobalIdent (ident); 433 1.1 mrg } 434 1.1 mrg 435 1.1 mrg /* Initialize the list of all the predefined version identifiers. */ 436 1.1 mrg 437 1.1 mrg void 438 1.1 mrg d_init_versions (void) 439 1.1 mrg { 440 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("GNU"); 441 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_Version2"); 442 1.1 mrg 443 1.1 mrg if (BYTES_BIG_ENDIAN) 444 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("BigEndian"); 445 1.1 mrg else 446 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("LittleEndian"); 447 1.1 mrg 448 1.1 mrg if (targetm_common.except_unwind_info (&global_options) == UI_SJLJ) 449 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("GNU_SjLj_Exceptions"); 450 1.1 mrg else if (targetm_common.except_unwind_info (&global_options) == UI_SEH) 451 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("GNU_SEH_Exceptions"); 452 1.1 mrg else if (targetm_common.except_unwind_info (&global_options) == UI_DWARF2) 453 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("GNU_DWARF2_Exceptions"); 454 1.1 mrg 455 1.1 mrg if (!targetm.have_tls) 456 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("GNU_EMUTLS"); 457 1.1 mrg 458 1.1 mrg if (STACK_GROWS_DOWNWARD) 459 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("GNU_StackGrowsDown"); 460 1.1 mrg 461 1.1 mrg /* Should define this anyway to set us apart from the competition. */ 462 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("GNU_InlineAsm"); 463 1.1 mrg 464 1.1 mrg /* LP64 only means 64bit pointers in D. */ 465 1.1.1.3 mrg if (POINTER_SIZE == 64) 466 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_LP64"); 467 1.1 mrg 468 1.1 mrg /* Setting `global.params.cov' forces module info generation which is 469 1.1 mrg not needed for the GCC coverage implementation. Instead, just 470 1.1 mrg test flag_test_coverage while leaving `global.params.cov' unset. */ 471 1.1 mrg if (flag_test_coverage) 472 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_Coverage"); 473 1.1 mrg if (flag_pic) 474 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_PIC"); 475 1.1.1.3 mrg if (flag_pie) 476 1.1.1.3 mrg VersionCondition::addPredefinedGlobalIdent ("D_PIE"); 477 1.1 mrg 478 1.1 mrg if (global.params.doDocComments) 479 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_Ddoc"); 480 1.1 mrg 481 1.1 mrg if (global.params.useUnitTests) 482 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("unittest"); 483 1.1 mrg 484 1.1.1.3 mrg if (global.params.useAssert == CHECKENABLEon) 485 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("assert"); 486 1.1 mrg 487 1.1.1.3 mrg if (global.params.useIn == CHECKENABLEon) 488 1.1.1.3 mrg VersionCondition::addPredefinedGlobalIdent("D_PreConditions"); 489 1.1.1.3 mrg 490 1.1.1.3 mrg if (global.params.useOut == CHECKENABLEon) 491 1.1.1.3 mrg VersionCondition::addPredefinedGlobalIdent("D_PostConditions"); 492 1.1.1.3 mrg 493 1.1.1.3 mrg if (global.params.useInvariants == CHECKENABLEon) 494 1.1.1.3 mrg VersionCondition::addPredefinedGlobalIdent("D_Invariants"); 495 1.1.1.3 mrg 496 1.1.1.3 mrg if (global.params.useArrayBounds == CHECKENABLEoff) 497 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_NoBoundsChecks"); 498 1.1 mrg 499 1.1 mrg if (global.params.betterC) 500 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_BetterC"); 501 1.1 mrg else 502 1.1 mrg { 503 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_ModuleInfo"); 504 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_Exceptions"); 505 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("D_TypeInfo"); 506 1.1 mrg } 507 1.1 mrg 508 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("all"); 509 1.1 mrg 510 1.1 mrg /* Emit all target-specific version identifiers. */ 511 1.1 mrg targetdm.d_cpu_versions (); 512 1.1 mrg targetdm.d_os_versions (); 513 1.1 mrg 514 1.1 mrg VersionCondition::addPredefinedGlobalIdent ("CppRuntime_Gcc"); 515 1.1 mrg } 516 1.1 mrg 517 1.1 mrg /* A helper for d_build_builtins_module. Return a new ALIAS for TYPE. 518 1.1 mrg Analogous to `alias ALIAS = TYPE' in D code. */ 519 1.1 mrg 520 1.1 mrg static AliasDeclaration * 521 1.1 mrg build_alias_declaration (const char *alias, Type *type) 522 1.1 mrg { 523 1.1 mrg return AliasDeclaration::create (Loc (), Identifier::idPool (alias), type); 524 1.1 mrg } 525 1.1 mrg 526 1.1 mrg /* A helper function for Target::loadModule. Generates all code for the 527 1.1 mrg `gcc.builtins' module, whose frontend symbol should be M. */ 528 1.1 mrg 529 1.1 mrg void 530 1.1 mrg d_build_builtins_module (Module *m) 531 1.1 mrg { 532 1.1.1.3 mrg Dsymbols *members = d_gc_malloc<Dsymbols> (); 533 1.1 mrg tree decl; 534 1.1 mrg 535 1.1 mrg for (size_t i = 0; vec_safe_iterate (gcc_builtins_functions, i, &decl); ++i) 536 1.1 mrg { 537 1.1 mrg const char *name = IDENTIFIER_POINTER (DECL_NAME (decl)); 538 1.1.1.3 mrg Type *t = build_frontend_type (TREE_TYPE (decl)); 539 1.1.1.3 mrg TypeFunction *tf = t ? t->isTypeFunction () : NULL; 540 1.1 mrg 541 1.1 mrg /* Cannot create built-in function type for DECL. */ 542 1.1 mrg if (!tf) 543 1.1 mrg continue; 544 1.1 mrg 545 1.1 mrg /* A few notes on D2 attributes applied to builtin functions: 546 1.1 mrg - It is assumed that built-ins solely provided by the compiler are 547 1.1 mrg considered @safe and pure. 548 1.1 mrg - Built-ins that correspond to `extern(C)' functions in the standard 549 1.1 mrg library that have `__attribute__(nothrow)' are considered `@trusted'. 550 1.1 mrg - The purity of a built-in can vary depending on compiler flags set 551 1.1 mrg upon initialization, or by the `-foptions' passed, such as 552 1.1 mrg flag_unsafe_math_optimizations. 553 1.1 mrg - Built-ins never use the GC or raise a D exception, and so are always 554 1.1 mrg marked as `nothrow' and `@nogc'. */ 555 1.1.1.3 mrg tf->purity = DECL_PURE_P (decl) ? PURE::const_ 556 1.1.1.3 mrg : TREE_READONLY (decl) ? PURE::const_ 557 1.1.1.3 mrg : DECL_IS_NOVOPS (decl) ? PURE::weak 558 1.1.1.3 mrg : !DECL_ASSEMBLER_NAME_SET_P (decl) ? PURE::weak 559 1.1.1.3 mrg : PURE::impure; 560 1.1.1.3 mrg tf->trust = !DECL_ASSEMBLER_NAME_SET_P (decl) ? TRUST::safe 561 1.1.1.3 mrg : TREE_NOTHROW (decl) ? TRUST::trusted 562 1.1.1.3 mrg : TRUST::system; 563 1.1.1.3 mrg tf->isnothrow (true); 564 1.1.1.3 mrg tf->isnogc (true); 565 1.1 mrg 566 1.1 mrg FuncDeclaration *func 567 1.1 mrg = FuncDeclaration::create (Loc (), Loc (), 568 1.1 mrg Identifier::idPool (name), 569 1.1 mrg STCextern, tf); 570 1.1 mrg DECL_LANG_SPECIFIC (decl) = build_lang_decl (func); 571 1.1 mrg func->csym = decl; 572 1.1.1.3 mrg func->builtin = BUILTIN::gcc; 573 1.1 mrg 574 1.1 mrg members->push (func); 575 1.1 mrg } 576 1.1 mrg 577 1.1 mrg for (size_t i = 0; vec_safe_iterate (gcc_builtins_types, i, &decl); ++i) 578 1.1 mrg { 579 1.1 mrg const char *name = IDENTIFIER_POINTER (DECL_NAME (decl)); 580 1.1 mrg Type *t = build_frontend_type (TREE_TYPE (decl)); 581 1.1 mrg 582 1.1 mrg /* Cannot create built-in type for DECL. */ 583 1.1 mrg if (!t) 584 1.1 mrg continue; 585 1.1 mrg 586 1.1 mrg members->push (build_alias_declaration (name, t)); 587 1.1 mrg } 588 1.1 mrg 589 1.1 mrg /* Iterate through the target-specific builtin types for va_list. */ 590 1.1 mrg if (targetm.enum_va_list_p) 591 1.1 mrg { 592 1.1 mrg const char *name; 593 1.1 mrg tree type; 594 1.1 mrg 595 1.1 mrg for (int i = 0; targetm.enum_va_list_p (i, &name, &type); ++i) 596 1.1 mrg { 597 1.1 mrg Type *t = build_frontend_type (type); 598 1.1 mrg /* Cannot create built-in type. */ 599 1.1 mrg if (!t) 600 1.1 mrg continue; 601 1.1 mrg 602 1.1 mrg members->push (build_alias_declaration (name, t)); 603 1.1 mrg } 604 1.1 mrg } 605 1.1 mrg 606 1.1 mrg /* Push out declarations for any RECORD_TYPE types encountered when building 607 1.1 mrg all builtin functions and types. */ 608 1.1 mrg for (size_t i = 0; i < builtin_converted_decls.length (); ++i) 609 1.1 mrg { 610 1.1 mrg /* Currently, there is no need to run semantic, but we do want to output 611 1.1 mrg initializers, typeinfo, and others on demand. */ 612 1.1 mrg Dsymbol *dsym = builtin_converted_decls[i].dsym; 613 1.1.1.2 mrg if (dsym != NULL && !dsym->isAnonymous ()) 614 1.1 mrg { 615 1.1 mrg dsym->parent = m; 616 1.1 mrg members->push (dsym); 617 1.1 mrg } 618 1.1 mrg } 619 1.1 mrg 620 1.1.1.3 mrg /* Expose target-specific va_list type. */ 621 1.1.1.3 mrg Type *tvalist = target.va_listType (Loc (), NULL); 622 1.1.1.3 mrg TypeStruct *ts = tvalist->isTypeStruct (); 623 1.1.1.3 mrg if (ts == NULL || !ts->sym->isAnonymous ()) 624 1.1.1.3 mrg members->push (build_alias_declaration ("__builtin_va_list", tvalist)); 625 1.1.1.2 mrg else 626 1.1.1.2 mrg { 627 1.1.1.3 mrg ts->sym->ident = Identifier::idPool ("__builtin_va_list"); 628 1.1.1.3 mrg members->push (ts->sym); 629 1.1.1.2 mrg } 630 1.1 mrg 631 1.1 mrg /* Expose target-specific integer types to the builtins module. */ 632 1.1 mrg { 633 1.1 mrg Type *t = build_frontend_type (long_integer_type_node); 634 1.1 mrg members->push (build_alias_declaration ("__builtin_clong", t)); 635 1.1 mrg 636 1.1 mrg t = build_frontend_type (long_unsigned_type_node); 637 1.1 mrg members->push (build_alias_declaration ("__builtin_culong", t)); 638 1.1 mrg 639 1.1 mrg t = build_frontend_type (long_long_integer_type_node); 640 1.1 mrg members->push (build_alias_declaration ("__builtin_clonglong", t)); 641 1.1 mrg 642 1.1 mrg t = build_frontend_type (long_long_unsigned_type_node); 643 1.1 mrg members->push (build_alias_declaration ("__builtin_culonglong", t)); 644 1.1 mrg 645 1.1 mrg t = build_frontend_type (lang_hooks.types.type_for_mode (byte_mode, 0)); 646 1.1 mrg members->push (build_alias_declaration ("__builtin_machine_byte", t)); 647 1.1 mrg 648 1.1 mrg t = build_frontend_type (lang_hooks.types.type_for_mode (byte_mode, 1)); 649 1.1 mrg members->push (build_alias_declaration ("__builtin_machine_ubyte", t)); 650 1.1 mrg 651 1.1 mrg t = build_frontend_type (lang_hooks.types.type_for_mode (word_mode, 0)); 652 1.1 mrg members->push (build_alias_declaration ("__builtin_machine_int", t)); 653 1.1 mrg 654 1.1 mrg t = build_frontend_type (lang_hooks.types.type_for_mode (word_mode, 1)); 655 1.1 mrg members->push (build_alias_declaration ("__builtin_machine_uint", t)); 656 1.1 mrg 657 1.1 mrg t = build_frontend_type (lang_hooks.types.type_for_mode (ptr_mode, 0)); 658 1.1 mrg members->push (build_alias_declaration ("__builtin_pointer_int", t)); 659 1.1 mrg 660 1.1 mrg t = build_frontend_type (lang_hooks.types.type_for_mode (ptr_mode, 1)); 661 1.1 mrg members->push (build_alias_declaration ("__builtin_pointer_uint", t)); 662 1.1 mrg 663 1.1 mrg /* _Unwind_Word has its own target specific mode. */ 664 1.1 mrg machine_mode mode = targetm.unwind_word_mode (); 665 1.1 mrg t = build_frontend_type (lang_hooks.types.type_for_mode (mode, 0)); 666 1.1 mrg members->push (build_alias_declaration ("__builtin_unwind_int", t)); 667 1.1 mrg 668 1.1 mrg t = build_frontend_type (lang_hooks.types.type_for_mode (mode, 1)); 669 1.1 mrg members->push (build_alias_declaration ("__builtin_unwind_uint", t)); 670 1.1 mrg } 671 1.1 mrg 672 1.1.1.3 mrg m->members->push (LinkDeclaration::create (Loc (), LINK::c, members)); 673 1.1 mrg } 674 1.1 mrg 675 1.1 mrg /* Search for any `extern(C)' functions that match any known GCC library builtin 676 1.1 mrg function in D and override its internal back-end symbol. */ 677 1.1 mrg 678 1.1 mrg static void 679 1.1 mrg maybe_set_builtin_1 (Dsymbol *d) 680 1.1 mrg { 681 1.1 mrg AttribDeclaration *ad = d->isAttribDeclaration (); 682 1.1 mrg FuncDeclaration *fd = d->isFuncDeclaration (); 683 1.1 mrg 684 1.1 mrg if (ad != NULL) 685 1.1 mrg { 686 1.1 mrg /* Recursively search through attribute decls. */ 687 1.1.1.3 mrg Dsymbols *decls = ad->include (NULL); 688 1.1.1.3 mrg if (decls && decls->length) 689 1.1 mrg { 690 1.1.1.3 mrg for (size_t i = 0; i < decls->length; i++) 691 1.1 mrg { 692 1.1 mrg Dsymbol *sym = (*decls)[i]; 693 1.1 mrg maybe_set_builtin_1 (sym); 694 1.1 mrg } 695 1.1 mrg } 696 1.1 mrg } 697 1.1 mrg else if (fd && !fd->fbody) 698 1.1 mrg { 699 1.1 mrg tree t; 700 1.1 mrg 701 1.1 mrg for (size_t i = 0; vec_safe_iterate (gcc_builtins_libfuncs, i, &t); ++i) 702 1.1 mrg { 703 1.1 mrg gcc_assert (DECL_ASSEMBLER_NAME_SET_P (t)); 704 1.1 mrg 705 1.1 mrg const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t)); 706 1.1 mrg if (fd->ident != Identifier::idPool (name)) 707 1.1 mrg continue; 708 1.1 mrg 709 1.1 mrg /* Found a match, tell the frontend this is a builtin. */ 710 1.1 mrg DECL_LANG_SPECIFIC (t) = build_lang_decl (fd); 711 1.1 mrg fd->csym = t; 712 1.1.1.3 mrg fd->builtin = BUILTIN::gcc; 713 1.1 mrg return; 714 1.1 mrg } 715 1.1 mrg } 716 1.1 mrg } 717 1.1 mrg 718 1.1 mrg /* A helper function for Target::loadModule. Traverse all members in module M 719 1.1 mrg to search for any functions that can be mapped to any GCC builtin. */ 720 1.1 mrg 721 1.1 mrg void 722 1.1 mrg d_maybe_set_builtin (Module *m) 723 1.1 mrg { 724 1.1 mrg if (!m || !m->members) 725 1.1 mrg return; 726 1.1 mrg 727 1.1.1.3 mrg for (size_t i = 0; i < m->members->length; i++) 728 1.1 mrg { 729 1.1 mrg Dsymbol *sym = (*m->members)[i]; 730 1.1 mrg maybe_set_builtin_1 (sym); 731 1.1 mrg } 732 1.1 mrg } 733 1.1 mrg 734 1.1 mrg /* Used to help initialize the builtin-types.def table. When a type of 735 1.1 mrg the correct size doesn't exist, use error_mark_node instead of NULL. 736 1.1 mrg The latter results in segfaults even when a decl using the type doesn't 737 1.1 mrg get invoked. */ 738 1.1 mrg 739 1.1 mrg static tree 740 1.1 mrg builtin_type_for_size (int size, bool unsignedp) 741 1.1 mrg { 742 1.1 mrg tree type = lang_hooks.types.type_for_size (size, unsignedp); 743 1.1 mrg return type ? type : error_mark_node; 744 1.1 mrg } 745 1.1 mrg 746 1.1 mrg /* Support for DEF_BUILTIN. */ 747 1.1 mrg 748 1.1 mrg static void 749 1.1 mrg do_build_builtin_fn (built_in_function fncode, 750 1.1 mrg const char *name, 751 1.1 mrg built_in_class fnclass, 752 1.1 mrg tree fntype, bool both_p, bool fallback_p, 753 1.1 mrg tree fnattrs, bool implicit_p) 754 1.1 mrg { 755 1.1 mrg tree decl; 756 1.1 mrg const char *libname; 757 1.1 mrg 758 1.1 mrg if (fntype == error_mark_node) 759 1.1 mrg return; 760 1.1 mrg 761 1.1 mrg gcc_assert ((!both_p && !fallback_p) 762 1.1.1.3 mrg || startswith (name, "__builtin_")); 763 1.1 mrg 764 1.1 mrg libname = name + strlen ("__builtin_"); 765 1.1 mrg 766 1.1 mrg decl = add_builtin_function (name, fntype, fncode, fnclass, 767 1.1 mrg fallback_p ? libname : NULL, fnattrs); 768 1.1 mrg 769 1.1 mrg set_builtin_decl (fncode, decl, implicit_p); 770 1.1 mrg } 771 1.1 mrg 772 1.1 mrg /* Standard data types to be used in builtin argument declarations. */ 773 1.1 mrg 774 1.1 mrg static GTY(()) tree string_type_node; 775 1.1 mrg static GTY(()) tree const_string_type_node; 776 1.1 mrg static GTY(()) tree wint_type_node; 777 1.1 mrg static GTY(()) tree intmax_type_node; 778 1.1 mrg static GTY(()) tree uintmax_type_node; 779 1.1 mrg static GTY(()) tree signed_size_type_node; 780 1.1 mrg 781 1.1 mrg 782 1.1 mrg /* Build nodes that would have been created by the C front-end; necessary 783 1.1 mrg for including builtin-types.def and ultimately builtins.def. */ 784 1.1 mrg 785 1.1 mrg static void 786 1.1 mrg d_build_c_type_nodes (void) 787 1.1 mrg { 788 1.1 mrg void_list_node = build_tree_list (NULL_TREE, void_type_node); 789 1.1 mrg string_type_node = build_pointer_type (char_type_node); 790 1.1 mrg const_string_type_node 791 1.1 mrg = build_pointer_type (build_qualified_type (char_type_node, 792 1.1 mrg TYPE_QUAL_CONST)); 793 1.1 mrg 794 1.1.1.2 mrg if (strcmp (UINTMAX_TYPE, "unsigned int") == 0) 795 1.1 mrg { 796 1.1 mrg intmax_type_node = integer_type_node; 797 1.1 mrg uintmax_type_node = unsigned_type_node; 798 1.1 mrg } 799 1.1.1.2 mrg else if (strcmp (UINTMAX_TYPE, "long unsigned int") == 0) 800 1.1 mrg { 801 1.1 mrg intmax_type_node = long_integer_type_node; 802 1.1 mrg uintmax_type_node = long_unsigned_type_node; 803 1.1 mrg } 804 1.1.1.2 mrg else if (strcmp (UINTMAX_TYPE, "long long unsigned int") == 0) 805 1.1 mrg { 806 1.1 mrg intmax_type_node = long_long_integer_type_node; 807 1.1 mrg uintmax_type_node = long_long_unsigned_type_node; 808 1.1 mrg } 809 1.1 mrg else 810 1.1 mrg gcc_unreachable (); 811 1.1 mrg 812 1.1.1.2 mrg signed_size_type_node = signed_type_for (size_type_node); 813 1.1 mrg wint_type_node = unsigned_type_node; 814 1.1 mrg pid_type_node = integer_type_node; 815 1.1 mrg } 816 1.1 mrg 817 1.1 mrg /* Build nodes that are used by the D front-end. 818 1.1 mrg These are distinct from C types. */ 819 1.1 mrg 820 1.1 mrg static void 821 1.1 mrg d_build_d_type_nodes (void) 822 1.1 mrg { 823 1.1 mrg /* Integral types. */ 824 1.1 mrg d_byte_type = make_signed_type (8); 825 1.1 mrg d_ubyte_type = make_unsigned_type (8); 826 1.1 mrg 827 1.1 mrg d_short_type = make_signed_type (16); 828 1.1 mrg d_ushort_type = make_unsigned_type (16); 829 1.1 mrg 830 1.1 mrg d_int_type = make_signed_type (32); 831 1.1 mrg d_uint_type = make_unsigned_type (32); 832 1.1 mrg 833 1.1 mrg d_long_type = make_signed_type (64); 834 1.1 mrg d_ulong_type = make_unsigned_type (64); 835 1.1 mrg 836 1.1 mrg d_cent_type = make_signed_type (128); 837 1.1 mrg d_ucent_type = make_unsigned_type (128); 838 1.1 mrg 839 1.1 mrg { 840 1.1 mrg /* Re-define size_t as a D type. */ 841 1.1 mrg machine_mode type_mode = TYPE_MODE (size_type_node); 842 1.1 mrg size_type_node = lang_hooks.types.type_for_mode (type_mode, 1); 843 1.1 mrg } 844 1.1 mrg 845 1.1 mrg /* Bool and Character types. */ 846 1.1 mrg d_bool_type = make_unsigned_type (1); 847 1.1 mrg TREE_SET_CODE (d_bool_type, BOOLEAN_TYPE); 848 1.1 mrg 849 1.1.1.3 mrg d_bool_false_node = TYPE_MIN_VALUE (d_bool_type); 850 1.1.1.3 mrg d_bool_true_node = TYPE_MAX_VALUE (d_bool_type); 851 1.1.1.3 mrg 852 1.1 mrg char8_type_node = make_unsigned_type (8); 853 1.1 mrg TYPE_STRING_FLAG (char8_type_node) = 1; 854 1.1 mrg 855 1.1 mrg char16_type_node = make_unsigned_type (16); 856 1.1 mrg TYPE_STRING_FLAG (char16_type_node) = 1; 857 1.1 mrg 858 1.1 mrg char32_type_node = make_unsigned_type (32); 859 1.1 mrg TYPE_STRING_FLAG (char32_type_node) = 1; 860 1.1 mrg 861 1.1 mrg /* Imaginary types. */ 862 1.1 mrg ifloat_type_node = build_distinct_type_copy (float_type_node); 863 1.1 mrg TYPE_IMAGINARY_FLOAT (ifloat_type_node) = 1; 864 1.1 mrg 865 1.1 mrg idouble_type_node = build_distinct_type_copy (double_type_node); 866 1.1 mrg TYPE_IMAGINARY_FLOAT (idouble_type_node) = 1; 867 1.1 mrg 868 1.1 mrg ireal_type_node = build_distinct_type_copy (long_double_type_node); 869 1.1 mrg TYPE_IMAGINARY_FLOAT (ireal_type_node) = 1; 870 1.1 mrg 871 1.1.1.3 mrg /* Noreturn type. */ 872 1.1.1.3 mrg noreturn_type_node = build_distinct_type_copy (void_type_node); 873 1.1.1.3 mrg 874 1.1.1.3 mrg /* Calling build_ctype() links the front-end Type to the GCC node, 875 1.1.1.3 mrg and sets the TYPE_NAME to the D language type. */ 876 1.1.1.3 mrg for (unsigned ty = 0; ty < (unsigned) TY::TMAX; ty++) 877 1.1.1.3 mrg { 878 1.1.1.3 mrg if (Type::basic[ty] != NULL) 879 1.1.1.3 mrg build_ctype (Type::basic[ty]); 880 1.1.1.3 mrg } 881 1.1.1.3 mrg 882 1.1 mrg /* Used for ModuleInfo, ClassInfo, and Interface decls. */ 883 1.1 mrg unknown_type_node = make_node (RECORD_TYPE); 884 1.1 mrg 885 1.1 mrg /* Make sure we get a unique function type, so we can give 886 1.1 mrg its pointer type a name. (This wins for gdb). */ 887 1.1 mrg { 888 1.1 mrg tree vfunc_type = make_node (FUNCTION_TYPE); 889 1.1 mrg TREE_TYPE (vfunc_type) = d_int_type; 890 1.1 mrg TYPE_ARG_TYPES (vfunc_type) = NULL_TREE; 891 1.1 mrg layout_type (vfunc_type); 892 1.1 mrg 893 1.1 mrg vtable_entry_type = build_pointer_type (vfunc_type); 894 1.1 mrg } 895 1.1 mrg 896 1.1 mrg vtbl_ptr_type_node = build_pointer_type (vtable_entry_type); 897 1.1 mrg layout_type (vtbl_ptr_type_node); 898 1.1 mrg 899 1.1 mrg /* When an object is accessed via an interface, this type appears 900 1.1 mrg as the first entry in its vtable. */ 901 1.1 mrg { 902 1.1 mrg tree domain = build_index_type (size_int (3)); 903 1.1 mrg vtbl_interface_type_node = build_array_type (ptr_type_node, domain); 904 1.1 mrg } 905 1.1 mrg 906 1.1 mrg /* Use `void[]' as a generic dynamic array type. */ 907 1.1 mrg array_type_node = make_struct_type ("__builtin_void[]", 2, 908 1.1 mrg get_identifier ("length"), size_type_node, 909 1.1 mrg get_identifier ("ptr"), ptr_type_node); 910 1.1 mrg TYPE_DYNAMIC_ARRAY (array_type_node) = 1; 911 1.1 mrg 912 1.1 mrg null_array_node = d_array_value (array_type_node, size_zero_node, 913 1.1 mrg null_pointer_node); 914 1.1 mrg } 915 1.1 mrg 916 1.1 mrg /* Handle default attributes. */ 917 1.1 mrg 918 1.1 mrg enum built_in_attribute 919 1.1 mrg { 920 1.1 mrg #define DEF_ATTR_NULL_TREE(ENUM) ENUM, 921 1.1 mrg #define DEF_ATTR_INT(ENUM, VALUE) ENUM, 922 1.1 mrg #define DEF_ATTR_STRING(ENUM, VALUE) ENUM, 923 1.1 mrg #define DEF_ATTR_IDENT(ENUM, STRING) ENUM, 924 1.1 mrg #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM, 925 1.1 mrg #include "builtin-attrs.def" 926 1.1 mrg #undef DEF_ATTR_NULL_TREE 927 1.1 mrg #undef DEF_ATTR_INT 928 1.1 mrg #undef DEF_ATTR_STRING 929 1.1 mrg #undef DEF_ATTR_IDENT 930 1.1 mrg #undef DEF_ATTR_TREE_LIST 931 1.1 mrg ATTR_LAST 932 1.1 mrg }; 933 1.1 mrg 934 1.1 mrg static GTY(()) tree built_in_attributes[(int) ATTR_LAST]; 935 1.1 mrg 936 1.1 mrg /* Initialize the attribute table for all the supported builtins. */ 937 1.1 mrg 938 1.1 mrg static void 939 1.1 mrg d_init_attributes (void) 940 1.1 mrg { 941 1.1 mrg /* Fill in the built_in_attributes array. */ 942 1.1 mrg #define DEF_ATTR_NULL_TREE(ENUM) \ 943 1.1 mrg built_in_attributes[(int) ENUM] = NULL_TREE; 944 1.1 mrg # define DEF_ATTR_INT(ENUM, VALUE) \ 945 1.1 mrg built_in_attributes[(int) ENUM] = build_int_cst (NULL_TREE, VALUE); 946 1.1 mrg #define DEF_ATTR_STRING(ENUM, VALUE) \ 947 1.1 mrg built_in_attributes[(int) ENUM] = build_string (strlen (VALUE), VALUE); 948 1.1 mrg #define DEF_ATTR_IDENT(ENUM, STRING) \ 949 1.1 mrg built_in_attributes[(int) ENUM] = get_identifier (STRING); 950 1.1 mrg #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \ 951 1.1 mrg built_in_attributes[(int) ENUM] \ 952 1.1 mrg = tree_cons (built_in_attributes[(int) PURPOSE], \ 953 1.1 mrg built_in_attributes[(int) VALUE], \ 954 1.1 mrg built_in_attributes[(int) CHAIN]); 955 1.1 mrg #include "builtin-attrs.def" 956 1.1 mrg #undef DEF_ATTR_NULL_TREE 957 1.1 mrg #undef DEF_ATTR_INT 958 1.1 mrg #undef DEF_ATTR_STRING 959 1.1 mrg #undef DEF_ATTR_IDENT 960 1.1 mrg #undef DEF_ATTR_TREE_LIST 961 1.1 mrg } 962 1.1 mrg 963 1.1 mrg /* Builtin types. */ 964 1.1 mrg 965 1.1 mrg enum d_builtin_type 966 1.1 mrg { 967 1.1 mrg #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME, 968 1.1 mrg #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME, 969 1.1 mrg #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME, 970 1.1 mrg #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME, 971 1.1 mrg #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, 972 1.1 mrg #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, 973 1.1 mrg #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME, 974 1.1 mrg #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 975 1.1 mrg ARG6) NAME, 976 1.1 mrg #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 977 1.1 mrg ARG6, ARG7) NAME, 978 1.1 mrg #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 979 1.1 mrg ARG6, ARG7, ARG8) NAME, 980 1.1 mrg #define DEF_FUNCTION_TYPE_9(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 981 1.1 mrg ARG6, ARG7, ARG8, ARG9) NAME, 982 1.1 mrg #define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 983 1.1 mrg ARG6, ARG7, ARG8, ARG9, ARG10) NAME, 984 1.1 mrg #define DEF_FUNCTION_TYPE_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 985 1.1 mrg ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME, 986 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, 987 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, 988 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, 989 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, 990 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, 991 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \ 992 1.1 mrg NAME, 993 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 994 1.1 mrg ARG6) NAME, 995 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 996 1.1 mrg ARG6, ARG7) NAME, 997 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 998 1.1 mrg ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME, 999 1.1 mrg #define DEF_POINTER_TYPE(NAME, TYPE) NAME, 1000 1.1 mrg #include "builtin-types.def" 1001 1.1 mrg #undef DEF_PRIMITIVE_TYPE 1002 1.1 mrg #undef DEF_FUNCTION_TYPE_0 1003 1.1 mrg #undef DEF_FUNCTION_TYPE_1 1004 1.1 mrg #undef DEF_FUNCTION_TYPE_2 1005 1.1 mrg #undef DEF_FUNCTION_TYPE_3 1006 1.1 mrg #undef DEF_FUNCTION_TYPE_4 1007 1.1 mrg #undef DEF_FUNCTION_TYPE_5 1008 1.1 mrg #undef DEF_FUNCTION_TYPE_6 1009 1.1 mrg #undef DEF_FUNCTION_TYPE_7 1010 1.1 mrg #undef DEF_FUNCTION_TYPE_8 1011 1.1 mrg #undef DEF_FUNCTION_TYPE_9 1012 1.1 mrg #undef DEF_FUNCTION_TYPE_10 1013 1.1 mrg #undef DEF_FUNCTION_TYPE_11 1014 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_0 1015 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_1 1016 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_2 1017 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_3 1018 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_4 1019 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_5 1020 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_6 1021 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_7 1022 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_11 1023 1.1 mrg #undef DEF_POINTER_TYPE 1024 1.1 mrg BT_LAST 1025 1.1 mrg }; 1026 1.1 mrg 1027 1.1 mrg typedef enum d_builtin_type builtin_type; 1028 1.1 mrg 1029 1.1 mrg /* A temporary array used in communication with def_fn_type. */ 1030 1.1 mrg static GTY(()) tree builtin_types[(int) BT_LAST + 1]; 1031 1.1 mrg 1032 1.1 mrg /* A helper function for d_init_builtins. Build function type for DEF with 1033 1.1 mrg return type RET and N arguments. If VAR is true, then the function should 1034 1.1 mrg be variadic after those N arguments. 1035 1.1 mrg 1036 1.1 mrg Takes special care not to ICE if any of the types involved are 1037 1.1 mrg error_mark_node, which indicates that said type is not in fact available 1038 1.1 mrg (see builtin_type_for_size). In which case the function type as a whole 1039 1.1 mrg should be error_mark_node. */ 1040 1.1 mrg 1041 1.1 mrg static void 1042 1.1 mrg def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...) 1043 1.1 mrg { 1044 1.1 mrg tree t; 1045 1.1 mrg tree *args = XALLOCAVEC (tree, n); 1046 1.1 mrg va_list list; 1047 1.1 mrg int i; 1048 1.1 mrg 1049 1.1 mrg va_start (list, n); 1050 1.1 mrg for (i = 0; i < n; ++i) 1051 1.1 mrg { 1052 1.1 mrg builtin_type a = (builtin_type) va_arg (list, int); 1053 1.1 mrg t = builtin_types[a]; 1054 1.1 mrg if (t == error_mark_node) 1055 1.1 mrg goto egress; 1056 1.1 mrg args[i] = t; 1057 1.1 mrg } 1058 1.1 mrg 1059 1.1 mrg t = builtin_types[ret]; 1060 1.1 mrg if (t == error_mark_node) 1061 1.1 mrg goto egress; 1062 1.1 mrg if (var) 1063 1.1 mrg t = build_varargs_function_type_array (t, n, args); 1064 1.1 mrg else 1065 1.1 mrg t = build_function_type_array (t, n, args); 1066 1.1 mrg 1067 1.1 mrg egress: 1068 1.1 mrg builtin_types[def] = t; 1069 1.1 mrg va_end (list); 1070 1.1 mrg } 1071 1.1 mrg 1072 1.1 mrg /* Create builtin types and functions. VA_LIST_REF_TYPE_NODE and 1073 1.1 mrg VA_LIST_ARG_TYPE_NODE are used in builtin-types.def. */ 1074 1.1 mrg 1075 1.1 mrg static void 1076 1.1 mrg d_define_builtins (tree va_list_ref_type_node ATTRIBUTE_UNUSED, 1077 1.1 mrg tree va_list_arg_type_node ATTRIBUTE_UNUSED) 1078 1.1 mrg { 1079 1.1 mrg #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \ 1080 1.1 mrg builtin_types[(int) ENUM] = VALUE; 1081 1.1 mrg #define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \ 1082 1.1 mrg def_fn_type (ENUM, RETURN, 0, 0); 1083 1.1 mrg #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \ 1084 1.1 mrg def_fn_type (ENUM, RETURN, 0, 1, ARG1); 1085 1.1 mrg #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \ 1086 1.1 mrg def_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2); 1087 1.1 mrg #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \ 1088 1.1 mrg def_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3); 1089 1.1 mrg #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \ 1090 1.1 mrg def_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, ARG4); 1091 1.1 mrg #define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \ 1092 1.1 mrg def_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, ARG4, ARG5); 1093 1.1 mrg #define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 1094 1.1 mrg ARG6) \ 1095 1.1 mrg def_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6); 1096 1.1 mrg #define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 1097 1.1 mrg ARG6, ARG7) \ 1098 1.1 mrg def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7); 1099 1.1 mrg #define DEF_FUNCTION_TYPE_8(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 1100 1.1 mrg ARG6, ARG7, ARG8) \ 1101 1.1 mrg def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ 1102 1.1 mrg ARG7, ARG8); 1103 1.1 mrg #define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 1104 1.1 mrg ARG6, ARG7, ARG8, ARG9) \ 1105 1.1 mrg def_fn_type (ENUM, RETURN, 0, 9, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ 1106 1.1 mrg ARG7, ARG8, ARG9); 1107 1.1 mrg #define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 1108 1.1 mrg ARG6, ARG7, ARG8, ARG9, ARG10) \ 1109 1.1 mrg def_fn_type (ENUM, RETURN, 0, 10, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ 1110 1.1 mrg ARG7, ARG8, ARG9, ARG10); 1111 1.1 mrg #define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 1112 1.1 mrg ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) \ 1113 1.1 mrg def_fn_type (ENUM, RETURN, 0, 11, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ 1114 1.1 mrg ARG7, ARG8, ARG9, ARG10, ARG11); 1115 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ 1116 1.1 mrg def_fn_type (ENUM, RETURN, 1, 0); 1117 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ 1118 1.1 mrg def_fn_type (ENUM, RETURN, 1, 1, ARG1); 1119 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \ 1120 1.1 mrg def_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2); 1121 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \ 1122 1.1 mrg def_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3); 1123 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \ 1124 1.1 mrg def_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, ARG4); 1125 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \ 1126 1.1 mrg def_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, ARG4, ARG5); 1127 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 1128 1.1 mrg ARG6) \ 1129 1.1 mrg def_fn_type (ENUM, RETURN, 1, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6); 1130 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 1131 1.1 mrg ARG6, ARG7) \ 1132 1.1 mrg def_fn_type (ENUM, RETURN, 1, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7); 1133 1.1 mrg #define DEF_FUNCTION_TYPE_VAR_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 1134 1.1 mrg ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) \ 1135 1.1 mrg def_fn_type (ENUM, RETURN, 1, 11, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ 1136 1.1 mrg ARG7, ARG8, ARG9, ARG10, ARG11); 1137 1.1 mrg #define DEF_POINTER_TYPE(ENUM, TYPE) \ 1138 1.1 mrg builtin_types[(int) ENUM] = build_pointer_type (builtin_types[(int) TYPE]); 1139 1.1 mrg 1140 1.1 mrg #include "builtin-types.def" 1141 1.1 mrg 1142 1.1 mrg #undef DEF_PRIMITIVE_TYPE 1143 1.1 mrg #undef DEF_FUNCTION_TYPE_1 1144 1.1 mrg #undef DEF_FUNCTION_TYPE_2 1145 1.1 mrg #undef DEF_FUNCTION_TYPE_3 1146 1.1 mrg #undef DEF_FUNCTION_TYPE_4 1147 1.1 mrg #undef DEF_FUNCTION_TYPE_5 1148 1.1 mrg #undef DEF_FUNCTION_TYPE_6 1149 1.1 mrg #undef DEF_FUNCTION_TYPE_7 1150 1.1 mrg #undef DEF_FUNCTION_TYPE_8 1151 1.1 mrg #undef DEF_FUNCTION_TYPE_9 1152 1.1 mrg #undef DEF_FUNCTION_TYPE_10 1153 1.1 mrg #undef DEF_FUNCTION_TYPE_11 1154 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_0 1155 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_1 1156 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_2 1157 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_3 1158 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_4 1159 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_5 1160 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_6 1161 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_7 1162 1.1 mrg #undef DEF_FUNCTION_TYPE_VAR_11 1163 1.1 mrg #undef DEF_POINTER_TYPE 1164 1.1 mrg builtin_types[(int) BT_LAST] = NULL_TREE; 1165 1.1 mrg 1166 1.1 mrg d_init_attributes (); 1167 1.1 mrg 1168 1.1 mrg #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P, \ 1169 1.1 mrg NONANSI_P, ATTRS, IMPLICIT, COND) \ 1170 1.1 mrg if (NAME && COND) \ 1171 1.1 mrg do_build_builtin_fn (ENUM, NAME, CLASS, \ 1172 1.1 mrg builtin_types[(int) TYPE], \ 1173 1.1 mrg BOTH_P, FALLBACK_P, \ 1174 1.1 mrg built_in_attributes[(int) ATTRS], IMPLICIT); 1175 1.1 mrg #include "builtins.def" 1176 1.1 mrg #undef DEF_BUILTIN 1177 1.1 mrg } 1178 1.1 mrg 1179 1.1 mrg /* Build builtin functions and types for the D language frontend. */ 1180 1.1 mrg 1181 1.1 mrg void 1182 1.1 mrg d_init_builtins (void) 1183 1.1 mrg { 1184 1.1 mrg d_build_c_type_nodes (); 1185 1.1 mrg d_build_d_type_nodes (); 1186 1.1 mrg 1187 1.1 mrg if (TREE_CODE (va_list_type_node) == ARRAY_TYPE) 1188 1.1 mrg { 1189 1.1 mrg /* It might seem natural to make the argument type a pointer, but there 1190 1.1 mrg is no implicit casting from arrays to pointers in D. */ 1191 1.1 mrg d_define_builtins (va_list_type_node, va_list_type_node); 1192 1.1 mrg } 1193 1.1 mrg else 1194 1.1 mrg { 1195 1.1 mrg d_define_builtins (build_reference_type (va_list_type_node), 1196 1.1 mrg va_list_type_node); 1197 1.1 mrg } 1198 1.1 mrg 1199 1.1 mrg targetm.init_builtins (); 1200 1.1 mrg build_common_builtin_nodes (); 1201 1.1 mrg } 1202 1.1 mrg 1203 1.1 mrg /* Registration of machine- or os-specific builtin types. 1204 1.1 mrg Add to builtin types list for maybe processing later 1205 1.1 mrg if `gcc.builtins' was imported into the current module. */ 1206 1.1 mrg 1207 1.1 mrg void 1208 1.1 mrg d_register_builtin_type (tree type, const char *name) 1209 1.1 mrg { 1210 1.1 mrg tree decl = build_decl (UNKNOWN_LOCATION, TYPE_DECL, 1211 1.1 mrg get_identifier (name), type); 1212 1.1 mrg DECL_ARTIFICIAL (decl) = 1; 1213 1.1 mrg 1214 1.1 mrg if (!TYPE_NAME (type)) 1215 1.1 mrg TYPE_NAME (type) = decl; 1216 1.1 mrg 1217 1.1 mrg vec_safe_push (gcc_builtins_types, decl); 1218 1.1 mrg } 1219 1.1 mrg 1220 1.1 mrg /* Add DECL to builtin functions list for maybe processing later 1221 1.1 mrg if `gcc.builtins' was imported into the current module. */ 1222 1.1 mrg 1223 1.1 mrg tree 1224 1.1 mrg d_builtin_function (tree decl) 1225 1.1 mrg { 1226 1.1 mrg if (!flag_no_builtin && DECL_ASSEMBLER_NAME_SET_P (decl)) 1227 1.1 mrg vec_safe_push (gcc_builtins_libfuncs, decl); 1228 1.1 mrg 1229 1.1 mrg vec_safe_push (gcc_builtins_functions, decl); 1230 1.1 mrg return decl; 1231 1.1 mrg } 1232 1.1 mrg 1233 1.1.1.2 mrg /* Same as d_builtin_function, but used to delay putting in back-end builtin 1234 1.1.1.2 mrg functions until the ISA that defines the builtin has been declared. 1235 1.1.1.2 mrg However in D, there is no global namespace. All builtins get pushed into the 1236 1.1.1.2 mrg `gcc.builtins' module, which is constructed during the semantic analysis 1237 1.1.1.2 mrg pass, which has already finished by the time target attributes are evaluated. 1238 1.1.1.2 mrg So builtins are not pushed because they would be ultimately ignored. 1239 1.1.1.2 mrg The purpose of having this function then is to improve compile-time 1240 1.1.1.2 mrg reflection support to allow user-code to determine whether a given back end 1241 1.1.1.2 mrg function is enabled by the ISA. */ 1242 1.1.1.2 mrg 1243 1.1.1.2 mrg tree 1244 1.1.1.2 mrg d_builtin_function_ext_scope (tree decl) 1245 1.1.1.2 mrg { 1246 1.1.1.2 mrg return decl; 1247 1.1.1.2 mrg } 1248 1.1 mrg 1249 1.1 mrg #include "gt-d-d-builtins.h" 1250