Mercurial > hg > CbC > CbC_gcc
annotate gcc/langhooks.c @ 127:4c56639505ff
fix function.c and add CbC-example Makefile
author | mir3636 |
---|---|
date | Wed, 11 Apr 2018 18:46:58 +0900 |
parents | 04ced10e8804 |
children | 84e7813d76e9 |
rev | line source |
---|---|
0 | 1 /* Default language-specific hooks. |
111 | 2 Copyright (C) 2001-2017 Free Software Foundation, Inc. |
0 | 3 Contributed by Alexandre Oliva <aoliva@redhat.com> |
4 | |
5 This file is part of GCC. | |
6 | |
7 GCC is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU General Public License as published by | |
9 the Free Software Foundation; either version 3, or (at your option) | |
10 any later version. | |
11 | |
12 GCC is distributed in the hope that it will be useful, | |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
21 #include "config.h" | |
22 #include "system.h" | |
23 #include "coretypes.h" | |
111 | 24 #include "target.h" |
0 | 25 #include "rtl.h" |
111 | 26 #include "tree.h" |
27 #include "timevar.h" | |
28 #include "stringpool.h" | |
29 #include "diagnostic.h" | |
30 #include "intl.h" | |
31 #include "toplev.h" | |
32 #include "attribs.h" | |
33 #include "gimplify.h" | |
0 | 34 #include "langhooks.h" |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
35 #include "tree-diagnostic.h" |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
36 #include "output.h" |
111 | 37 #include "timevar.h" |
0 | 38 |
39 /* Do nothing; in many cases the default hook. */ | |
40 | |
41 void | |
42 lhd_do_nothing (void) | |
43 { | |
44 } | |
45 | |
46 /* Do nothing (tree). */ | |
47 | |
48 void | |
49 lhd_do_nothing_t (tree ARG_UNUSED (t)) | |
50 { | |
51 } | |
52 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
53 /* Pass through (tree). */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
54 tree |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
55 lhd_pass_through_t (tree t) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
56 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
57 return t; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
58 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
59 |
0 | 60 /* Do nothing (int, int, int). Return NULL_TREE. */ |
61 | |
62 tree | |
63 lhd_do_nothing_iii_return_null_tree (int ARG_UNUSED (i), | |
64 int ARG_UNUSED (j), | |
65 int ARG_UNUSED (k)) | |
66 { | |
67 return NULL_TREE; | |
68 } | |
69 | |
70 /* Do nothing (function). */ | |
71 | |
72 void | |
73 lhd_do_nothing_f (struct function * ARG_UNUSED (f)) | |
74 { | |
75 } | |
76 | |
77 /* Do nothing (return NULL_TREE). */ | |
78 | |
79 tree | |
80 lhd_return_null_tree (tree ARG_UNUSED (t)) | |
81 { | |
82 return NULL_TREE; | |
83 } | |
84 | |
85 /* Do nothing (return NULL_TREE). */ | |
86 | |
87 tree | |
88 lhd_return_null_const_tree (const_tree ARG_UNUSED (t)) | |
89 { | |
90 return NULL_TREE; | |
91 } | |
92 | |
93 /* The default post options hook. */ | |
94 | |
95 bool | |
96 lhd_post_options (const char ** ARG_UNUSED (pfilename)) | |
97 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
98 /* Excess precision other than "fast" requires front-end |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
99 support. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
100 flag_excess_precision_cmdline = EXCESS_PRECISION_FAST; |
0 | 101 return false; |
102 } | |
103 | |
104 /* Called from by print-tree.c. */ | |
105 | |
106 void | |
107 lhd_print_tree_nothing (FILE * ARG_UNUSED (file), | |
108 tree ARG_UNUSED (node), | |
109 int ARG_UNUSED (indent)) | |
110 { | |
111 } | |
112 | |
111 | 113 /* Called from check_global_declaration. */ |
0 | 114 |
115 bool | |
116 lhd_warn_unused_global_decl (const_tree decl) | |
117 { | |
111 | 118 /* This is what used to exist in check_global_declaration. Probably |
0 | 119 not many of these actually apply to non-C languages. */ |
120 | |
121 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) | |
122 return false; | |
111 | 123 if (VAR_P (decl) && TREE_READONLY (decl)) |
0 | 124 return false; |
125 if (DECL_IN_SYSTEM_HEADER (decl)) | |
126 return false; | |
127 | |
128 return true; | |
129 } | |
130 | |
131 /* Set the DECL_ASSEMBLER_NAME for DECL. */ | |
132 void | |
133 lhd_set_decl_assembler_name (tree decl) | |
134 { | |
135 tree id; | |
136 | |
111 | 137 /* set_decl_assembler_name may be called on TYPE_DECL to record ODR |
138 name for C++ types. By default types have no ODR names. */ | |
139 if (TREE_CODE (decl) == TYPE_DECL) | |
140 return; | |
141 | |
0 | 142 /* The language-independent code should never use the |
143 DECL_ASSEMBLER_NAME for lots of DECLs. Only FUNCTION_DECLs and | |
144 VAR_DECLs for variables with static storage duration need a real | |
145 DECL_ASSEMBLER_NAME. */ | |
146 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL | |
111 | 147 || (VAR_P (decl) |
0 | 148 && (TREE_STATIC (decl) |
149 || DECL_EXTERNAL (decl) | |
150 || TREE_PUBLIC (decl)))); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
151 |
0 | 152 /* By default, assume the name to use in assembly code is the same |
153 as that used in the source language. (That's correct for C, and | |
154 GCC used to set DECL_ASSEMBLER_NAME to the same value as | |
155 DECL_NAME in build_decl, so this choice provides backwards | |
156 compatibility with existing front-ends. This assumption is wrapped | |
157 in a target hook, to allow for target-specific modification of the | |
158 identifier. | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
159 |
0 | 160 Can't use just the variable's own name for a variable whose scope |
161 is less than the whole compilation. Concatenate a distinguishing | |
162 number - we use the DECL_UID. */ | |
163 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
164 if (TREE_PUBLIC (decl) || DECL_FILE_SCOPE_P (decl)) |
0 | 165 id = targetm.mangle_decl_assembler_name (decl, DECL_NAME (decl)); |
166 else | |
167 { | |
168 const char *name = IDENTIFIER_POINTER (DECL_NAME (decl)); | |
169 char *label; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
170 |
0 | 171 ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl)); |
172 id = get_identifier (label); | |
173 } | |
174 SET_DECL_ASSEMBLER_NAME (decl, id); | |
175 | |
176 } | |
177 | |
178 /* Type promotion for variable arguments. */ | |
179 tree | |
180 lhd_type_promotes_to (tree ARG_UNUSED (type)) | |
181 { | |
182 gcc_unreachable (); | |
183 } | |
184 | |
185 /* Registration of machine- or os-specific builtin types. */ | |
186 void | |
187 lhd_register_builtin_type (tree ARG_UNUSED (type), | |
188 const char * ARG_UNUSED (name)) | |
189 { | |
190 } | |
191 | |
192 /* Invalid use of an incomplete type. */ | |
193 void | |
111 | 194 lhd_incomplete_type_error (location_t ARG_UNUSED (loc), |
195 const_tree ARG_UNUSED (value), const_tree type) | |
0 | 196 { |
197 gcc_assert (TREE_CODE (type) == ERROR_MARK); | |
198 return; | |
199 } | |
200 | |
201 /* Provide a default routine for alias sets that always returns -1. This | |
202 is used by languages that don't need to do anything special. */ | |
203 | |
204 alias_set_type | |
205 lhd_get_alias_set (tree ARG_UNUSED (t)) | |
206 { | |
207 return -1; | |
208 } | |
209 | |
210 /* This is the default decl_printable_name function. */ | |
211 | |
212 const char * | |
213 lhd_decl_printable_name (tree decl, int ARG_UNUSED (verbosity)) | |
214 { | |
215 gcc_assert (decl && DECL_NAME (decl)); | |
216 return IDENTIFIER_POINTER (DECL_NAME (decl)); | |
217 } | |
218 | |
219 /* This is the default dwarf_name function. */ | |
220 | |
221 const char * | |
222 lhd_dwarf_name (tree t, int verbosity) | |
223 { | |
224 gcc_assert (DECL_P (t)); | |
225 | |
226 return lang_hooks.decl_printable_name (t, verbosity); | |
227 } | |
228 | |
229 /* This compares two types for equivalence ("compatible" in C-based languages). | |
230 This routine should only return 1 if it is sure. It should not be used | |
231 in contexts where erroneously returning 0 causes problems. */ | |
232 | |
233 int | |
234 lhd_types_compatible_p (tree x, tree y) | |
235 { | |
236 return TYPE_MAIN_VARIANT (x) == TYPE_MAIN_VARIANT (y); | |
237 } | |
238 | |
239 /* lang_hooks.tree_dump.dump_tree: Dump language-specific parts of tree | |
240 nodes. Returns nonzero if it does not want the usual dumping of the | |
241 second argument. */ | |
242 | |
243 bool | |
244 lhd_tree_dump_dump_tree (void *di ATTRIBUTE_UNUSED, tree t ATTRIBUTE_UNUSED) | |
245 { | |
246 return false; | |
247 } | |
248 | |
249 /* lang_hooks.tree_dump.type_qual: Determine type qualifiers in a | |
250 language-specific way. */ | |
251 | |
252 int | |
253 lhd_tree_dump_type_quals (const_tree t) | |
254 { | |
255 return TYPE_QUALS (t); | |
256 } | |
257 | |
258 /* lang_hooks.gimplify_expr re-writes *EXPR_P into GIMPLE form. */ | |
259 | |
260 int | |
261 lhd_gimplify_expr (tree *expr_p ATTRIBUTE_UNUSED, | |
262 gimple_seq *pre_p ATTRIBUTE_UNUSED, | |
263 gimple_seq *post_p ATTRIBUTE_UNUSED) | |
264 { | |
265 return GS_UNHANDLED; | |
266 } | |
267 | |
268 /* lang_hooks.tree_size: Determine the size of a tree with code C, | |
111 | 269 which is a language-specific tree code in category tcc_constant, |
270 tcc_exceptional or tcc_type. The default expects never to be called. */ | |
0 | 271 size_t |
272 lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED) | |
273 { | |
274 gcc_unreachable (); | |
275 } | |
276 | |
277 /* Return true if decl, which is a function decl, may be called by a | |
278 sibcall. */ | |
279 | |
280 bool | |
281 lhd_decl_ok_for_sibcall (const_tree decl ATTRIBUTE_UNUSED) | |
282 { | |
283 return true; | |
284 } | |
285 | |
111 | 286 /* Generic global declaration processing. This is meant to be called |
287 by the front-ends at the end of parsing. C/C++ do their own thing, | |
288 but other front-ends may call this. */ | |
289 | |
0 | 290 void |
111 | 291 global_decl_processing (void) |
0 | 292 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
293 tree globals, decl, *vec; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
294 int len, i; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
295 |
111 | 296 timevar_stop (TV_PHASE_PARSING); |
297 timevar_start (TV_PHASE_DEFERRED); | |
0 | 298 /* Really define vars that have had only a tentative definition. |
299 Really output inline functions that must actually be callable | |
300 and have not been output so far. */ | |
301 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
302 globals = lang_hooks.decls.getdecls (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
303 len = list_length (globals); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
304 vec = XNEWVEC (tree, len); |
0 | 305 |
306 /* Process the decls in reverse order--earliest first. | |
307 Put them into VEC from back to front, then take out from front. */ | |
308 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
309 for (i = 0, decl = globals; i < len; i++, decl = DECL_CHAIN (decl)) |
0 | 310 vec[len - i - 1] = decl; |
311 | |
312 wrapup_global_declarations (vec, len); | |
111 | 313 timevar_stop (TV_PHASE_DEFERRED); |
0 | 314 |
111 | 315 timevar_start (TV_PHASE_PARSING); |
0 | 316 free (vec); |
317 } | |
318 | |
319 /* Called to perform language-specific initialization of CTX. */ | |
320 void | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
321 lhd_initialize_diagnostics (diagnostic_context *ctx ATTRIBUTE_UNUSED) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
322 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
323 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
324 |
111 | 325 /* Called to register dumps. */ |
326 void | |
327 lhd_register_dumps (gcc::dump_manager *) | |
328 { | |
329 } | |
330 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
331 /* Called to perform language-specific options initialization. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
332 void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
333 lhd_init_options (unsigned int decoded_options_count ATTRIBUTE_UNUSED, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
334 struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED) |
0 | 335 { |
336 } | |
337 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
338 /* By default, always complain about options for the wrong language. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
339 bool |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
340 lhd_complain_wrong_lang_p (const struct cl_option *option ATTRIBUTE_UNUSED) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
341 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
342 return true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
343 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
344 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
345 /* By default, no language-specific options are valid. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
346 bool |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
347 lhd_handle_option (size_t code ATTRIBUTE_UNUSED, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
348 const char *arg ATTRIBUTE_UNUSED, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
349 int value ATTRIBUTE_UNUSED, int kind ATTRIBUTE_UNUSED, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
350 location_t loc ATTRIBUTE_UNUSED, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
351 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
352 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
353 return false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
354 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
355 |
0 | 356 /* The default function to print out name of current function that caused |
357 an error. */ | |
358 void | |
359 lhd_print_error_function (diagnostic_context *context, const char *file, | |
360 diagnostic_info *diagnostic) | |
361 { | |
362 if (diagnostic_last_function_changed (context, diagnostic)) | |
363 { | |
364 const char *old_prefix = context->printer->prefix; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
365 tree abstract_origin = diagnostic_abstract_origin (diagnostic); |
0 | 366 char *new_prefix = (file && abstract_origin == NULL) |
111 | 367 ? file_name_as_prefix (context, file) : NULL; |
0 | 368 |
369 pp_set_prefix (context->printer, new_prefix); | |
370 | |
371 if (current_function_decl == NULL) | |
372 pp_printf (context->printer, _("At top level:")); | |
373 else | |
374 { | |
375 tree fndecl, ao; | |
376 | |
377 if (abstract_origin) | |
378 { | |
379 ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin); | |
380 while (TREE_CODE (ao) == BLOCK | |
381 && BLOCK_ABSTRACT_ORIGIN (ao) | |
382 && BLOCK_ABSTRACT_ORIGIN (ao) != ao) | |
383 ao = BLOCK_ABSTRACT_ORIGIN (ao); | |
384 gcc_assert (TREE_CODE (ao) == FUNCTION_DECL); | |
385 fndecl = ao; | |
386 } | |
387 else | |
388 fndecl = current_function_decl; | |
389 | |
390 if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE) | |
391 pp_printf | |
392 (context->printer, _("In member function %qs"), | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
393 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2))); |
0 | 394 else |
395 pp_printf | |
396 (context->printer, _("In function %qs"), | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
397 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2))); |
0 | 398 |
399 while (abstract_origin) | |
400 { | |
401 location_t *locus; | |
402 tree block = abstract_origin; | |
403 | |
404 locus = &BLOCK_SOURCE_LOCATION (block); | |
405 fndecl = NULL; | |
406 block = BLOCK_SUPERCONTEXT (block); | |
407 while (block && TREE_CODE (block) == BLOCK | |
408 && BLOCK_ABSTRACT_ORIGIN (block)) | |
409 { | |
410 ao = BLOCK_ABSTRACT_ORIGIN (block); | |
411 | |
412 while (TREE_CODE (ao) == BLOCK | |
413 && BLOCK_ABSTRACT_ORIGIN (ao) | |
414 && BLOCK_ABSTRACT_ORIGIN (ao) != ao) | |
415 ao = BLOCK_ABSTRACT_ORIGIN (ao); | |
416 | |
417 if (TREE_CODE (ao) == FUNCTION_DECL) | |
418 { | |
419 fndecl = ao; | |
420 break; | |
421 } | |
422 else if (TREE_CODE (ao) != BLOCK) | |
423 break; | |
424 | |
425 block = BLOCK_SUPERCONTEXT (block); | |
426 } | |
427 if (fndecl) | |
428 abstract_origin = block; | |
429 else | |
430 { | |
431 while (block && TREE_CODE (block) == BLOCK) | |
432 block = BLOCK_SUPERCONTEXT (block); | |
433 | |
434 if (block && TREE_CODE (block) == FUNCTION_DECL) | |
435 fndecl = block; | |
436 abstract_origin = NULL; | |
437 } | |
438 if (fndecl) | |
439 { | |
440 expanded_location s = expand_location (*locus); | |
111 | 441 pp_comma (context->printer); |
0 | 442 pp_newline (context->printer); |
443 if (s.file != NULL) | |
444 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
445 if (context->show_column) |
0 | 446 pp_printf (context->printer, |
111 | 447 _(" inlined from %qs at %r%s:%d:%d%R"), |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
448 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)), |
111 | 449 "locus", s.file, s.line, s.column); |
0 | 450 else |
451 pp_printf (context->printer, | |
111 | 452 _(" inlined from %qs at %r%s:%d%R"), |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
453 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2)), |
111 | 454 "locus", s.file, s.line); |
0 | 455 |
456 } | |
457 else | |
458 pp_printf (context->printer, _(" inlined from %qs"), | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
459 identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2))); |
0 | 460 } |
461 } | |
111 | 462 pp_colon (context->printer); |
0 | 463 } |
464 | |
465 diagnostic_set_last_function (context, diagnostic); | |
111 | 466 pp_newline_and_flush (context->printer); |
0 | 467 context->printer->prefix = old_prefix; |
468 free ((char*) new_prefix); | |
469 } | |
470 } | |
471 | |
472 tree | |
473 lhd_make_node (enum tree_code code) | |
474 { | |
475 return make_node (code); | |
476 } | |
477 | |
111 | 478 /* Default implementation of LANG_HOOKS_TYPE_FOR_SIZE. |
479 Return an integer type with PRECISION bits of precision, | |
480 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */ | |
481 | |
482 tree | |
483 lhd_type_for_size (unsigned precision, int unsignedp) | |
484 { | |
485 int i; | |
486 | |
487 if (precision == TYPE_PRECISION (integer_type_node)) | |
488 return unsignedp ? unsigned_type_node : integer_type_node; | |
489 | |
490 if (precision == TYPE_PRECISION (signed_char_type_node)) | |
491 return unsignedp ? unsigned_char_type_node : signed_char_type_node; | |
492 | |
493 if (precision == TYPE_PRECISION (short_integer_type_node)) | |
494 return unsignedp ? short_unsigned_type_node : short_integer_type_node; | |
495 | |
496 if (precision == TYPE_PRECISION (long_integer_type_node)) | |
497 return unsignedp ? long_unsigned_type_node : long_integer_type_node; | |
498 | |
499 if (precision == TYPE_PRECISION (long_long_integer_type_node)) | |
500 return unsignedp | |
501 ? long_long_unsigned_type_node | |
502 : long_long_integer_type_node; | |
503 | |
504 for (i = 0; i < NUM_INT_N_ENTS; i ++) | |
505 if (int_n_enabled_p[i] | |
506 && precision == int_n_data[i].bitsize) | |
507 return (unsignedp ? int_n_trees[i].unsigned_type | |
508 : int_n_trees[i].signed_type); | |
509 | |
510 if (precision <= TYPE_PRECISION (intQI_type_node)) | |
511 return unsignedp ? unsigned_intQI_type_node : intQI_type_node; | |
512 | |
513 if (precision <= TYPE_PRECISION (intHI_type_node)) | |
514 return unsignedp ? unsigned_intHI_type_node : intHI_type_node; | |
515 | |
516 if (precision <= TYPE_PRECISION (intSI_type_node)) | |
517 return unsignedp ? unsigned_intSI_type_node : intSI_type_node; | |
518 | |
519 if (precision <= TYPE_PRECISION (intDI_type_node)) | |
520 return unsignedp ? unsigned_intDI_type_node : intDI_type_node; | |
521 | |
522 if (precision <= TYPE_PRECISION (intTI_type_node)) | |
523 return unsignedp ? unsigned_intTI_type_node : intTI_type_node; | |
524 | |
525 return NULL_TREE; | |
526 } | |
527 | |
0 | 528 HOST_WIDE_INT |
529 lhd_to_target_charset (HOST_WIDE_INT c) | |
530 { | |
531 return c; | |
532 } | |
533 | |
534 tree | |
535 lhd_expr_to_decl (tree expr, bool *tc ATTRIBUTE_UNUSED, bool *se ATTRIBUTE_UNUSED) | |
536 { | |
537 return expr; | |
538 } | |
539 | |
540 /* Return sharing kind if OpenMP sharing attribute of DECL is | |
541 predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise. */ | |
542 | |
543 enum omp_clause_default_kind | |
544 lhd_omp_predetermined_sharing (tree decl ATTRIBUTE_UNUSED) | |
545 { | |
546 if (DECL_ARTIFICIAL (decl)) | |
547 return OMP_CLAUSE_DEFAULT_SHARED; | |
548 return OMP_CLAUSE_DEFAULT_UNSPECIFIED; | |
549 } | |
550 | |
551 /* Generate code to copy SRC to DST. */ | |
552 | |
553 tree | |
554 lhd_omp_assignment (tree clause ATTRIBUTE_UNUSED, tree dst, tree src) | |
555 { | |
556 return build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src); | |
557 } | |
558 | |
111 | 559 /* Finalize clause C. */ |
560 | |
561 void | |
562 lhd_omp_finish_clause (tree, gimple_seq *) | |
563 { | |
564 } | |
565 | |
566 /* Return true if DECL is a scalar variable (for the purpose of | |
567 implicit firstprivatization). */ | |
568 | |
569 bool | |
570 lhd_omp_scalar_p (tree decl) | |
571 { | |
572 tree type = TREE_TYPE (decl); | |
573 if (TREE_CODE (type) == REFERENCE_TYPE) | |
574 type = TREE_TYPE (type); | |
575 if (TREE_CODE (type) == COMPLEX_TYPE) | |
576 type = TREE_TYPE (type); | |
577 if (INTEGRAL_TYPE_P (type) | |
578 || SCALAR_FLOAT_TYPE_P (type) | |
579 || TREE_CODE (type) == POINTER_TYPE) | |
580 return true; | |
581 return false; | |
582 } | |
583 | |
0 | 584 /* Register language specific type size variables as potentially OpenMP |
585 firstprivate variables. */ | |
586 | |
587 void | |
588 lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *c ATTRIBUTE_UNUSED, | |
589 tree t ATTRIBUTE_UNUSED) | |
590 { | |
591 } | |
592 | |
111 | 593 /* Return true if TYPE is an OpenMP mappable type. */ |
594 | |
595 bool | |
596 lhd_omp_mappable_type (tree type) | |
597 { | |
598 /* Mappable type has to be complete. */ | |
599 if (type == error_mark_node || !COMPLETE_TYPE_P (type)) | |
600 return false; | |
601 return true; | |
602 } | |
603 | |
0 | 604 /* Common function for add_builtin_function and |
605 add_builtin_function_ext_scope. */ | |
606 static tree | |
607 add_builtin_function_common (const char *name, | |
608 tree type, | |
609 int function_code, | |
610 enum built_in_class cl, | |
611 const char *library_name, | |
612 tree attrs, | |
613 tree (*hook) (tree)) | |
614 { | |
615 tree id = get_identifier (name); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
616 tree decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, id, type); |
0 | 617 |
618 TREE_PUBLIC (decl) = 1; | |
619 DECL_EXTERNAL (decl) = 1; | |
620 DECL_BUILT_IN_CLASS (decl) = cl; | |
621 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
622 DECL_FUNCTION_CODE (decl) = (enum built_in_function) function_code; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
623 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
624 /* DECL_FUNCTION_CODE is a bitfield; verify that the value fits. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
625 gcc_assert (DECL_FUNCTION_CODE (decl) == function_code); |
0 | 626 |
627 if (library_name) | |
628 { | |
629 tree libname = get_identifier (library_name); | |
111 | 630 |
631 libname = targetm.mangle_decl_assembler_name (decl, libname); | |
0 | 632 SET_DECL_ASSEMBLER_NAME (decl, libname); |
633 } | |
634 | |
635 /* Possibly apply some default attributes to this built-in function. */ | |
636 if (attrs) | |
637 decl_attributes (&decl, attrs, ATTR_FLAG_BUILT_IN); | |
638 else | |
639 decl_attributes (&decl, NULL_TREE, 0); | |
640 | |
641 return hook (decl); | |
642 | |
643 } | |
644 | |
645 /* Create a builtin function. */ | |
646 | |
647 tree | |
648 add_builtin_function (const char *name, | |
649 tree type, | |
650 int function_code, | |
651 enum built_in_class cl, | |
652 const char *library_name, | |
653 tree attrs) | |
654 { | |
655 return add_builtin_function_common (name, type, function_code, cl, | |
656 library_name, attrs, | |
657 lang_hooks.builtin_function); | |
658 } | |
659 | |
660 /* Like add_builtin_function, but make sure the scope is the external scope. | |
661 This is used to delay putting in back end builtin functions until the ISA | |
662 that defines the builtin is declared via function specific target options, | |
663 which can save memory for machines like the x86_64 that have multiple ISAs. | |
664 If this points to the same function as builtin_function, the backend must | |
665 add all of the builtins at program initialization time. */ | |
666 | |
667 tree | |
668 add_builtin_function_ext_scope (const char *name, | |
669 tree type, | |
670 int function_code, | |
671 enum built_in_class cl, | |
672 const char *library_name, | |
673 tree attrs) | |
674 { | |
675 return add_builtin_function_common (name, type, function_code, cl, | |
676 library_name, attrs, | |
677 lang_hooks.builtin_function_ext_scope); | |
678 } | |
679 | |
680 tree | |
681 lhd_builtin_function (tree decl) | |
682 { | |
683 lang_hooks.decls.pushdecl (decl); | |
684 return decl; | |
685 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
686 |
111 | 687 /* Create a builtin type. */ |
688 | |
689 tree | |
690 add_builtin_type (const char *name, tree type) | |
691 { | |
692 tree id = get_identifier (name); | |
693 tree decl = build_decl (BUILTINS_LOCATION, TYPE_DECL, id, type); | |
694 return lang_hooks.decls.pushdecl (decl); | |
695 } | |
696 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
697 /* LTO hooks. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
698 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
699 /* Used to save and restore any previously active section. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
700 static section *saved_section; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
701 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
702 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
703 /* Begin a new LTO output section named NAME. This default implementation |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
704 saves the old section and emits assembly code to switch to the new |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
705 section. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
706 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
707 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
708 lhd_begin_section (const char *name) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
709 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
710 section *section; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
711 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
712 /* Save the old section so we can restore it in lto_end_asm_section. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
713 gcc_assert (!saved_section); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
714 saved_section = in_section; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
715 if (!saved_section) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
716 saved_section = text_section; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
717 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
718 /* Create a new section and switch to it. */ |
111 | 719 section = get_section (name, SECTION_DEBUG | SECTION_EXCLUDE, NULL); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
720 switch_to_section (section); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
721 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
722 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
723 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
724 /* Write DATA of length LEN to the current LTO output section. This default |
111 | 725 implementation just calls assemble_string. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
726 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
727 void |
111 | 728 lhd_append_data (const void *data, size_t len, void *) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
729 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
730 if (data) |
111 | 731 { |
732 timevar_push (TV_IPA_LTO_OUTPUT); | |
733 assemble_string ((const char *)data, len); | |
734 timevar_pop (TV_IPA_LTO_OUTPUT); | |
735 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
736 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
737 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
738 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
739 /* Finish the current LTO output section. This default implementation emits |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
740 assembly code to switch to any section previously saved by |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
741 lhd_begin_section. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
742 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
743 void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
744 lhd_end_section (void) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
745 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
746 if (saved_section) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
747 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
748 switch_to_section (saved_section); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
749 saved_section = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
750 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
751 } |
111 | 752 |
753 /* Default implementation of enum_underlying_base_type using type_for_size. */ | |
754 | |
755 tree | |
756 lhd_enum_underlying_base_type (const_tree enum_type) | |
757 { | |
758 return lang_hooks.types.type_for_size (TYPE_PRECISION (enum_type), | |
759 TYPE_UNSIGNED (enum_type)); | |
760 } | |
761 | |
762 /* Default implementation of LANG_HOOKS_GET_SUBSTRING_LOCATION. */ | |
763 | |
764 const char * | |
765 lhd_get_substring_location (const substring_loc &, location_t *) | |
766 { | |
767 return "unimplemented"; | |
768 } | |
769 | |
770 /* Default implementation of LANG_HOOKS_DECL_DWARF_ATTRIBUTE. Don't add | |
771 any attributes. */ | |
772 | |
773 int | |
774 lhd_decl_dwarf_attribute (const_tree, int) | |
775 { | |
776 return -1; | |
777 } | |
778 | |
779 /* Default implementation of LANG_HOOKS_TYPE_DWARF_ATTRIBUTE. Don't add | |
780 any attributes. */ | |
781 | |
782 int | |
783 lhd_type_dwarf_attribute (const_tree, int) | |
784 { | |
785 return -1; | |
786 } | |
787 | |
788 /* Default implementation of LANG_HOOKS_UNIT_SIZE_WITHOUT_REUSABLE_PADDING. | |
789 Just return TYPE_SIZE_UNIT unadjusted. */ | |
790 | |
791 tree | |
792 lhd_unit_size_without_reusable_padding (tree t) | |
793 { | |
794 return TYPE_SIZE_UNIT (t); | |
795 } | |
796 | |
797 /* Returns true if the current lang_hooks represents the GNU C frontend. */ | |
798 | |
799 bool | |
800 lang_GNU_C (void) | |
801 { | |
802 return (strncmp (lang_hooks.name, "GNU C", 5) == 0 | |
803 && (lang_hooks.name[5] == '\0' || ISDIGIT (lang_hooks.name[5]))); | |
804 } | |
805 | |
806 /* Returns true if the current lang_hooks represents the GNU C++ frontend. */ | |
807 | |
808 bool | |
809 lang_GNU_CXX (void) | |
810 { | |
811 return strncmp (lang_hooks.name, "GNU C++", 7) == 0; | |
812 } | |
813 | |
814 /* Returns true if the current lang_hooks represents the GNU Fortran frontend. */ | |
815 | |
816 bool | |
817 lang_GNU_Fortran (void) | |
818 { | |
819 return strncmp (lang_hooks.name, "GNU Fortran", 11) == 0; | |
820 } | |
821 | |
822 /* Returns true if the current lang_hooks represents the GNU Objective-C | |
823 frontend. */ | |
824 | |
825 bool | |
826 lang_GNU_OBJC (void) | |
827 { | |
828 return strncmp (lang_hooks.name, "GNU Objective-C", 15) == 0; | |
829 } |