annotate gcc/d/d-lang.cc @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* d-lang.cc -- Language-dependent hooks for D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 Copyright (C) 2006-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 GCC is free software; you can redistribute it and/or modify
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 the Free Software Foundation; either version 3, or (at your option)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 GCC is distributed in the hope that it will be useful,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 GNU General Public License for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 along with GCC; see the file COPYING3. If not see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 <http://www.gnu.org/licenses/>. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 #include "config.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 #include "system.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #include "coretypes.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #include "dmd/aggregate.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 #include "dmd/cond.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #include "dmd/declaration.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 #include "dmd/doc.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 #include "dmd/errors.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 #include "dmd/expression.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 #include "dmd/hdrgen.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #include "dmd/identifier.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 #include "dmd/json.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 #include "dmd/mangle.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 #include "dmd/mars.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 #include "dmd/module.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 #include "dmd/mtype.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 #include "dmd/target.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 #include "opts.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 #include "alias.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 #include "tree.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 #include "diagnostic.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 #include "fold-const.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 #include "toplev.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 #include "langhooks.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 #include "langhooks-def.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 #include "target.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 #include "stringpool.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 #include "stor-layout.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 #include "varasm.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 #include "output.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 #include "print-tree.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 #include "gimple-expr.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 #include "gimplify.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 #include "debug.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 #include "d-tree.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 #include "id.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 /* Array of D frontend type/decl nodes. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 tree d_global_trees[DTI_MAX];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 /* True if compilation is currently inside the D frontend semantic passes. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 bool doing_semantic_analysis_p = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 /* Options handled by the compiler that are separate from the frontend. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 struct d_option_data
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 const char *fonly; /* -fonly=<arg> */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 const char *multilib; /* -imultilib <dir> */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 const char *prefix; /* -iprefix <dir> */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 bool deps; /* -M */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 bool deps_skip_system; /* -MM */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 const char *deps_filename; /* -M[M]D */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 const char *deps_filename_user; /* -MF <arg> */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 OutBuffer *deps_target; /* -M[QT] <arg> */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 bool deps_phony; /* -MP */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 bool stdinc; /* -nostdinc */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 d_option;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 /* List of modules being compiled. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 static Modules builtin_modules;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 /* Module where `C main' is defined, compiled in if needed. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 static Module *entrypoint_module = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 static Module *entrypoint_root_module = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 /* The current and global binding level in effect. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 struct binding_level *current_binding_level;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 struct binding_level *global_binding_level;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 /* The context to be used for global declarations. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 static GTY(()) tree global_context;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 /* Array of all global declarations to pass back to the middle-end. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 static GTY(()) vec<tree, va_gc> *global_declarations;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 /* Support for GCC-style command-line make dependency generation.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 Adds TARGET to the make dependencies target buffer.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 QUOTED is true if the string should be quoted. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 deps_add_target (const char *target, bool quoted)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 if (!d_option.deps_target)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 d_option.deps_target = new OutBuffer ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 d_option.deps_target->writeByte (' ');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 d_option.deps_target->reserve (strlen (target));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 if (!quoted)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 d_option.deps_target->writestring (target);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 /* Quote characters in target which are significant to Make. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 for (const char *p = target; *p != '\0'; p++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 switch (*p)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 case ' ':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 case '\t':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 for (const char *q = p - 1; target <= q && *q == '\\'; q--)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 d_option.deps_target->writeByte ('\\');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 d_option.deps_target->writeByte ('\\');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 case '$':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 d_option.deps_target->writeByte ('$');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 case '#':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 d_option.deps_target->writeByte ('\\');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 d_option.deps_target->writeByte (*p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 /* Write out all dependencies of a given MODULE to the specified BUFFER.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 COLMAX is the number of columns to word-wrap at (0 means don't wrap). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 deps_write (Module *module, OutBuffer *buffer, unsigned colmax = 72)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 hash_set <const char *> dependencies;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 Modules modlist;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 modlist.push (module);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 Modules phonylist;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 const char *str;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 unsigned size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 unsigned column = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 /* Write out make target module name. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 if (d_option.deps_target)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 size = d_option.deps_target->offset;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 str = d_option.deps_target->extractString ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 str = module->objfile->name->str;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 size = strlen (str);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 buffer->writestring (str);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 column = size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 buffer->writestring (":");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 column++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 /* Write out all make dependencies. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 while (modlist.dim > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 Module *depmod = modlist.pop ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 str = depmod->srcfile->name->str;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 size = strlen (str);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 /* Skip dependencies that have already been written. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 if (dependencies.add (str))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 column += size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 if (colmax && column > colmax)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 buffer->writestring (" \\\n ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 column = size + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 buffer->writestring (" ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 column++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 buffer->writestring (str);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 /* Add to list of phony targets if is not being compile. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 if (d_option.deps_phony && !depmod->isRoot ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 phonylist.push (depmod);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 /* Search all imports of the written dependency. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 for (size_t i = 0; i < depmod->aimports.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 Module *m = depmod->aimports[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 /* Ignore compiler-generated modules. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 if ((m->ident == Identifier::idPool ("__entrypoint")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 || m->ident == Identifier::idPool ("__main"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 && m->parent == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 /* Don't search system installed modules, this includes
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 object, core.*, std.*, and gcc.* packages. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 if (d_option.deps_skip_system)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 if (m->ident == Identifier::idPool ("object")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 && m->parent == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 if (m->md && m->md->packages)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 Identifier *package = (*m->md->packages)[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 if (package == Identifier::idPool ("core")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 || package == Identifier::idPool ("std")
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 || package == Identifier::idPool ("gcc"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 modlist.push (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 buffer->writenl ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 /* Write out all phony targets. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 for (size_t i = 0; i < phonylist.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 Module *m = phonylist[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 buffer->writenl ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 buffer->writestring (m->srcfile->name->str);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 buffer->writestring (":\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 /* Implements the lang_hooks.init_options routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 This initializes the global state for the D frontend before calling
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 the option handlers. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 d_init_options (unsigned int, cl_decoded_option *decoded_options)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 /* Set default values. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 global._init ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 global.vendor = lang_hooks.name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 global.params.argv0 = xstrdup (decoded_options[0].arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 global.params.link = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 global.params.useAssert = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 global.params.useInvariants = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 global.params.useIn = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 global.params.useOut = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 global.params.useArrayBounds = BOUNDSCHECKdefault;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 global.params.useSwitchError = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 global.params.useModuleInfo = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 global.params.useTypeInfo = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 global.params.useExceptions = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 global.params.useInline = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 global.params.obj = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 global.params.hdrStripPlainFunctions = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 global.params.betterC = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 global.params.allInst = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 /* Default extern(C++) mangling to C++14. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 global.params.cplusplus = CppStdRevisionCpp14;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 global.params.linkswitches = new Strings ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 global.params.libfiles = new Strings ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 global.params.objfiles = new Strings ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 global.params.ddocfiles = new Strings ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 /* Warnings and deprecations are disabled by default. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 global.params.useDeprecated = DIAGNOSTICoff;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 global.params.warnings = DIAGNOSTICoff;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 global.params.imppath = new Strings ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 global.params.fileImppath = new Strings ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 global.params.modFileAliasStrings = new Strings ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 /* Extra GDC-specific options. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 d_option.fonly = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 d_option.multilib = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 d_option.prefix = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 d_option.deps = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 d_option.deps_skip_system = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 d_option.deps_filename = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 d_option.deps_filename_user = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 d_option.deps_target = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 d_option.deps_phony = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 d_option.stdinc = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 /* Implements the lang_hooks.init_options_struct routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 Initializes the options structure OPTS. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 d_init_options_struct (gcc_options *opts)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 /* GCC options. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 opts->x_flag_exceptions = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 /* Avoid range issues for complex multiply and divide. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 opts->x_flag_complex_method = 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 /* Unlike C, there is no global 'errno' variable. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 opts->x_flag_errno_math = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 opts->frontend_set_flag_errno_math = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 /* Keep in sync with existing -fbounds-check flag. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 opts->x_flag_bounds_check = global.params.useArrayBounds;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 /* D says that signed overflow is precisely defined. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 opts->x_flag_wrapv = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 /* Implements the lang_hooks.lang_mask routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 Returns language mask for option parsing. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 static unsigned int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 d_option_lang_mask (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 return CL_D;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 /* Implements the lang_hooks.init routine for language D. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 d_init (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 Type::_init ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 Id::initialize ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 Module::_init ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 Expression::_init ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 Objc::_init ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 /* Back-end init. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 global_binding_level = ggc_cleared_alloc<binding_level> ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 current_binding_level = global_binding_level;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 /* This allows the code in d-builtins.cc to not have to worry about
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 converting (C signed char *) to (D char *) for string arguments of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 built-in functions. The parameter (signed_char = false) specifies
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 whether char is signed. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 build_common_tree_nodes (false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 d_init_builtins ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 if (flag_exceptions)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 using_eh_for_cleanups ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 if (!supports_one_only ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 flag_weak = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 /* This is the C main, not the D main. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 main_identifier_node = get_identifier ("main");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 Target::_init ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 d_init_versions ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 /* Insert all library-configured identifiers and import paths. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 add_import_paths (d_option.prefix, d_option.multilib, d_option.stdinc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 return 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 /* Implements the lang_hooks.init_ts routine for language D. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 d_init_ts (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 MARK_TS_TYPED (FLOAT_MOD_EXPR);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 MARK_TS_TYPED (UNSIGNED_RSHIFT_EXPR);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 /* Implements the lang_hooks.handle_option routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 Handles D specific options. Return false if we didn't do anything. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 d_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 int kind ATTRIBUTE_UNUSED,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 location_t loc ATTRIBUTE_UNUSED,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 const cl_option_handlers *handlers ATTRIBUTE_UNUSED)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 opt_code code = (opt_code) scode;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 bool result = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 switch (code)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 case OPT_fall_instantiations:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 global.params.allInst = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 case OPT_fassert:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 global.params.useAssert = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 case OPT_fbounds_check:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 global.params.useArrayBounds = value
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 ? BOUNDSCHECKon : BOUNDSCHECKoff;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 case OPT_fbounds_check_:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 global.params.useArrayBounds = (value == 2) ? BOUNDSCHECKon
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 : (value == 1) ? BOUNDSCHECKsafeonly : BOUNDSCHECKoff;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 case OPT_fdebug:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 global.params.debuglevel = value ? 1 : 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 case OPT_fdebug_:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 if (ISDIGIT (arg[0]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 int level = integral_argument (arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 if (level != -1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 DebugCondition::setGlobalLevel (level);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 if (Identifier::isValidIdentifier (CONST_CAST (char *, arg)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 DebugCondition::addGlobalIdent (arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 error ("bad argument for %<-fdebug%>: %qs", arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 case OPT_fdoc:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 global.params.doDocComments = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 case OPT_fdoc_dir_:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 global.params.doDocComments = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 global.params.docdir = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 case OPT_fdoc_file_:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 global.params.doDocComments = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 global.params.docname = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 case OPT_fdoc_inc_:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 global.params.ddocfiles->push (arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 case OPT_fdruntime:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 global.params.betterC = !value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 case OPT_fdump_d_original:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 global.params.vcg_ast = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 case OPT_fexceptions:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 global.params.useExceptions = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 case OPT_fignore_unknown_pragmas:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 global.params.ignoreUnsupportedPragmas = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 case OPT_finvariants:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 global.params.useInvariants = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 case OPT_fmain:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 global.params.addMain = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 case OPT_fmodule_file_:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 global.params.modFileAliasStrings->push (arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 if (!strchr (arg, '='))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 error ("bad argument for %<-fmodule-file%>: %qs", arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 case OPT_fmoduleinfo:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504 global.params.useModuleInfo = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 case OPT_fonly_:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 d_option.fonly = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 case OPT_fpostconditions:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 global.params.useOut = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 case OPT_fpreconditions:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 global.params.useIn = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 case OPT_frelease:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 global.params.release = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523 case OPT_frtti:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 global.params.useTypeInfo = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527 case OPT_fswitch_errors:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 global.params.useSwitchError = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 case OPT_ftransition_all:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532 global.params.vtls = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533 global.params.vfield = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534 global.params.vcomplex = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537 case OPT_ftransition_checkimports:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538 global.params.check10378 = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 case OPT_ftransition_complex:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 global.params.vcomplex = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 case OPT_ftransition_dip1000:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 global.params.vsafe = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 global.params.useDIP25 = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550 case OPT_ftransition_dip25:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 global.params.useDIP25 = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 case OPT_ftransition_field:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555 global.params.vfield = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558 case OPT_ftransition_import:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559 global.params.bug10378 = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562 case OPT_ftransition_nogc:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563 global.params.vgc = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566 case OPT_ftransition_tls:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567 global.params.vtls = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570 case OPT_funittest:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571 global.params.useUnitTests = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574 case OPT_fversion_:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575 if (ISDIGIT (arg[0]))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577 int level = integral_argument (arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 if (level != -1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580 VersionCondition::setGlobalLevel (level);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585 if (Identifier::isValidIdentifier (CONST_CAST (char *, arg)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587 VersionCondition::addGlobalIdent (arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591 error ("bad argument for %<-fversion%>: %qs", arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594 case OPT_H:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595 global.params.doHdrGeneration = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598 case OPT_Hd:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599 global.params.doHdrGeneration = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600 global.params.hdrdir = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603 case OPT_Hf:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 global.params.doHdrGeneration = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605 global.params.hdrname = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608 case OPT_imultilib:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609 d_option.multilib = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612 case OPT_iprefix:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613 d_option.prefix = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616 case OPT_I:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617 global.params.imppath->push (arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620 case OPT_J:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621 global.params.fileImppath->push (arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624 case OPT_MM:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 d_option.deps_skip_system = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626 /* Fall through. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628 case OPT_M:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 d_option.deps = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 case OPT_MMD:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633 d_option.deps_skip_system = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634 /* Fall through. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 case OPT_MD:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637 d_option.deps = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638 d_option.deps_filename = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641 case OPT_MF:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642 /* If specified multiple times, last one wins. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643 d_option.deps_filename_user = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 case OPT_MP:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647 d_option.deps_phony = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650 case OPT_MQ:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651 deps_add_target (arg, true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654 case OPT_MT:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655 deps_add_target (arg, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
656 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
657
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
658 case OPT_nostdinc:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
659 d_option.stdinc = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
660 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
661
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
662 case OPT_v:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
663 global.params.verbose = value;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
664 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
665
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
666 case OPT_Wall:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
667 if (value)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
668 global.params.warnings = DIAGNOSTICinform;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
669 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
670
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
671 case OPT_Wdeprecated:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
672 global.params.useDeprecated = value ? DIAGNOSTICinform : DIAGNOSTICoff;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
673 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
674
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
675 case OPT_Werror:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
676 if (value)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
677 global.params.warnings = DIAGNOSTICerror;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
678 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
679
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
680 case OPT_Wspeculative:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
681 if (value)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
682 global.params.showGaggedErrors = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
683 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
684
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
685 case OPT_Xf:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
686 global.params.jsonfilename = arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
687 /* Fall through. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
688
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
689 case OPT_X:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
690 global.params.doJsonGeneration = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
691 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
692
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
693 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
694 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
695 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
696
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
697 D_handle_option_auto (&global_options, &global_options_set,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
698 scode, arg, value,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
699 d_option_lang_mask (), kind,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
700 loc, handlers, global_dc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
701
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
702 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
703 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
704
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
705 /* Implements the lang_hooks.post_options routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
706 Deal with any options that imply the turning on/off of features.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
707 FN is the main input filename passed on the command line. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
708
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
709 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
710 d_post_options (const char ** fn)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
711 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
712 /* Verify the input file name. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
713 const char *filename = *fn;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
714 if (!filename || strcmp (filename, "-") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
715 filename = "";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
716
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
717 /* The front end considers the first input file to be the main one. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
718 *fn = filename;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
719
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
720 /* Release mode doesn't turn off bounds checking for safe functions. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
721 if (global.params.useArrayBounds == BOUNDSCHECKdefault)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
722 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
723 global.params.useArrayBounds = global.params.release
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
724 ? BOUNDSCHECKsafeonly : BOUNDSCHECKon;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
725 flag_bounds_check = !global.params.release;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
726 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
727
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
728 if (global.params.release)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
729 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
730 if (!global_options_set.x_flag_invariants)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
731 global.params.useInvariants = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
732
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
733 if (!global_options_set.x_flag_preconditions)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
734 global.params.useIn = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
735
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
736 if (!global_options_set.x_flag_postconditions)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
737 global.params.useOut = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
738
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
739 if (!global_options_set.x_flag_assert)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
740 global.params.useAssert = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
741
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
742 if (!global_options_set.x_flag_switch_errors)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
743 global.params.useSwitchError = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
744 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
745
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
746 if (global.params.betterC)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
747 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
748 if (!global_options_set.x_flag_moduleinfo)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
749 global.params.useModuleInfo = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
750
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
751 if (!global_options_set.x_flag_rtti)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
752 global.params.useTypeInfo = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
753
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
754 if (!global_options_set.x_flag_exceptions)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
755 global.params.useExceptions = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
756
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
757 global.params.checkAction = CHECKACTION_halt;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
758 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
759
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
760 /* Turn off partitioning unless it was explicitly requested, as it doesn't
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
761 work with D exception chaining, where EH handler uses LSDA to determine
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
762 whether two thrown exception are in the same context. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
763 if (!global_options_set.x_flag_reorder_blocks_and_partition)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
764 global_options.x_flag_reorder_blocks_and_partition = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
765
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
766 /* Error about use of deprecated features. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
767 if (global.params.useDeprecated == DIAGNOSTICinform
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
768 && global.params.warnings == DIAGNOSTICerror)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
769 global.params.useDeprecated = DIAGNOSTICerror;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
770
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
771 /* Make -fmax-errors visible to frontend's diagnostic machinery. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
772 if (global_options_set.x_flag_max_errors)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
773 global.errorLimit = flag_max_errors;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
774
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
775 if (flag_excess_precision == EXCESS_PRECISION_DEFAULT)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
776 flag_excess_precision = EXCESS_PRECISION_STANDARD;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
777
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
778 if (global.params.useUnitTests)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
779 global.params.useAssert = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
780
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
781 global.params.symdebug = write_symbols != NO_DEBUG;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
782 global.params.useInline = flag_inline_functions;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
783 global.params.showColumns = flag_show_column;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
784
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
785 if (global.params.useInline)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
786 global.params.hdrStripPlainFunctions = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
787
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
788 global.params.obj = !flag_syntax_only;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
789
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
790 /* Has no effect yet. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
791 global.params.pic = flag_pic != 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
792
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
793 if (warn_return_type == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
794 warn_return_type = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
795
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
796 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
797 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
798
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
799 /* Return TRUE if an operand OP of a given TYPE being copied has no data.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
800 The middle-end does a similar check with zero sized types. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
801
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
802 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
803 empty_modify_p (tree type, tree op)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
804 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
805 tree_code code = TREE_CODE (op);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
806 switch (code)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
807 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
808 case COMPOUND_EXPR:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
809 return empty_modify_p (type, TREE_OPERAND (op, 1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
810
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
811 case CONSTRUCTOR:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
812 /* Non-empty construcors are valid. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
813 if (CONSTRUCTOR_NELTS (op) != 0 || TREE_CLOBBER_P (op))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
814 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
815 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
816
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
817 case CALL_EXPR:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
818 /* Leave nrvo alone because it isn't a copy. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
819 if (CALL_EXPR_RETURN_SLOT_OPT (op))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
820 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
821 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
822
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
823 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
824 /* If the operand doesn't have a simple form. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
825 if (!is_gimple_lvalue (op) && !INDIRECT_REF_P (op))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
826 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
827 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
828 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
829
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
830 return empty_aggregate_p (type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
831 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
832
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
833 /* Implements the lang_hooks.gimplify_expr routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
834 Do gimplification of D specific expression trees in EXPR_P. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
835
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
836 int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
837 d_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
838 gimple_seq *post_p ATTRIBUTE_UNUSED)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
839 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
840 tree_code code = TREE_CODE (*expr_p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
841 enum gimplify_status ret = GS_UNHANDLED;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
842 tree op0, op1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
843 tree type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
844
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
845 switch (code)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
846 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
847 case INIT_EXPR:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
848 case MODIFY_EXPR:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
849 op0 = TREE_OPERAND (*expr_p, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
850 op1 = TREE_OPERAND (*expr_p, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
851
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
852 if (!error_operand_p (op0) && !error_operand_p (op1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
853 && (AGGREGATE_TYPE_P (TREE_TYPE (op0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
854 || AGGREGATE_TYPE_P (TREE_TYPE (op1)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
855 && !useless_type_conversion_p (TREE_TYPE (op1), TREE_TYPE (op0)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
856 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
857 /* If the back end isn't clever enough to know that the lhs and rhs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
858 types are the same, add an explicit conversion. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
859 TREE_OPERAND (*expr_p, 1) = build1 (VIEW_CONVERT_EXPR,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
860 TREE_TYPE (op0), op1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
861 ret = GS_OK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
862 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
863 else if (empty_modify_p (TREE_TYPE (op0), op1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
864 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
865 /* Remove any copies of empty aggregates. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
866 gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
867 is_gimple_lvalue, fb_lvalue);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
868
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
869 if (TREE_SIDE_EFFECTS (op1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
870 gimplify_and_add (op1, pre_p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
871
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
872 *expr_p = TREE_OPERAND (*expr_p, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
873 ret = GS_OK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
874 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
875 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
876
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
877 case ADDR_EXPR:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
878 op0 = TREE_OPERAND (*expr_p, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
879 /* Constructors are not lvalues, so make them one. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
880 if (TREE_CODE (op0) == CONSTRUCTOR)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
881 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
882 TREE_OPERAND (*expr_p, 0) = force_target_expr (op0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
883 ret = GS_OK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
884 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
885 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
886
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
887 case CALL_EXPR:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
888 if (CALL_EXPR_ARGS_ORDERED (*expr_p))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
889 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
890 /* Strictly evaluate all arguments from left to right. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
891 int nargs = call_expr_nargs (*expr_p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
892 location_t loc = EXPR_LOC_OR_LOC (*expr_p, input_location);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
893
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
894 /* No need to enforce evaluation order if only one argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
895 if (nargs < 2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
896 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
897
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
898 /* Or if all arguments are already free of side-effects. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
899 bool has_side_effects = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
900 for (int i = 0; i < nargs; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
901 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
902 if (TREE_SIDE_EFFECTS (CALL_EXPR_ARG (*expr_p, i)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
903 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
904 has_side_effects = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
905 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
906 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
907 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
908
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
909 if (!has_side_effects)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
910 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
911
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
912 /* Leave the last argument for gimplify_call_expr. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
913 for (int i = 0; i < nargs - 1; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
914 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
915 tree new_arg = CALL_EXPR_ARG (*expr_p, i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
916
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
917 /* If argument has a side-effect, gimplify_arg will handle it. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
918 if (gimplify_arg (&new_arg, pre_p, loc) == GS_ERROR)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
919 ret = GS_ERROR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
920
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
921 /* Even if an argument itself doesn't have any side-effects, it
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
922 might be altered by another argument in the list. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
923 if (new_arg == CALL_EXPR_ARG (*expr_p, i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
924 && !really_constant_p (new_arg))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
925 new_arg = get_formal_tmp_var (new_arg, pre_p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
926
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
927 CALL_EXPR_ARG (*expr_p, i) = new_arg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
928 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
929
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
930 if (ret != GS_ERROR)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
931 ret = GS_OK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
932 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
933 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
934
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
935 case UNSIGNED_RSHIFT_EXPR:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
936 /* Convert op0 to an unsigned type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
937 op0 = TREE_OPERAND (*expr_p, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
938 op1 = TREE_OPERAND (*expr_p, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
939
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
940 type = d_unsigned_type (TREE_TYPE (op0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
941
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
942 *expr_p = convert (TREE_TYPE (*expr_p),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
943 build2 (RSHIFT_EXPR, type, convert (type, op0), op1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
944 ret = GS_OK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
945 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
946
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
947 case FLOAT_MOD_EXPR:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
948 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
949
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
950 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
951 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
952 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
953
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
954 return ret;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
955 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
956
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
957 /* Add the module M to the list of modules that may declare GCC builtins.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
958 These are scanned after first semantic and before codegen passes.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
959 See d_maybe_set_builtin() for the implementation. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
960
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
961 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
962 d_add_builtin_module (Module *m)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
963 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
964 builtin_modules.push (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
965 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
966
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
967 /* Record the entrypoint module ENTRY which will be compiled in the current
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
968 compilation. ROOT is the module scope where this was requested from. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
969
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
970 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
971 d_add_entrypoint_module (Module *entry, Module *root)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
972 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
973 /* We are emitting this straight to object file. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
974 entrypoint_module = entry;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
975 entrypoint_root_module = root;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
976 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
977
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
978 /* Implements the lang_hooks.parse_file routine for language D. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
979
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
980 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
981 d_parse_file (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
982 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
983 if (global.params.verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
984 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
985 message ("binary %s", global.params.argv0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
986 message ("version %s", global.version);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
987
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
988 if (global.params.versionids)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
989 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
990 OutBuffer buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
991 buf.writestring ("predefs ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
992 for (size_t i = 0; i < global.params.versionids->dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
993 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
994 const char *s = (*global.params.versionids)[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
995 buf.writestring (" ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
996 buf.writestring (s);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
997 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
998
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
999 message ("%.*s", (int) buf.offset, (char *) buf.data);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1000 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1001 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1002
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1003 /* Start the main input file, if the debug writer wants it. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1004 if (debug_hooks->start_end_main_source_file)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1005 debug_hooks->start_source_file (0, main_input_filename);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1006
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1007 /* Create Module's for all sources we will load. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1008 Modules modules;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1009 modules.reserve (num_in_fnames);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1010
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1011 /* In this mode, the first file name is supposed to be a duplicate
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1012 of one of the input files. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1013 if (d_option.fonly && strcmp (d_option.fonly, main_input_filename) != 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1014 error ("%<-fonly=%> argument is different from first input file name");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1015
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1016 for (size_t i = 0; i < num_in_fnames; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1017 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1018 if (strcmp (in_fnames[i], "-") == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1019 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1020 /* Handling stdin, generate a unique name for the module. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1021 obstack buffer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1022 gcc_obstack_init (&buffer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1023 int c;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1024
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1025 Module *m = Module::create (in_fnames[i],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1026 Identifier::generateId ("__stdin"),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1027 global.params.doDocComments,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1028 global.params.doHdrGeneration);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1029 modules.push (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1030
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1031 /* Load the entire contents of stdin into memory. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1032 while ((c = getc (stdin)) != EOF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1033 obstack_1grow (&buffer, c);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1034
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1035 if (!obstack_object_size (&buffer))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1036 obstack_1grow (&buffer, '\0');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1037
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1038 /* Overwrite the source file for the module, the one created by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1039 Module::create would have a forced a `.d' suffix. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1040 m->srcfile = File::create ("<stdin>");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1041 m->srcfile->len = obstack_object_size (&buffer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1042 m->srcfile->buffer = (unsigned char *) obstack_finish (&buffer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1043
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1044 /* Tell the front-end not to free the buffer after parsing. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1045 m->srcfile->ref = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1046 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1047 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1048 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1049 /* Handling a D source file, strip off the path and extension. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1050 const char *basename = FileName::name (in_fnames[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1051 const char *name = FileName::removeExt (basename);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1052
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1053 Module *m = Module::create (in_fnames[i], Identifier::idPool (name),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1054 global.params.doDocComments,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1055 global.params.doHdrGeneration);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1056 modules.push (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1057 FileName::free (name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1058 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1059 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1060
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1061 /* Read all D source files. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1062 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1063 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1064 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1065 m->read (Loc ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1066 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1067
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1068 /* Parse all D source files. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1069 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1070 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1071 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1072
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1073 if (global.params.verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1074 message ("parse %s", m->toChars ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1075
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1076 if (!Module::rootModule)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1077 Module::rootModule = m;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1078
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1079 m->importedFrom = m;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1080 m->parse ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1081 Compiler::loadModule (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1082
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1083 if (m->isDocFile)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1084 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1085 gendocfile (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1086 /* Remove M from list of modules. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1087 modules.remove (i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1088 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1089 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1090 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1091
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1092 /* Load the module containing D main. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1093 if (global.params.addMain)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1094 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1095 unsigned errors = global.startGagging ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1096 Module *m = Module::load (Loc (), NULL, Identifier::idPool ("__main"));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1097
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1098 if (! global.endGagging (errors))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1099 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1100 m->importedFrom = m;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1101 modules.push (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1102 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1103 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1104
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1105 if (global.errors)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1106 goto had_errors;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1107
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1108 if (global.params.doHdrGeneration)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1109 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1110 /* Generate 'header' import files. Since 'header' import files must be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1111 independent of command line switches and what else is imported, they
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1112 are generated before any semantic analysis. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1113 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1114 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1115 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1116 if (d_option.fonly && m != Module::rootModule)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1117 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1118
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1119 if (global.params.verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1120 message ("import %s", m->toChars ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1121
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1122 genhdrfile (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1123 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1124 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1125
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1126 if (global.errors)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1127 goto had_errors;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1128
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1129 /* Load all unconditional imports for better symbol resolving. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1130 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1131 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1132 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1134 if (global.params.verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1135 message ("importall %s", m->toChars ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1136
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1137 m->importAll (NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1138 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1139
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1140 if (global.errors)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1141 goto had_errors;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1142
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1143 /* Do semantic analysis. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1144 doing_semantic_analysis_p = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1146 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1147 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1148 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1149
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1150 if (global.params.verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1151 message ("semantic %s", m->toChars ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1152
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1153 m->semantic (NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1154 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1155
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1156 /* Do deferred semantic analysis. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1157 Module::dprogress = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1158 Module::runDeferredSemantic ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1159
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1160 if (Module::deferred.dim)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1161 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1162 for (size_t i = 0; i < Module::deferred.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1163 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1164 Dsymbol *sd = Module::deferred[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1165 error_at (make_location_t (sd->loc),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1166 "unable to resolve forward reference in definition");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1167 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1168 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1169
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1170 /* Process all built-in modules or functions now for CTFE. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1171 while (builtin_modules.dim != 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1172 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1173 Module *m = builtin_modules.pop ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1174 d_maybe_set_builtin (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1175 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1177 /* Do pass 2 semantic analysis. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1178 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1179 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1180 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1181
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1182 if (global.params.verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1183 message ("semantic2 %s", m->toChars ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1184
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1185 m->semantic2 (NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1186 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1187
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1188 Module::runDeferredSemantic2 ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1189
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1190 if (global.errors)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1191 goto had_errors;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1192
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1193 /* Do pass 3 semantic analysis. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1194 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1195 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1196 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1197
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1198 if (global.params.verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1199 message ("semantic3 %s", m->toChars ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1200
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1201 m->semantic3 (NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1202 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1203
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1204 Module::runDeferredSemantic3 ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1205
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1206 /* Check again, incase semantic3 pass loaded any more modules. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1207 while (builtin_modules.dim != 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1208 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1209 Module *m = builtin_modules.pop ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1210 d_maybe_set_builtin (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1211 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1212
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1213 /* Do not attempt to generate output files if errors or warnings occurred. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1214 if (global.errors || global.warnings)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1215 goto had_errors;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1216
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1217 /* Generate output files. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1218 doing_semantic_analysis_p = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1219
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1220 if (Module::rootModule)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1221 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1222 /* Declare the name of the root module as the first global name in order
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1223 to make the middle-end fully deterministic. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1224 OutBuffer buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1225 mangleToBuffer (Module::rootModule, &buf);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1226 first_global_object_name = buf.extractString ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1227 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1228
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1229 /* Make dependencies. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1230 if (d_option.deps)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1231 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1232 OutBuffer buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1233
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1234 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1235 deps_write (modules[i], &buf);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1236
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1237 /* -MF <arg> overrides -M[M]D. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1238 if (d_option.deps_filename_user)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1239 d_option.deps_filename = d_option.deps_filename_user;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1240
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1241 if (d_option.deps_filename)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1242 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1243 File *fdeps = File::create (d_option.deps_filename);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1244 fdeps->setbuffer ((void *) buf.data, buf.offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1245 fdeps->ref = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1246 writeFile (Loc (), fdeps);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1247 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1248 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1249 message ("%.*s", (int) buf.offset, (char *) buf.data);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1250 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1251
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1252 /* Generate JSON files. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1253 if (global.params.doJsonGeneration)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1254 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1255 OutBuffer buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1256 json_generate (&buf, &modules);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1257
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1258 const char *name = global.params.jsonfilename;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1259
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1260 if (name && (name[0] != '-' || name[1] != '\0'))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1261 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1262 const char *nameext = FileName::defaultExt (name, global.json_ext);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1263 File *fjson = File::create (nameext);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1264 fjson->setbuffer ((void *) buf.data, buf.offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1265 fjson->ref = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1266 writeFile (Loc (), fjson);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1267 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1268 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1269 message ("%.*s", (int) buf.offset, (char *) buf.data);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1270 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1271
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1272 /* Generate Ddoc files. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1273 if (global.params.doDocComments && !global.errors && !errorcount)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1274 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1275 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1276 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1277 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1278 gendocfile (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1279 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1280 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1281
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1282 /* Handle -fdump-d-original. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1283 if (global.params.vcg_ast)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1284 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1285 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1286 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1287 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1288 OutBuffer buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1289 buf.doindent = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1290
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1291 moduleToBuffer (&buf, m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1292 message ("%.*s", (int) buf.offset, (char *) buf.data);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1293 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1294 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1295
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1296 for (size_t i = 0; i < modules.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1297 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1298 Module *m = modules[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1299 if (d_option.fonly && m != Module::rootModule)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1300 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1301
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1302 if (global.params.verbose)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1303 message ("code %s", m->toChars ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1304
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1305 if (!flag_syntax_only)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1306 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1307 if ((entrypoint_module != NULL) && (m == entrypoint_root_module))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1308 build_decl_tree (entrypoint_module);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1309
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1310 build_decl_tree (m);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1311 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1312 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1313
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1314 /* And end the main input file, if the debug writer wants it. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1315 if (debug_hooks->start_end_main_source_file)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1316 debug_hooks->end_source_file (0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1317
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1318 had_errors:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1319 /* Add the D frontend error count to the GCC error count to correctly
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1320 exit with an error status. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1321 errorcount += (global.errors + global.warnings);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1322
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1323 /* Write out globals. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1324 d_finish_compilation (vec_safe_address (global_declarations),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1325 vec_safe_length (global_declarations));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1326 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1327
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1328 /* Implements the lang_hooks.types.type_for_mode routine for language D. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1329
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1330 static tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1331 d_type_for_mode (machine_mode mode, int unsignedp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1332 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1333 if (mode == QImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1334 return unsignedp ? d_ubyte_type : d_byte_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1335
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1336 if (mode == HImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1337 return unsignedp ? d_ushort_type : d_short_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1338
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1339 if (mode == SImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1340 return unsignedp ? d_uint_type : d_int_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1341
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1342 if (mode == DImode)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1343 return unsignedp ? d_ulong_type : d_long_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1344
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1345 if (mode == TYPE_MODE (d_cent_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1346 return unsignedp ? d_ucent_type : d_cent_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1347
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1348 if (mode == TYPE_MODE (float_type_node))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1349 return float_type_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1350
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1351 if (mode == TYPE_MODE (double_type_node))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1352 return double_type_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1353
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1354 if (mode == TYPE_MODE (long_double_type_node))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1355 return long_double_type_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1356
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1357 if (mode == TYPE_MODE (build_pointer_type (char8_type_node)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1358 return build_pointer_type (char8_type_node);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1359
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1360 if (mode == TYPE_MODE (build_pointer_type (d_int_type)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1361 return build_pointer_type (d_int_type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1362
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1363 for (int i = 0; i < NUM_INT_N_ENTS; i ++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1364 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1365 if (int_n_enabled_p[i] && mode == int_n_data[i].m)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1366 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1367 if (unsignedp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1368 return int_n_trees[i].unsigned_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1369 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1370 return int_n_trees[i].signed_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1371 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1372 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1373
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1374 if (COMPLEX_MODE_P (mode))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1375 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1376 machine_mode inner_mode;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1377 tree inner_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1378
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1379 if (mode == TYPE_MODE (complex_float_type_node))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1380 return complex_float_type_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1381 if (mode == TYPE_MODE (complex_double_type_node))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1382 return complex_double_type_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1383 if (mode == TYPE_MODE (complex_long_double_type_node))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1384 return complex_long_double_type_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1385
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1386 inner_mode = (machine_mode) GET_MODE_INNER (mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1387 inner_type = d_type_for_mode (inner_mode, unsignedp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1388 if (inner_type != NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1389 return build_complex_type (inner_type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1390 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1391 else if (VECTOR_MODE_P (mode))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1392 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1393 machine_mode inner_mode = (machine_mode) GET_MODE_INNER (mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1394 tree inner_type = d_type_for_mode (inner_mode, unsignedp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1395 if (inner_type != NULL_TREE)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1396 return build_vector_type_for_mode (inner_type, mode);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1397 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1398
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1399 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1400 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1401
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1402 /* Implements the lang_hooks.types.type_for_size routine for language D. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1403
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1404 static tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1405 d_type_for_size (unsigned bits, int unsignedp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1406 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1407 if (bits <= TYPE_PRECISION (d_byte_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1408 return unsignedp ? d_ubyte_type : d_byte_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1409
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1410 if (bits <= TYPE_PRECISION (d_short_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1411 return unsignedp ? d_ushort_type : d_short_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1412
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1413 if (bits <= TYPE_PRECISION (d_int_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1414 return unsignedp ? d_uint_type : d_int_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1415
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1416 if (bits <= TYPE_PRECISION (d_long_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1417 return unsignedp ? d_ulong_type : d_long_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1418
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1419 if (bits <= TYPE_PRECISION (d_cent_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1420 return unsignedp ? d_ucent_type : d_cent_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1421
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1422 for (int i = 0; i < NUM_INT_N_ENTS; i ++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1423 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1424 if (int_n_enabled_p[i] && bits == int_n_data[i].bitsize)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1425 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1426 if (unsignedp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1427 return int_n_trees[i].unsigned_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1428 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1429 return int_n_trees[i].signed_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1430 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1431 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1432
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1433 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1434 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1435
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1436 /* Return the signed or unsigned version of TYPE, an integral type, the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1437 signedness being specified by UNSIGNEDP. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1438
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1439 static tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1440 d_signed_or_unsigned_type (int unsignedp, tree type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1441 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1442 if (TYPE_UNSIGNED (type) == (unsigned) unsignedp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1443 return type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1444
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1445 if (TYPE_PRECISION (type) == TYPE_PRECISION (d_cent_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1446 return unsignedp ? d_ucent_type : d_cent_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1447
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1448 if (TYPE_PRECISION (type) == TYPE_PRECISION (d_long_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1449 return unsignedp ? d_ulong_type : d_long_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1450
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1451 if (TYPE_PRECISION (type) == TYPE_PRECISION (d_int_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1452 return unsignedp ? d_uint_type : d_int_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1453
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1454 if (TYPE_PRECISION (type) == TYPE_PRECISION (d_short_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1455 return unsignedp ? d_ushort_type : d_short_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1456
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1457 if (TYPE_PRECISION (type) == TYPE_PRECISION (d_byte_type))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1458 return unsignedp ? d_ubyte_type : d_byte_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1459
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1460 return signed_or_unsigned_type_for (unsignedp, type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1461 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1462
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1463 /* Return the unsigned version of TYPE, an integral type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1464
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1465 tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1466 d_unsigned_type (tree type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1467 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1468 return d_signed_or_unsigned_type (1, type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1469 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1470
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1471 /* Return the signed version of TYPE, an integral type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1472
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1473 tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1474 d_signed_type (tree type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1475 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1476 return d_signed_or_unsigned_type (0, type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1477 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1478
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1479 /* Implements the lang_hooks.types.type_promotes_to routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1480 All promotions for variable arguments are handled by the D frontend. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1481
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1482 static tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1483 d_type_promotes_to (tree type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1484 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1485 return type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1486 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1487
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1488 /* Implements the lang_hooks.decls.global_bindings_p routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1489 Return true if we are in the global binding level. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1490
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1491 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1492 d_global_bindings_p (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1493 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1494 return (current_binding_level == global_binding_level);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1495 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1496
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1497 /* Return global_context, but create it first if need be. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1498
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1499 static tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1500 get_global_context (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1501 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1502 if (!global_context)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1503 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1504 global_context = build_translation_unit_decl (NULL_TREE);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1505 debug_hooks->register_main_translation_unit (global_context);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1506 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1507
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1508 return global_context;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1509 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1510
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1511 /* Implements the lang_hooks.decls.pushdecl routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1512 Record DECL as belonging to the current lexical scope. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1513
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1514 tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1515 d_pushdecl (tree decl)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1516 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1517 /* Set the context of the decl. If current_function_decl did not help in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1518 determining the context, use global scope. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1519 if (!DECL_CONTEXT (decl))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1520 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1521 if (current_function_decl)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1522 DECL_CONTEXT (decl) = current_function_decl;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1523 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1524 DECL_CONTEXT (decl) = get_global_context ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1525 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1526
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1527 /* Put decls on list in reverse order. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1528 if (TREE_STATIC (decl) || d_global_bindings_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1529 vec_safe_push (global_declarations, decl);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1530 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1531 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1532 TREE_CHAIN (decl) = current_binding_level->names;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1533 current_binding_level->names = decl;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1534 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1535
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1536 return decl;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1537 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1538
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1539 /* Implements the lang_hooks.decls.getdecls routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1540 Return the list of declarations of the current level. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1541
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1542 static tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1543 d_getdecls (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1544 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1545 if (current_binding_level)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1546 return current_binding_level->names;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1547
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1548 return NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1549 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1550
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1551
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1552 /* Implements the lang_hooks.get_alias_set routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1553 Get the alias set corresponding to type or expression T.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1554 Return -1 if we don't do anything special. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1555
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1556 static alias_set_type
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1557 d_get_alias_set (tree)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1558 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1559 /* For now in D, assume everything aliases everything else, until we define
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1560 some solid rules backed by a specification. There are also some parts
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1561 of code generation routines that don't adhere to C alias rules, such as
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1562 build_vconvert. In any case, a lot of user code already assumes there
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1563 is no strict aliasing and will break if we were to change that. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1564 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1565 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1566
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1567 /* Implements the lang_hooks.types_compatible_p routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1568 Compares two types for equivalence in the D programming language.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1569 This routine should only return 1 if it is sure, even though the frontend
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1570 should have already ensured that all types are compatible before handing
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1571 over the parsed ASTs to the code generator. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1572
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1573 static int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1574 d_types_compatible_p (tree x, tree y)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1575 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1576 Type *tx = TYPE_LANG_FRONTEND (x);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1577 Type *ty = TYPE_LANG_FRONTEND (y);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1578
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1579 /* Try validating the types in the frontend. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1580 if (tx != NULL && ty != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1581 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1582 /* Types are equivalent. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1583 if (same_type_p (tx, ty))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1584 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1585
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1586 /* Type system allows implicit conversion between. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1587 if (tx->implicitConvTo (ty) || ty->implicitConvTo (tx))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1588 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1589 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1590
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1591 /* Fallback on using type flags for comparison. E.g: all dynamic arrays
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1592 are distinct types in D, but are VIEW_CONVERT compatible. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1593 if (TREE_CODE (x) == RECORD_TYPE && TREE_CODE (y) == RECORD_TYPE)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1594 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1595 if (TYPE_DYNAMIC_ARRAY (x) && TYPE_DYNAMIC_ARRAY (y))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1596 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1597
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1598 if (TYPE_DELEGATE (x) && TYPE_DELEGATE (y))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1599 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1600
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1601 if (TYPE_ASSOCIATIVE_ARRAY (x) && TYPE_ASSOCIATIVE_ARRAY (y))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1602 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1603 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1604
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1605 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1606 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1607
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1608 /* Implements the lang_hooks.finish_incomplete_decl routine for language D. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1609
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1610 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1611 d_finish_incomplete_decl (tree decl)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1612 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1613 if (VAR_P (decl))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1614 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1615 /* D allows zero-length declarations. Such a declaration ends up with
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1616 DECL_SIZE (t) == NULL_TREE which is what the back-end function
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1617 assembler_variable checks. This could change in later versions, or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1618 maybe all of these variables should be aliased to one symbol. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1619 if (DECL_SIZE (decl) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1620 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1621 DECL_SIZE (decl) = bitsize_zero_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1622 DECL_SIZE_UNIT (decl) = size_zero_node;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1623 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1624 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1625 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1626
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1627 /* Implements the lang_hooks.types.classify_record routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1628 Return the true debug type for TYPE. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1629
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1630 static classify_record
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1631 d_classify_record (tree type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1632 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1633 Type *t = TYPE_LANG_FRONTEND (type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1634
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1635 if (t && t->ty == Tclass)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1636 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1637 TypeClass *tc = (TypeClass *) t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1638
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1639 /* extern(C++) interfaces get emitted as classes. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1640 if (tc->sym->isInterfaceDeclaration ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1641 && !tc->sym->isCPPinterface ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1642 return RECORD_IS_INTERFACE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1643
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1644 return RECORD_IS_CLASS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1645 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1646
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1647 return RECORD_IS_STRUCT;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1648 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1649
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1650 /* Implements the lang_hooks.tree_size routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1651 Determine the size of our tcc_constant or tcc_exceptional nodes. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1652
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1653 static size_t
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1654 d_tree_size (tree_code code)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1655 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1656 switch (code)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1657 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1658 case FUNCFRAME_INFO:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1659 return sizeof (tree_frame_info);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1660
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1661 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1662 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1663 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1664 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1665
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1666 /* Implements the lang_hooks.print_xnode routine for language D. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1667
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1668 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1669 d_print_xnode (FILE *file, tree node, int indent)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1670 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1671 switch (TREE_CODE (node))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1672 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1673 case FUNCFRAME_INFO:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1674 print_node (file, "frame_type", FRAMEINFO_TYPE (node), indent + 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1675 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1676
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1677 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1678 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1679 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1680 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1681
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1682 /* Return which tree structure is used by NODE, or TS_D_GENERIC if NODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1683 is one of the language-independent trees. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1684
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1685 d_tree_node_structure_enum
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1686 d_tree_node_structure (lang_tree_node *t)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1687 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1688 switch (TREE_CODE (&t->generic))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1689 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1690 case IDENTIFIER_NODE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1691 return TS_D_IDENTIFIER;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1692
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1693 case FUNCFRAME_INFO:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1694 return TS_D_FRAMEINFO;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1695
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1696 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1697 return TS_D_GENERIC;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1698 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1699 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1700
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1701 /* Allocate and return a lang specific structure for the frontend type. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1702
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1703 struct lang_type *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1704 build_lang_type (Type *t)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1705 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1706 struct lang_type *lt = ggc_cleared_alloc<struct lang_type> ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1707 lt->type = t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1708 return lt;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1709 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1710
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1711 /* Allocate and return a lang specific structure for the frontend decl. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1712
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1713 struct lang_decl *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1714 build_lang_decl (Declaration *d)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1715 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1716 /* For compiler generated run-time typeinfo, a lang_decl is allocated even if
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1717 there's no associated frontend symbol to refer to (yet). If the symbol
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1718 appears later in the compilation, then the slot will be re-used. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1719 if (d == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1720 return ggc_cleared_alloc<struct lang_decl> ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1721
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1722 struct lang_decl *ld = (d->csym) ? DECL_LANG_SPECIFIC (d->csym) : NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1723 if (ld == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1724 ld = ggc_cleared_alloc<struct lang_decl> ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1725
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1726 if (ld->decl == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1727 ld->decl = d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1728
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1729 return ld;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1730 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1731
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1732 /* Implements the lang_hooks.dup_lang_specific_decl routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1733 Replace the DECL_LANG_SPECIFIC field of NODE with a copy. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1734
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1735 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1736 d_dup_lang_specific_decl (tree node)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1737 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1738 if (! DECL_LANG_SPECIFIC (node))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1739 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1740
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1741 struct lang_decl *ld = ggc_alloc<struct lang_decl> ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1742 memcpy (ld, DECL_LANG_SPECIFIC (node), sizeof (struct lang_decl));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1743 DECL_LANG_SPECIFIC (node) = ld;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1744 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1745
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1746 /* This preserves trees we create from the garbage collector. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1747
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1748 static GTY(()) tree d_keep_list = NULL_TREE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1749
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1750 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1751 d_keep (tree t)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1752 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1753 d_keep_list = tree_cons (NULL_TREE, t, d_keep_list);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1754 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1755
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1756 /* Implements the lang_hooks.eh_personality routine for language D.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1757 Return the GDC personality function decl. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1758
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1759 static GTY(()) tree d_eh_personality_decl;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1760
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1761 static tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1762 d_eh_personality (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1763 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1764 if (!d_eh_personality_decl)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1765 d_eh_personality_decl = build_personality_function ("gdc");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1766
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1767 return d_eh_personality_decl;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1768 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1769
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1770 /* Implements the lang_hooks.eh_runtime_type routine for language D. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1771
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1772 static tree
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1773 d_build_eh_runtime_type (tree type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1774 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1775 Type *t = TYPE_LANG_FRONTEND (type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1776
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1777 if (t != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1778 t = t->toBasetype ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1779
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1780 gcc_assert (t != NULL && t->ty == Tclass);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1781 ClassDeclaration *cd = ((TypeClass *) t)->sym;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1782 tree decl;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1783
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1784 if (cd->isCPPclass ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1785 decl = get_cpp_typeinfo_decl (cd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1786 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1787 decl = get_classinfo_decl (cd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1788
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1789 return convert (ptr_type_node, build_address (decl));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1790 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1791
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1792 /* Definitions for our language-specific hooks. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1793
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1794 #undef LANG_HOOKS_NAME
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1795 #undef LANG_HOOKS_INIT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1796 #undef LANG_HOOKS_INIT_TS
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1797 #undef LANG_HOOKS_INIT_OPTIONS
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1798 #undef LANG_HOOKS_INIT_OPTIONS_STRUCT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1799 #undef LANG_HOOKS_OPTION_LANG_MASK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1800 #undef LANG_HOOKS_HANDLE_OPTION
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1801 #undef LANG_HOOKS_POST_OPTIONS
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1802 #undef LANG_HOOKS_PARSE_FILE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1803 #undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1804 #undef LANG_HOOKS_ATTRIBUTE_TABLE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1805 #undef LANG_HOOKS_GET_ALIAS_SET
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1806 #undef LANG_HOOKS_TYPES_COMPATIBLE_P
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1807 #undef LANG_HOOKS_BUILTIN_FUNCTION
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1808 #undef LANG_HOOKS_REGISTER_BUILTIN_TYPE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1809 #undef LANG_HOOKS_FINISH_INCOMPLETE_DECL
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1810 #undef LANG_HOOKS_GIMPLIFY_EXPR
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1811 #undef LANG_HOOKS_CLASSIFY_RECORD
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1812 #undef LANG_HOOKS_TREE_SIZE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1813 #undef LANG_HOOKS_PRINT_XNODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1814 #undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1815 #undef LANG_HOOKS_EH_PERSONALITY
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1816 #undef LANG_HOOKS_EH_RUNTIME_TYPE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1817 #undef LANG_HOOKS_PUSHDECL
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1818 #undef LANG_HOOKS_GETDECLS
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1819 #undef LANG_HOOKS_GLOBAL_BINDINGS_P
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1820 #undef LANG_HOOKS_TYPE_FOR_MODE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1821 #undef LANG_HOOKS_TYPE_FOR_SIZE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1822 #undef LANG_HOOKS_TYPE_PROMOTES_TO
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1823
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1824 #define LANG_HOOKS_NAME "GNU D"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1825 #define LANG_HOOKS_INIT d_init
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1826 #define LANG_HOOKS_INIT_TS d_init_ts
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1827 #define LANG_HOOKS_INIT_OPTIONS d_init_options
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1828 #define LANG_HOOKS_INIT_OPTIONS_STRUCT d_init_options_struct
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1829 #define LANG_HOOKS_OPTION_LANG_MASK d_option_lang_mask
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1830 #define LANG_HOOKS_HANDLE_OPTION d_handle_option
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1831 #define LANG_HOOKS_POST_OPTIONS d_post_options
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1832 #define LANG_HOOKS_PARSE_FILE d_parse_file
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1833 #define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE d_langhook_common_attribute_table
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1834 #define LANG_HOOKS_ATTRIBUTE_TABLE d_langhook_attribute_table
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1835 #define LANG_HOOKS_GET_ALIAS_SET d_get_alias_set
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1836 #define LANG_HOOKS_TYPES_COMPATIBLE_P d_types_compatible_p
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1837 #define LANG_HOOKS_BUILTIN_FUNCTION d_builtin_function
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1838 #define LANG_HOOKS_REGISTER_BUILTIN_TYPE d_register_builtin_type
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1839 #define LANG_HOOKS_FINISH_INCOMPLETE_DECL d_finish_incomplete_decl
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1840 #define LANG_HOOKS_GIMPLIFY_EXPR d_gimplify_expr
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1841 #define LANG_HOOKS_CLASSIFY_RECORD d_classify_record
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1842 #define LANG_HOOKS_TREE_SIZE d_tree_size
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1843 #define LANG_HOOKS_PRINT_XNODE d_print_xnode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1844 #define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL d_dup_lang_specific_decl
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1845 #define LANG_HOOKS_EH_PERSONALITY d_eh_personality
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1846 #define LANG_HOOKS_EH_RUNTIME_TYPE d_build_eh_runtime_type
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1847 #define LANG_HOOKS_PUSHDECL d_pushdecl
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1848 #define LANG_HOOKS_GETDECLS d_getdecls
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1849 #define LANG_HOOKS_GLOBAL_BINDINGS_P d_global_bindings_p
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1850 #define LANG_HOOKS_TYPE_FOR_MODE d_type_for_mode
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1851 #define LANG_HOOKS_TYPE_FOR_SIZE d_type_for_size
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1852 #define LANG_HOOKS_TYPE_PROMOTES_TO d_type_promotes_to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1853
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1854 struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1855
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1856 #include "gt-d-d-lang.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1857 #include "gtype-d.h"