1 1.1 mrg /* d-compiler.cc -- D frontend interface to the gcc back-end. 2 1.1 mrg Copyright (C) 2020-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/compiler.h" 23 1.1 mrg #include "dmd/expression.h" 24 1.1 mrg #include "dmd/identifier.h" 25 1.1 mrg #include "dmd/module.h" 26 1.1 mrg #include "dmd/mtype.h" 27 1.1 mrg 28 1.1 mrg #include "tree.h" 29 1.1 mrg #include "fold-const.h" 30 1.1 mrg 31 1.1 mrg #include "d-tree.h" 32 1.1 mrg 33 1.1 mrg 34 1.1 mrg /* Implements the Compiler interface used by the frontend. */ 35 1.1 mrg 36 1.1 mrg /* Perform a reinterpret cast of EXPR to type TYPE for use in CTFE. 37 1.1 mrg The front end should have already ensured that EXPR is a constant, 38 1.1 mrg so we just lower the value to GCC and return the converted CST. */ 39 1.1 mrg 40 1.1 mrg Expression * 41 1.1 mrg Compiler::paintAsType (UnionExp *, Expression *expr, Type *type) 42 1.1 mrg { 43 1.1 mrg /* We support up to 512-bit values. */ 44 1.1 mrg unsigned char buffer[64]; 45 1.1 mrg tree cst; 46 1.1 mrg 47 1.1 mrg Type *tb = type->toBasetype (); 48 1.1 mrg 49 1.1 mrg if (expr->type->isintegral ()) 50 1.1 mrg cst = build_integer_cst (expr->toInteger (), build_ctype (expr->type)); 51 1.1 mrg else if (expr->type->isfloating ()) 52 1.1 mrg cst = build_float_cst (expr->toReal (), expr->type); 53 1.1 mrg else if (expr->op == EXP::arrayLiteral) 54 1.1 mrg { 55 1.1 mrg /* Build array as VECTOR_CST, assumes EXPR is constant. */ 56 1.1 mrg Expressions *elements = expr->isArrayLiteralExp ()->elements; 57 1.1 mrg vec <constructor_elt, va_gc> *elms = NULL; 58 1.1 mrg 59 1.1 mrg vec_safe_reserve (elms, elements->length); 60 1.1 mrg for (size_t i = 0; i < elements->length; i++) 61 1.1 mrg { 62 1.1 mrg Expression *e = (*elements)[i]; 63 1.1 mrg if (e->type->isintegral ()) 64 1.1 mrg { 65 1.1 mrg tree value = build_integer_cst (e->toInteger (), 66 1.1 mrg build_ctype (e->type)); 67 1.1 mrg CONSTRUCTOR_APPEND_ELT (elms, size_int (i), value); 68 1.1 mrg } 69 1.1 mrg else if (e->type->isfloating ()) 70 1.1 mrg { 71 1.1 mrg tree value = build_float_cst (e->toReal (), e->type); 72 1.1 mrg CONSTRUCTOR_APPEND_ELT (elms, size_int (i), value); 73 1.1 mrg } 74 1.1 mrg else 75 1.1 mrg gcc_unreachable (); 76 1.1 mrg } 77 1.1 mrg 78 1.1 mrg /* Build vector type. */ 79 1.1 mrg int nunits = expr->type->isTypeSArray ()->dim->toUInteger (); 80 1.1 mrg Type *telem = expr->type->nextOf (); 81 1.1 mrg tree vectype = build_vector_type (build_ctype (telem), nunits); 82 1.1 mrg 83 1.1 mrg cst = build_vector_from_ctor (vectype, elms); 84 1.1 mrg } 85 1.1 mrg else 86 1.1 mrg gcc_unreachable (); 87 1.1 mrg 88 1.1 mrg /* Encode CST to buffer. */ 89 1.1 mrg int len = native_encode_expr (cst, buffer, sizeof (buffer)); 90 1.1 mrg 91 1.1 mrg if (tb->ty == TY::Tsarray) 92 1.1 mrg { 93 1.1 mrg /* Interpret value as a vector of the same size, 94 1.1 mrg then return the array literal. */ 95 1.1 mrg int nunits = type->isTypeSArray ()->dim->toUInteger (); 96 1.1 mrg Type *elem = type->nextOf (); 97 1.1 mrg tree vectype = build_vector_type (build_ctype (elem), nunits); 98 1.1 mrg 99 1.1 mrg cst = native_interpret_expr (vectype, buffer, len); 100 1.1 mrg 101 1.1 mrg Expression *e = d_eval_constant_expression (expr->loc, cst); 102 1.1 mrg gcc_assert (e != NULL && e->op == EXP::vector); 103 1.1 mrg 104 1.1 mrg return e->isVectorExp ()->e1; 105 1.1 mrg } 106 1.1 mrg else 107 1.1 mrg { 108 1.1 mrg /* Normal interpret cast. */ 109 1.1 mrg cst = native_interpret_expr (build_ctype (type), buffer, len); 110 1.1 mrg 111 1.1 mrg Expression *e = d_eval_constant_expression (expr->loc, cst); 112 1.1 mrg gcc_assert (e != NULL); 113 1.1 mrg 114 1.1 mrg return e; 115 1.1 mrg } 116 1.1 mrg } 117 1.1 mrg 118 1.1 mrg /* Check imported module M for any special processing. 119 1.1 mrg Modules we look out for are: 120 1.1 mrg - object: For D runtime type information. 121 1.1 mrg - gcc.builtins: For all gcc builtins. 122 1.1 mrg - core.stdc.*: For all gcc library builtins. */ 123 1.1 mrg 124 1.1 mrg void 125 1.1 mrg Compiler::onParseModule (Module *m) 126 1.1 mrg { 127 1.1 mrg ModuleDeclaration *md = m->md; 128 1.1 mrg 129 1.1 mrg if (!md || !md->id|| md->packages.length == 0) 130 1.1 mrg { 131 1.1 mrg Identifier *id = (md && md->id) ? md->id : m->ident; 132 1.1 mrg if (!strcmp (id->toChars (), "object")) 133 1.1 mrg create_tinfo_types (m); 134 1.1 mrg } 135 1.1 mrg else if (md->packages.length == 1) 136 1.1 mrg { 137 1.1 mrg if (!strcmp (md->packages.ptr[0]->toChars (), "gcc") 138 1.1 mrg && !strcmp (md->id->toChars (), "builtins")) 139 1.1 mrg d_build_builtins_module (m); 140 1.1 mrg } 141 1.1 mrg else if (md->packages.length == 2) 142 1.1 mrg { 143 1.1 mrg if (!strcmp (md->packages.ptr[0]->toChars (), "core") 144 1.1 mrg && !strcmp (md->packages.ptr[1]->toChars (), "stdc")) 145 1.1 mrg d_add_builtin_module (m); 146 1.1 mrg } 147 1.1 mrg } 148 1.1 mrg 149 1.1 mrg /* A callback function that is called once an imported module is parsed. 150 1.1 mrg If the callback returns true, then it tells the front-end that the 151 1.1 mrg driver intends on compiling the import. */ 152 1.1 mrg 153 1.1 mrg bool 154 1.1 mrg Compiler::onImport (Module *) 155 1.1 mrg { 156 1.1 mrg return false; 157 1.1 mrg } 158