re PR tree-optimization/79408 (Missed VRP optimization of integer modulo)
[official-gcc.git] / libcc1 / libcp1plugin.cc
blob545f28b98617ebd84c666312e525b2d7b3afdfe6
1 /* Library interface to C++ front end.
2 Copyright (C) 2014-2017 Free Software Foundation, Inc.
4 This file is part of GCC. As it interacts with GDB through libcc1,
5 they all become a single program as regards the GNU GPL's requirements.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
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/>. */
21 #include <cc1plugin-config.h>
23 #undef PACKAGE_NAME
24 #undef PACKAGE_STRING
25 #undef PACKAGE_TARNAME
26 #undef PACKAGE_VERSION
28 #include "../gcc/config.h"
30 #undef PACKAGE_NAME
31 #undef PACKAGE_STRING
32 #undef PACKAGE_TARNAME
33 #undef PACKAGE_VERSION
35 #include "gcc-plugin.h"
36 #include "system.h"
37 #include "coretypes.h"
38 #include "stringpool.h"
40 #include "gcc-interface.h"
41 #include "hash-set.h"
42 #include "machmode.h"
43 #include "vec.h"
44 #include "double-int.h"
45 #include "input.h"
46 #include "alias.h"
47 #include "symtab.h"
48 #include "options.h"
49 #include "wide-int.h"
50 #include "inchash.h"
51 #include "tree.h"
52 #include "fold-const.h"
53 #include "stor-layout.h"
54 #include "cp-tree.h"
55 #include "toplev.h"
56 #include "timevar.h"
57 #include "hash-table.h"
58 #include "tm.h"
59 #include "c-family/c-pragma.h"
60 // #include "c-lang.h"
61 #include "diagnostic.h"
62 #include "langhooks.h"
63 #include "langhooks-def.h"
64 #include "decl.h"
65 #include "function.h"
66 #undef cfun // we want to assign to it, and function.h won't let us
68 #include "callbacks.hh"
69 #include "connection.hh"
70 #include "marshall-cp.hh"
71 #include "rpc.hh"
73 #ifdef __GNUC__
74 #pragma GCC visibility push(default)
75 #endif
76 int plugin_is_GPL_compatible;
77 #ifdef __GNUC__
78 #pragma GCC visibility pop
79 #endif
83 static int ATTRIBUTE_UNUSED
84 check_symbol_mask[GCC_CP_SYMBOL_MASK >= GCC_CP_SYMBOL_END ? 1 : -1];
86 // This is put into the lang hooks when the plugin starts.
88 static void
89 plugin_print_error_function (diagnostic_context *context, const char *file,
90 diagnostic_info *diagnostic)
92 if (current_function_decl != NULL_TREE
93 && DECL_NAME (current_function_decl) != NULL_TREE
94 && strcmp (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)),
95 GCC_FE_WRAPPER_FUNCTION) == 0)
96 return;
97 lhd_print_error_function (context, file, diagnostic);
102 static unsigned long long
103 convert_out (tree t)
105 return (unsigned long long) (uintptr_t) t;
108 static tree
109 convert_in (unsigned long long v)
111 return (tree) (uintptr_t) v;
116 struct decl_addr_value
118 tree decl;
119 tree address;
122 struct decl_addr_hasher : free_ptr_hash<decl_addr_value>
124 static inline hashval_t hash (const decl_addr_value *);
125 static inline bool equal (const decl_addr_value *, const decl_addr_value *);
128 inline hashval_t
129 decl_addr_hasher::hash (const decl_addr_value *e)
131 return DECL_UID (e->decl);
134 inline bool
135 decl_addr_hasher::equal (const decl_addr_value *p1, const decl_addr_value *p2)
137 return p1->decl == p2->decl;
142 struct string_hasher : nofree_ptr_hash<const char>
144 static inline hashval_t hash (const char *s)
146 return htab_hash_string (s);
149 static inline bool equal (const char *p1, const char *p2)
151 return strcmp (p1, p2) == 0;
157 struct plugin_context : public cc1_plugin::connection
159 plugin_context (int fd);
161 // Map decls to addresses.
162 hash_table<decl_addr_hasher> address_map;
164 // A collection of trees that are preserved for the GC.
165 hash_table< nofree_ptr_hash<tree_node> > preserved;
167 // File name cache.
168 hash_table<string_hasher> file_names;
170 // Perform GC marking.
171 void mark ();
173 // Preserve a tree during the plugin's operation.
174 tree preserve (tree t)
176 tree_node **slot = preserved.find_slot (t, INSERT);
177 *slot = t;
178 return t;
181 source_location get_source_location (const char *filename,
182 unsigned int line_number)
184 if (filename == NULL)
185 return UNKNOWN_LOCATION;
187 filename = intern_filename (filename);
188 linemap_add (line_table, LC_ENTER, false, filename, line_number);
189 source_location loc = linemap_line_start (line_table, line_number, 0);
190 linemap_add (line_table, LC_LEAVE, false, NULL, 0);
191 return loc;
194 private:
196 // Add a file name to FILE_NAMES and return the canonical copy.
197 const char *intern_filename (const char *filename)
199 const char **slot = file_names.find_slot (filename, INSERT);
200 if (*slot == NULL)
202 /* The file name must live as long as the line map, which
203 effectively means as long as this compilation. So, we copy
204 the string here but never free it. */
205 *slot = xstrdup (filename);
207 return *slot;
211 static plugin_context *current_context;
215 plugin_context::plugin_context (int fd)
216 : cc1_plugin::connection (fd),
217 address_map (30),
218 preserved (30),
219 file_names (30)
223 void
224 plugin_context::mark ()
226 for (hash_table<decl_addr_hasher>::iterator it = address_map.begin ();
227 it != address_map.end ();
228 ++it)
230 ggc_mark ((*it)->decl);
231 ggc_mark ((*it)->address);
234 for (hash_table< nofree_ptr_hash<tree_node> >::iterator
235 it = preserved.begin (); it != preserved.end (); ++it)
236 ggc_mark (&*it);
239 static void
240 plugin_binding_oracle (enum cp_oracle_request kind, tree identifier)
242 enum gcc_cp_oracle_request request;
244 gcc_assert (current_context != NULL);
246 switch (kind)
248 case CP_ORACLE_IDENTIFIER:
249 request = GCC_CP_ORACLE_IDENTIFIER;
250 break;
251 default:
252 abort ();
255 int ignore;
256 cc1_plugin::call (current_context, "binding_oracle", &ignore,
257 request, IDENTIFIER_POINTER (identifier));
260 static int push_count;
262 /* at_function_scope_p () tests cfun, indicating we're actually
263 compiling the function, but we don't even set it when pretending to
264 enter a function scope. We use this distinction to tell these two
265 cases apart: we don't want to define e.g. class names in the user
266 expression function's scope, when they're local to the original
267 function, because they'd get the wrong linkage name. */
269 static bool
270 at_fake_function_scope_p ()
272 return (!cfun || cfun->decl != current_function_decl)
273 && current_scope () == current_function_decl;
276 static void
277 push_fake_function (tree fndecl, scope_kind kind = sk_function_parms)
279 current_function_decl = fndecl;
280 begin_scope (kind, fndecl);
281 ++function_depth;
282 begin_scope (sk_block, NULL);
285 static void
286 pop_scope ()
288 if (toplevel_bindings_p () && current_namespace == global_namespace)
289 pop_from_top_level ();
290 else if (at_namespace_scope_p ())
291 pop_namespace ();
292 else if (at_class_scope_p ())
293 popclass ();
294 else
296 gcc_assert (at_fake_function_scope_p ());
297 gcc_assert (!at_function_scope_p ());
298 gcc_assert (current_binding_level->kind == sk_block
299 && current_binding_level->this_entity == NULL);
300 leave_scope ();
301 --function_depth;
302 gcc_assert (current_binding_level->this_entity
303 == current_function_decl);
304 leave_scope ();
305 current_function_decl = NULL;
306 for (cp_binding_level *scope = current_binding_level;
307 scope; scope = scope->level_chain)
308 if (scope->kind == sk_function_parms)
310 current_function_decl = scope->this_entity;
311 break;
316 static void
317 supplement_binding (cxx_binding *binding, tree decl)
319 /* FIXME: this is pretty much a copy of supplement_binding_1 in
320 ../gcc/cp/name-lookup.c; the few replaced/removed bits are marked
321 with "// _1:". */
322 tree bval = binding->value;
323 bool ok = true;
324 tree target_bval = strip_using_decl (bval);
325 tree target_decl = strip_using_decl (decl);
327 if (TREE_CODE (target_decl) == TYPE_DECL && DECL_ARTIFICIAL (target_decl)
328 && target_decl != target_bval
329 && (TREE_CODE (target_bval) != TYPE_DECL
330 /* We allow pushing an enum multiple times in a class
331 template in order to handle late matching of underlying
332 type on an opaque-enum-declaration followed by an
333 enum-specifier. */
334 || (processing_template_decl
335 && TREE_CODE (TREE_TYPE (target_decl)) == ENUMERAL_TYPE
336 && TREE_CODE (TREE_TYPE (target_bval)) == ENUMERAL_TYPE
337 && (dependent_type_p (ENUM_UNDERLYING_TYPE
338 (TREE_TYPE (target_decl)))
339 || dependent_type_p (ENUM_UNDERLYING_TYPE
340 (TREE_TYPE (target_bval)))))))
341 /* The new name is the type name. */
342 binding->type = decl;
343 else if (/* TARGET_BVAL is null when push_class_level_binding moves
344 an inherited type-binding out of the way to make room
345 for a new value binding. */
346 !target_bval
347 /* TARGET_BVAL is error_mark_node when TARGET_DECL's name
348 has been used in a non-class scope prior declaration.
349 In that case, we should have already issued a
350 diagnostic; for graceful error recovery purpose, pretend
351 this was the intended declaration for that name. */
352 || target_bval == error_mark_node
353 /* If TARGET_BVAL is anticipated but has not yet been
354 declared, pretend it is not there at all. */
355 || (TREE_CODE (target_bval) == FUNCTION_DECL
356 && DECL_ANTICIPATED (target_bval)
357 && !DECL_HIDDEN_FRIEND_P (target_bval)))
358 binding->value = decl;
359 else if (TREE_CODE (target_bval) == TYPE_DECL
360 && DECL_ARTIFICIAL (target_bval)
361 && target_decl != target_bval
362 && (TREE_CODE (target_decl) != TYPE_DECL
363 || same_type_p (TREE_TYPE (target_decl),
364 TREE_TYPE (target_bval))))
366 /* The old binding was a type name. It was placed in
367 VALUE field because it was thought, at the point it was
368 declared, to be the only entity with such a name. Move the
369 type name into the type slot; it is now hidden by the new
370 binding. */
371 binding->type = bval;
372 binding->value = decl;
373 binding->value_is_inherited = false;
375 else if (TREE_CODE (target_bval) == TYPE_DECL
376 && TREE_CODE (target_decl) == TYPE_DECL
377 && DECL_NAME (target_decl) == DECL_NAME (target_bval)
378 && binding->scope->kind != sk_class
379 && (same_type_p (TREE_TYPE (target_decl), TREE_TYPE (target_bval))
380 /* If either type involves template parameters, we must
381 wait until instantiation. */
382 || uses_template_parms (TREE_TYPE (target_decl))
383 || uses_template_parms (TREE_TYPE (target_bval))))
384 /* We have two typedef-names, both naming the same type to have
385 the same name. In general, this is OK because of:
387 [dcl.typedef]
389 In a given scope, a typedef specifier can be used to redefine
390 the name of any type declared in that scope to refer to the
391 type to which it already refers.
393 However, in class scopes, this rule does not apply due to the
394 stricter language in [class.mem] prohibiting redeclarations of
395 members. */
396 ok = false;
397 /* There can be two block-scope declarations of the same variable,
398 so long as they are `extern' declarations. However, there cannot
399 be two declarations of the same static data member:
401 [class.mem]
403 A member shall not be declared twice in the
404 member-specification. */
405 else if (VAR_P (target_decl)
406 && VAR_P (target_bval)
407 && DECL_EXTERNAL (target_decl) && DECL_EXTERNAL (target_bval)
408 && !DECL_CLASS_SCOPE_P (target_decl))
410 duplicate_decls (decl, binding->value, /*newdecl_is_friend=*/false);
411 ok = false;
413 else if (TREE_CODE (decl) == NAMESPACE_DECL
414 && TREE_CODE (bval) == NAMESPACE_DECL
415 && DECL_NAMESPACE_ALIAS (decl)
416 && DECL_NAMESPACE_ALIAS (bval)
417 && ORIGINAL_NAMESPACE (bval) == ORIGINAL_NAMESPACE (decl))
418 /* [namespace.alias]
420 In a declarative region, a namespace-alias-definition can be
421 used to redefine a namespace-alias declared in that declarative
422 region to refer only to the namespace to which it already
423 refers. */
424 ok = false;
425 else if (maybe_remove_implicit_alias (bval))
427 /* There was a mangling compatibility alias using this mangled name,
428 but now we have a real decl that wants to use it instead. */
429 binding->value = decl;
431 else
433 // _1: diagnose_name_conflict (decl, bval);
434 ok = false;
437 gcc_assert (ok); // _1: return ok;
440 static void
441 reactivate_decl (tree decl, cp_binding_level *b)
443 bool in_function_p = TREE_CODE (b->this_entity) == FUNCTION_DECL;
444 gcc_assert (in_function_p
445 || (b == current_binding_level
446 && !at_class_scope_p ()));
448 tree id = DECL_NAME (decl);
449 tree type = NULL_TREE;
450 if (TREE_CODE (decl) == TYPE_DECL)
451 type = TREE_TYPE (decl);
453 if (type && TYPE_NAME (type) == decl
454 && (RECORD_OR_UNION_CODE_P (TREE_CODE (type))
455 || TREE_CODE (type) == ENUMERAL_TYPE))
457 gcc_assert (in_function_p && DECL_CONTEXT (decl) == b->this_entity);
458 type = TREE_TYPE (decl);
460 else
462 gcc_assert (DECL_CONTEXT (decl) == b->this_entity
463 || DECL_CONTEXT (decl) == global_namespace
464 || TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL);
465 type = NULL_TREE;
468 /* Adjust IDENTIFIER_BINDING to what it would have been if we were
469 at binding level B. Save the binding chain up to that point in
470 [binding, *chainp), and take note of the outermost bindings found
471 before B. */
472 cxx_binding *binding = IDENTIFIER_BINDING (id), **chainp = NULL;
473 tree *shadowing_type_p = NULL;
474 if (binding)
476 cp_binding_level *bc = current_binding_level;
477 for (cxx_binding *prev_binding = binding;
478 prev_binding; prev_binding = prev_binding->previous)
480 while (bc != b && bc != prev_binding->scope)
481 bc = bc->level_chain;
482 if (bc == b)
484 if (!chainp)
485 binding = NULL;
486 break;
488 chainp = &prev_binding->previous;
489 if (type)
490 for (tree tshadow = prev_binding->scope->type_shadowed;
491 tshadow; tshadow = TREE_CHAIN (tshadow))
492 if (TREE_PURPOSE (tshadow) == id)
494 shadowing_type_p = &TREE_VALUE (tshadow);
495 break;
499 if (chainp)
501 IDENTIFIER_BINDING (id) = *chainp;
502 *chainp = NULL;
505 /* Like push_local_binding, supplement or add a binding to the
506 desired level. */
507 if (IDENTIFIER_BINDING (id) && IDENTIFIER_BINDING (id)->scope == b)
508 supplement_binding (IDENTIFIER_BINDING (id), decl);
509 else
510 push_binding (id, decl, b);
512 /* Now restore the binding chain we'd temporarily removed. */
513 if (chainp)
515 *chainp = IDENTIFIER_BINDING (id);
516 IDENTIFIER_BINDING (id) = binding;
518 if (type)
520 /* Insert the new type binding in the shadowing_type_p
521 TREE_VALUE chain. */
522 tree shadowed_type = NULL_TREE;
523 if (shadowing_type_p)
525 shadowed_type = *shadowing_type_p;
526 *shadowing_type_p = type;
529 b->type_shadowed = tree_cons (id, shadowed_type, b->type_shadowed);
530 TREE_TYPE (b->type_shadowed) = type;
533 else if (type)
535 /* Our new binding is the active one, so shadow the earlier
536 binding. */
537 b->type_shadowed = tree_cons (id, REAL_IDENTIFIER_TYPE_VALUE (id),
538 b->type_shadowed);
539 TREE_TYPE (b->type_shadowed) = type;
540 SET_IDENTIFIER_TYPE_VALUE (id, type);
543 /* Record that we have a binding for ID, like add_decl_to_level. */
544 tree node = build_tree_list (NULL_TREE, decl);
545 TREE_CHAIN (node) = b->names;
546 b->names = node;
549 static void
550 plugin_pragma_push_user_expression (cpp_reader *)
552 if (push_count++)
553 return;
555 gcc_assert (!current_class_ptr);
556 gcc_assert (!current_class_ref);
558 gcc_assert (!cp_binding_oracle);
559 cp_binding_oracle = plugin_binding_oracle;
561 /* Make the function containing the user expression a global
562 friend, so as to bypass access controls in it. */
563 if (at_function_scope_p ())
564 set_global_friend (current_function_decl);
566 gcc_assert (at_function_scope_p ());
567 function *save_cfun = cfun;
568 cp_binding_level *orig_binding_level = current_binding_level;
570 int success;
571 cc1_plugin::call (current_context, "enter_scope", &success);
573 gcc_assert (at_fake_function_scope_p () || at_function_scope_p ());
575 function *unchanged_cfun = cfun;
576 tree changed_func_decl = current_function_decl;
578 gcc_assert (current_class_type == DECL_CONTEXT (current_function_decl)
579 || !(RECORD_OR_UNION_CODE_P
580 (TREE_CODE (DECL_CONTEXT (current_function_decl)))));
581 push_fake_function (save_cfun->decl, sk_block);
582 current_class_type = NULL_TREE;
583 if (unchanged_cfun)
585 /* If we get here, GDB did NOT change the context. */
586 gcc_assert (cfun == save_cfun);
587 gcc_assert (at_function_scope_p ());
588 gcc_assert (orig_binding_level
589 == current_binding_level->level_chain->level_chain);
591 else
593 cfun = save_cfun;
594 gcc_assert (at_function_scope_p ());
596 cp_binding_level *b = current_binding_level->level_chain;
597 gcc_assert (b->this_entity == cfun->decl);
599 /* Reactivate local names from the previous context. Use
600 IDENTIFIER_MARKED to avoid reactivating shadowed names. */
601 for (cp_binding_level *level = orig_binding_level;;)
603 for (tree name = level->names;
604 name; name = TREE_CHAIN (name))
606 tree decl = name;
607 if (TREE_CODE (decl) == TREE_LIST)
608 decl = TREE_VALUE (decl);
609 if (IDENTIFIER_MARKED (DECL_NAME (decl)))
610 continue;
611 IDENTIFIER_MARKED (DECL_NAME (decl)) = 1;
612 reactivate_decl (decl, b);
614 if (level->kind == sk_function_parms
615 && level->this_entity == cfun->decl)
616 break;
617 gcc_assert (!level->this_entity);
618 level = level->level_chain;
621 /* Now, clear the markers. */
622 for (tree name = b->names; name; name = TREE_CHAIN (name))
624 tree decl = name;
625 if (TREE_CODE (decl) == TREE_LIST)
626 decl = TREE_VALUE (decl);
627 gcc_assert (IDENTIFIER_MARKED (DECL_NAME (decl)));
628 IDENTIFIER_MARKED (DECL_NAME (decl)) = 0;
632 if (unchanged_cfun || DECL_NONSTATIC_MEMBER_FUNCTION_P (changed_func_decl))
634 /* Check whether the oracle supplies us with a "this", and if
635 so, arrange for data members and this itself to be
636 usable. */
637 tree this_val = lookup_name (get_identifier ("this"));
638 current_class_ref = !this_val ? NULL_TREE
639 : cp_build_indirect_ref (this_val, RO_NULL, tf_warning_or_error);
640 current_class_ptr = this_val;
644 static void
645 plugin_pragma_pop_user_expression (cpp_reader *)
647 if (--push_count)
648 return;
650 gcc_assert (cp_binding_oracle);
652 gcc_assert (at_function_scope_p ());
653 function *save_cfun = cfun;
654 current_class_ptr = NULL_TREE;
655 current_class_ref = NULL_TREE;
657 cfun = NULL;
658 pop_scope ();
659 if (RECORD_OR_UNION_CODE_P (TREE_CODE (DECL_CONTEXT (current_function_decl))))
660 current_class_type = DECL_CONTEXT (current_function_decl);
662 int success;
663 cc1_plugin::call (current_context, "leave_scope", &success);
665 if (!cfun)
666 cfun = save_cfun;
667 else
668 gcc_assert (cfun == save_cfun);
670 cp_binding_oracle = NULL;
671 gcc_assert (at_function_scope_p ());
674 static void
675 plugin_init_extra_pragmas (void *, void *)
677 c_register_pragma ("GCC", "push_user_expression", plugin_pragma_push_user_expression);
678 c_register_pragma ("GCC", "pop_user_expression", plugin_pragma_pop_user_expression);
679 /* FIXME: this one should go once we get GDB to use push and pop. */
680 c_register_pragma ("GCC", "user_expression", plugin_pragma_push_user_expression);
685 static decl_addr_value
686 build_decl_addr_value (tree decl, gcc_address address)
688 decl_addr_value value = {
689 decl,
690 build_int_cst_type (ptr_type_node, address)
692 return value;
695 static decl_addr_value *
696 record_decl_address (plugin_context *ctx, decl_addr_value value)
698 decl_addr_value **slot = ctx->address_map.find_slot (&value, INSERT);
699 gcc_assert (*slot == NULL);
700 *slot
701 = static_cast<decl_addr_value *> (xmalloc (sizeof (decl_addr_value)));
702 **slot = value;
703 /* We don't want GCC to warn about e.g. static functions
704 without a code definition. */
705 TREE_NO_WARNING (value.decl) = 1;
706 return *slot;
709 // Maybe rewrite a decl to its address.
710 static tree
711 address_rewriter (tree *in, int *walk_subtrees, void *arg)
713 plugin_context *ctx = (plugin_context *) arg;
715 if (!DECL_P (*in)
716 || TREE_CODE (*in) == NAMESPACE_DECL
717 || DECL_NAME (*in) == NULL_TREE)
718 return NULL_TREE;
720 decl_addr_value value;
721 value.decl = *in;
722 decl_addr_value *found_value = ctx->address_map.find (&value);
723 if (found_value != NULL)
725 else if (HAS_DECL_ASSEMBLER_NAME_P (*in))
727 gcc_address address;
729 if (!cc1_plugin::call (ctx, "address_oracle", &address,
730 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (*in))))
731 return NULL_TREE;
732 if (address == 0)
733 return NULL_TREE;
735 // Insert the decl into the address map in case it is referenced
736 // again.
737 value = build_decl_addr_value (value.decl, address);
738 found_value = record_decl_address (ctx, value);
740 else
741 return NULL_TREE;
743 if (found_value->address != error_mark_node)
745 // We have an address for the decl, so rewrite the tree.
746 tree ptr_type = build_pointer_type (TREE_TYPE (*in));
747 *in = fold_build1 (INDIRECT_REF, TREE_TYPE (*in),
748 fold_build1 (CONVERT_EXPR, ptr_type,
749 found_value->address));
752 *walk_subtrees = 0;
754 return NULL_TREE;
757 // When generating code for gdb, we want to be able to use absolute
758 // addresses to refer to otherwise external objects that gdb knows
759 // about. gdb passes in these addresses when building decls, and then
760 // before gimplification we go through the trees, rewriting uses to
761 // the equivalent of "*(TYPE *) ADDR".
762 static void
763 rewrite_decls_to_addresses (void *function_in, void *)
765 tree function = (tree) function_in;
767 // Do nothing if we're not in gdb.
768 if (current_context == NULL)
769 return;
771 walk_tree (&DECL_SAVED_TREE (function), address_rewriter, current_context,
772 NULL);
777 static inline tree
778 safe_push_template_decl (tree decl)
780 void (*save_oracle) (enum cp_oracle_request, tree identifier);
782 save_oracle = cp_binding_oracle;
783 cp_binding_oracle = NULL;
785 tree ret = push_template_decl (decl);
787 cp_binding_oracle = save_oracle;
789 return ret;
792 static inline tree
793 safe_pushtag (tree name, tree type, tag_scope scope)
795 void (*save_oracle) (enum cp_oracle_request, tree identifier);
797 save_oracle = cp_binding_oracle;
798 cp_binding_oracle = NULL;
800 tree ret = pushtag (name, type, scope);
802 cp_binding_oracle = save_oracle;
804 return ret;
807 static inline tree
808 safe_pushdecl_maybe_friend (tree decl, bool is_friend)
810 void (*save_oracle) (enum cp_oracle_request, tree identifier);
812 save_oracle = cp_binding_oracle;
813 cp_binding_oracle = NULL;
815 tree ret = pushdecl_maybe_friend (decl, is_friend);
817 cp_binding_oracle = save_oracle;
819 return ret;
825 plugin_push_namespace (cc1_plugin::connection *,
826 const char *name)
828 if (name && !*name)
829 push_to_top_level ();
830 else
831 push_namespace (name ? get_identifier (name) : NULL);
833 return 1;
837 plugin_push_class (cc1_plugin::connection *,
838 gcc_type type_in)
840 tree type = convert_in (type_in);
841 gcc_assert (RECORD_OR_UNION_CODE_P (TREE_CODE (type)));
842 gcc_assert (TYPE_CONTEXT (type) == FROB_CONTEXT (current_scope ()));
844 pushclass (type);
846 return 1;
850 plugin_push_function (cc1_plugin::connection *,
851 gcc_decl function_decl_in)
853 tree fndecl = convert_in (function_decl_in);
854 gcc_assert (TREE_CODE (fndecl) == FUNCTION_DECL);
855 gcc_assert (DECL_CONTEXT (fndecl) == FROB_CONTEXT (current_scope ()));
857 push_fake_function (fndecl);
859 return 1;
863 plugin_pop_binding_level (cc1_plugin::connection *)
865 pop_scope ();
866 return 1;
870 plugin_reactivate_decl (cc1_plugin::connection *,
871 gcc_decl decl_in,
872 gcc_decl scope_in)
874 tree decl = convert_in (decl_in);
875 tree scope = convert_in (scope_in);
876 gcc_assert (TREE_CODE (decl) == VAR_DECL
877 || TREE_CODE (decl) == FUNCTION_DECL
878 || TREE_CODE (decl) == TYPE_DECL);
879 cp_binding_level *b;
880 if (scope)
882 gcc_assert (TREE_CODE (scope) == FUNCTION_DECL);
883 for (b = current_binding_level;
884 b->this_entity != scope;
885 b = b->level_chain)
886 gcc_assert (b->this_entity != global_namespace);
888 else
890 gcc_assert (!at_class_scope_p ());
891 b = current_binding_level;
894 reactivate_decl (decl, b);
895 return 1;
898 static tree
899 get_current_scope ()
901 tree decl;
903 if (at_namespace_scope_p ())
904 decl = current_namespace;
905 else if (at_class_scope_p ())
906 decl = TYPE_NAME (current_class_type);
907 else if (at_fake_function_scope_p () || at_function_scope_p ())
908 decl = current_function_decl;
909 else
910 gcc_unreachable ();
912 return decl;
915 gcc_decl
916 plugin_get_current_binding_level_decl (cc1_plugin::connection *)
918 tree decl = get_current_scope ();
920 return convert_out (decl);
924 plugin_make_namespace_inline (cc1_plugin::connection *)
926 tree inline_ns = current_namespace;
928 gcc_assert (toplevel_bindings_p ());
929 gcc_assert (inline_ns != global_namespace);
931 tree parent_ns = CP_DECL_CONTEXT (inline_ns);
933 if (purpose_member (DECL_NAMESPACE_ASSOCIATIONS (inline_ns),
934 parent_ns))
935 return 0;
937 pop_namespace ();
939 gcc_assert (current_namespace == parent_ns);
941 DECL_NAMESPACE_ASSOCIATIONS (inline_ns)
942 = tree_cons (parent_ns, 0,
943 DECL_NAMESPACE_ASSOCIATIONS (inline_ns));
944 do_using_directive (inline_ns);
946 push_namespace (DECL_NAME (inline_ns));
948 return 1;
952 plugin_add_using_namespace (cc1_plugin::connection *,
953 gcc_decl used_ns_in)
955 tree used_ns = convert_in (used_ns_in);
957 gcc_assert (TREE_CODE (used_ns) == NAMESPACE_DECL);
959 do_using_directive (used_ns);
961 return 1;
965 plugin_add_namespace_alias (cc1_plugin::connection *,
966 const char *id,
967 gcc_decl target_in)
969 tree name = get_identifier (id);
970 tree target = convert_in (target_in);
972 do_namespace_alias (name, target);
974 return 1;
977 static inline void
978 set_access_flags (tree decl, enum gcc_cp_symbol_kind flags)
980 gcc_assert (!(flags & GCC_CP_ACCESS_MASK) == !DECL_CLASS_SCOPE_P (decl));
982 switch (flags & GCC_CP_ACCESS_MASK)
984 case GCC_CP_ACCESS_PRIVATE:
985 TREE_PRIVATE (decl) = true;
986 current_access_specifier = access_private_node;
987 break;
989 case GCC_CP_ACCESS_PROTECTED:
990 TREE_PROTECTED (decl) = true;
991 current_access_specifier = access_protected_node;
992 break;
994 case GCC_CP_ACCESS_PUBLIC:
995 current_access_specifier = access_public_node;
996 break;
998 default:
999 break;
1004 plugin_add_using_decl (cc1_plugin::connection *,
1005 enum gcc_cp_symbol_kind flags,
1006 gcc_decl target_in)
1008 tree target = convert_in (target_in);
1009 gcc_assert ((flags & GCC_CP_SYMBOL_MASK) == GCC_CP_SYMBOL_USING);
1010 gcc_assert (!(flags & GCC_CP_FLAG_MASK));
1011 enum gcc_cp_symbol_kind acc_flags;
1012 acc_flags = (enum gcc_cp_symbol_kind) (flags & GCC_CP_ACCESS_MASK);
1014 gcc_assert (!template_parm_scope_p ());
1016 bool class_member_p = at_class_scope_p ();
1017 gcc_assert (!(acc_flags & GCC_CP_ACCESS_MASK) == !class_member_p);
1019 tree identifier = DECL_NAME (target);
1020 tree tcontext = DECL_CONTEXT (target);
1022 if (UNSCOPED_ENUM_P (tcontext))
1023 tcontext = CP_TYPE_CONTEXT (tcontext);
1025 if (class_member_p)
1027 tree decl = do_class_using_decl (tcontext, identifier);
1029 set_access_flags (decl, flags);
1031 finish_member_declaration (decl);
1033 else if (!at_namespace_scope_p ())
1035 gcc_unreachable ();
1036 do_local_using_decl (target, tcontext, identifier);
1038 else
1039 do_toplevel_using_decl (target, tcontext, identifier);
1041 return 1;
1044 static tree
1045 build_named_class_type (enum tree_code code,
1046 tree id,
1047 source_location loc)
1049 /* See at_fake_function_scope_p. */
1050 gcc_assert (!at_function_scope_p ());
1051 tree type = make_class_type (code);
1052 tree type_decl = build_decl (loc, TYPE_DECL, id, type);
1053 TYPE_NAME (type) = type_decl;
1054 TYPE_STUB_DECL (type) = type_decl;
1055 DECL_CONTEXT (type_decl) = TYPE_CONTEXT (type);
1057 return type_decl;
1060 /* Abuse an unused field of the dummy template parms entry to hold the
1061 parm list. */
1062 #define TP_PARM_LIST TREE_TYPE (current_template_parms)
1064 gcc_decl
1065 plugin_build_decl (cc1_plugin::connection *self,
1066 const char *name,
1067 enum gcc_cp_symbol_kind sym_kind,
1068 gcc_type sym_type_in,
1069 const char *substitution_name,
1070 gcc_address address,
1071 const char *filename,
1072 unsigned int line_number)
1074 plugin_context *ctx = static_cast<plugin_context *> (self);
1075 gcc_assert (!name || !strchr (name, ':')); // FIXME: this can go eventually.
1077 enum tree_code code;
1078 tree decl;
1079 tree sym_type = convert_in (sym_type_in);
1080 enum gcc_cp_symbol_kind sym_flags;
1081 sym_flags = (enum gcc_cp_symbol_kind) (sym_kind & GCC_CP_FLAG_MASK);
1082 enum gcc_cp_symbol_kind acc_flags;
1083 acc_flags = (enum gcc_cp_symbol_kind) (sym_kind & GCC_CP_ACCESS_MASK);
1084 sym_kind = (enum gcc_cp_symbol_kind) (sym_kind & GCC_CP_SYMBOL_MASK);
1086 switch (sym_kind)
1088 case GCC_CP_SYMBOL_FUNCTION:
1089 code = FUNCTION_DECL;
1090 gcc_assert (!(sym_flags & ~GCC_CP_FLAG_MASK_FUNCTION));
1091 break;
1093 case GCC_CP_SYMBOL_VARIABLE:
1094 code = VAR_DECL;
1095 gcc_assert (!(sym_flags & ~GCC_CP_FLAG_MASK_VARIABLE));
1096 break;
1098 case GCC_CP_SYMBOL_TYPEDEF:
1099 code = TYPE_DECL;
1100 gcc_assert (!sym_flags);
1101 break;
1103 case GCC_CP_SYMBOL_CLASS:
1104 code = RECORD_TYPE;
1105 gcc_assert (!(sym_flags & ~GCC_CP_FLAG_MASK_CLASS));
1106 gcc_assert (!sym_type);
1107 break;
1109 case GCC_CP_SYMBOL_UNION:
1110 code = UNION_TYPE;
1111 gcc_assert (!sym_flags);
1112 gcc_assert (!sym_type);
1113 break;
1115 default:
1116 gcc_unreachable ();
1119 bool template_decl_p = template_parm_scope_p ();
1121 if (template_decl_p)
1123 gcc_assert (code == FUNCTION_DECL || code == RECORD_TYPE
1124 || code == TYPE_DECL);
1126 /* Finish the template parm list that started this template parm. */
1127 end_template_parm_list (TP_PARM_LIST);
1129 gcc_assert (!address);
1130 gcc_assert (!substitution_name);
1133 source_location loc = ctx->get_source_location (filename, line_number);
1134 bool class_member_p = at_class_scope_p ();
1135 bool ctor = false, dtor = false, assop = false;
1136 tree_code opcode = ERROR_MARK;
1138 gcc_assert (!(acc_flags & GCC_CP_ACCESS_MASK) == !class_member_p);
1140 tree identifier;
1141 if (code != FUNCTION_DECL
1142 || !(sym_flags & GCC_CP_FLAG_SPECIAL_FUNCTION))
1144 if (name)
1145 identifier = get_identifier (name);
1146 else
1148 gcc_assert (RECORD_OR_UNION_CODE_P (code));
1149 identifier = make_anon_name ();
1153 if (code == FUNCTION_DECL)
1155 if (sym_flags & GCC_CP_FLAG_SPECIAL_FUNCTION)
1157 #define CHARS2(f,s) (((unsigned char)f << CHAR_BIT) | (unsigned char)s)
1158 switch (CHARS2 (name[0], name[1]))
1160 case CHARS2 ('C', 0x0): // ctor base declaration
1161 case CHARS2 ('C', ' '):
1162 case CHARS2 ('C', '1'):
1163 case CHARS2 ('C', '2'):
1164 case CHARS2 ('C', '4'):
1165 ctor = true;
1166 cdtor:
1167 gcc_assert (!address);
1168 gcc_assert (!substitution_name);
1169 identifier = DECL_NAME (TYPE_NAME (current_class_type));
1170 break;
1171 case CHARS2 ('D', 0x0): // dtor base declaration
1172 case CHARS2 ('D', ' '):
1173 case CHARS2 ('D', '0'):
1174 case CHARS2 ('D', '1'):
1175 case CHARS2 ('D', '2'):
1176 case CHARS2 ('D', '4'):
1177 gcc_assert (!template_decl_p);
1178 dtor = true;
1179 goto cdtor;
1180 case CHARS2 ('n', 'w'): // operator new
1181 opcode = NEW_EXPR;
1182 break;
1183 case CHARS2 ('n', 'a'): // operator new[]
1184 opcode = VEC_NEW_EXPR;
1185 break;
1186 case CHARS2 ('d', 'l'): // operator delete
1187 opcode = DELETE_EXPR;
1188 break;
1189 case CHARS2 ('d', 'a'): // operator delete[]
1190 opcode = VEC_DELETE_EXPR;
1191 break;
1192 case CHARS2 ('p', 's'): // operator + (unary)
1193 opcode = PLUS_EXPR;
1194 break;
1195 case CHARS2 ('n', 'g'): // operator - (unary)
1196 opcode = MINUS_EXPR;
1197 break;
1198 case CHARS2 ('a', 'd'): // operator & (unary)
1199 opcode = BIT_AND_EXPR;
1200 break;
1201 case CHARS2 ('d', 'e'): // operator * (unary)
1202 opcode = MULT_EXPR;
1203 break;
1204 case CHARS2 ('c', 'o'): // operator ~
1205 opcode = BIT_NOT_EXPR;
1206 break;
1207 case CHARS2 ('p', 'l'): // operator +
1208 opcode = PLUS_EXPR;
1209 break;
1210 case CHARS2 ('m', 'i'): // operator -
1211 opcode = MINUS_EXPR;
1212 break;
1213 case CHARS2 ('m', 'l'): // operator *
1214 opcode = MULT_EXPR;
1215 break;
1216 case CHARS2 ('d', 'v'): // operator /
1217 opcode = TRUNC_DIV_EXPR;
1218 break;
1219 case CHARS2 ('r', 'm'): // operator %
1220 opcode = TRUNC_MOD_EXPR;
1221 break;
1222 case CHARS2 ('a', 'n'): // operator &
1223 opcode = BIT_AND_EXPR;
1224 break;
1225 case CHARS2 ('o', 'r'): // operator |
1226 opcode = BIT_IOR_EXPR;
1227 break;
1228 case CHARS2 ('e', 'o'): // operator ^
1229 opcode = BIT_XOR_EXPR;
1230 break;
1231 case CHARS2 ('a', 'S'): // operator =
1232 opcode = NOP_EXPR;
1233 assop = true;
1234 break;
1235 case CHARS2 ('p', 'L'): // operator +=
1236 opcode = PLUS_EXPR;
1237 assop = true;
1238 break;
1239 case CHARS2 ('m', 'I'): // operator -=
1240 opcode = MINUS_EXPR;
1241 assop = true;
1242 break;
1243 case CHARS2 ('m', 'L'): // operator *=
1244 opcode = MULT_EXPR;
1245 assop = true;
1246 break;
1247 case CHARS2 ('d', 'V'): // operator /=
1248 opcode = TRUNC_DIV_EXPR;
1249 assop = true;
1250 break;
1251 case CHARS2 ('r', 'M'): // operator %=
1252 opcode = TRUNC_MOD_EXPR;
1253 assop = true;
1254 break;
1255 case CHARS2 ('a', 'N'): // operator &=
1256 opcode = BIT_AND_EXPR;
1257 assop = true;
1258 break;
1259 case CHARS2 ('o', 'R'): // operator |=
1260 opcode = BIT_IOR_EXPR;
1261 assop = true;
1262 break;
1263 case CHARS2 ('e', 'O'): // operator ^=
1264 opcode = BIT_XOR_EXPR;
1265 assop = true;
1266 break;
1267 case CHARS2 ('l', 's'): // operator <<
1268 opcode = LSHIFT_EXPR;
1269 break;
1270 case CHARS2 ('r', 's'): // operator >>
1271 opcode = RSHIFT_EXPR;
1272 break;
1273 case CHARS2 ('l', 'S'): // operator <<=
1274 opcode = LSHIFT_EXPR;
1275 assop = true;
1276 break;
1277 case CHARS2 ('r', 'S'): // operator >>=
1278 opcode = RSHIFT_EXPR;
1279 assop = true;
1280 break;
1281 case CHARS2 ('e', 'q'): // operator ==
1282 opcode = EQ_EXPR;
1283 break;
1284 case CHARS2 ('n', 'e'): // operator !=
1285 opcode = NE_EXPR;
1286 break;
1287 case CHARS2 ('l', 't'): // operator <
1288 opcode = LT_EXPR;
1289 break;
1290 case CHARS2 ('g', 't'): // operator >
1291 opcode = GT_EXPR;
1292 break;
1293 case CHARS2 ('l', 'e'): // operator <=
1294 opcode = LE_EXPR;
1295 break;
1296 case CHARS2 ('g', 'e'): // operator >=
1297 opcode = GE_EXPR;
1298 break;
1299 case CHARS2 ('n', 't'): // operator !
1300 opcode = TRUTH_NOT_EXPR;
1301 break;
1302 case CHARS2 ('a', 'a'): // operator &&
1303 opcode = TRUTH_ANDIF_EXPR;
1304 break;
1305 case CHARS2 ('o', 'o'): // operator ||
1306 opcode = TRUTH_ORIF_EXPR;
1307 break;
1308 case CHARS2 ('p', 'p'): // operator ++
1309 opcode = POSTINCREMENT_EXPR;
1310 break;
1311 case CHARS2 ('m', 'm'): // operator --
1312 /* This stands for either one as an operator name, and
1313 "pp" and "mm" stand for POST??CREMENT, but for some
1314 reason the parser uses this opcode name for
1315 operator--; let's follow their practice. */
1316 opcode = PREDECREMENT_EXPR;
1317 break;
1318 case CHARS2 ('c', 'm'): // operator ,
1319 opcode = COMPOUND_EXPR;
1320 break;
1321 case CHARS2 ('p', 'm'): // operator ->*
1322 opcode = MEMBER_REF;
1323 break;
1324 case CHARS2 ('p', 't'): // operator ->
1325 opcode = COMPONENT_REF;
1326 break;
1327 case CHARS2 ('c', 'l'): // operator ()
1328 opcode = CALL_EXPR;
1329 break;
1330 case CHARS2 ('i', 'x'): // operator []
1331 opcode = ARRAY_REF;
1332 break;
1333 case CHARS2 ('c', 'v'): // operator <T> (conversion operator)
1334 identifier = mangle_conv_op_name_for_type (TREE_TYPE (sym_type));
1335 break;
1336 // C++11-only:
1337 case CHARS2 ('l', 'i'): // operator "" <id>
1339 char *id = (char *)name + 2;
1340 bool freeid = false;
1341 if (*id >= '0' && *id <= '9')
1343 unsigned len = 0;
1346 len *= 10;
1347 len += id[0] - '0';
1348 id++;
1350 while (*id && *id >= '0' && *id <= '9');
1351 id = xstrndup (id, len);
1352 freeid = true;
1354 identifier = cp_literal_operator_id (id);
1355 if (freeid)
1356 free (id);
1358 break;
1359 case CHARS2 ('q', 'u'): // ternary operator, not overloadable.
1360 default:
1361 gcc_unreachable ();
1364 if (opcode != ERROR_MARK)
1366 if (assop)
1367 identifier = cp_assignment_operator_id (opcode);
1368 else
1369 identifier = cp_operator_id (opcode);
1372 decl = build_lang_decl_loc (loc, code, identifier, sym_type);
1373 /* FIXME: current_lang_name is lang_name_c while compiling an
1374 extern "C" function, and we haven't switched to a global
1375 context at this point, and this breaks function
1376 overloading. */
1377 SET_DECL_LANGUAGE (decl, lang_cplusplus);
1378 if (TREE_CODE (sym_type) == METHOD_TYPE)
1379 DECL_ARGUMENTS (decl) = build_this_parm (current_class_type,
1380 cp_type_quals (sym_type));
1381 for (tree arg = TREE_CODE (sym_type) == METHOD_TYPE
1382 ? TREE_CHAIN (TYPE_ARG_TYPES (sym_type))
1383 : TYPE_ARG_TYPES (sym_type);
1384 arg && arg != void_list_node;
1385 arg = TREE_CHAIN (arg))
1387 tree parm = cp_build_parm_decl (NULL_TREE, TREE_VALUE (arg));
1388 DECL_CHAIN (parm) = DECL_ARGUMENTS (decl);
1389 DECL_ARGUMENTS (decl) = parm;
1391 DECL_ARGUMENTS (decl) = nreverse (DECL_ARGUMENTS (decl));
1392 if (class_member_p)
1394 if (TREE_CODE (sym_type) == FUNCTION_TYPE)
1395 DECL_STATIC_FUNCTION_P (decl) = 1;
1396 if (sym_flags & GCC_CP_FLAG_VIRTUAL_FUNCTION)
1398 DECL_VIRTUAL_P (decl) = 1;
1399 if (sym_flags & GCC_CP_FLAG_PURE_VIRTUAL_FUNCTION)
1400 DECL_PURE_VIRTUAL_P (decl) = 1;
1401 if (sym_flags & GCC_CP_FLAG_FINAL_VIRTUAL_FUNCTION)
1402 DECL_FINAL_P (decl) = 1;
1404 else
1405 gcc_assert (!(sym_flags & (GCC_CP_FLAG_PURE_VIRTUAL_FUNCTION
1406 | GCC_CP_FLAG_FINAL_VIRTUAL_FUNCTION)));
1408 else
1410 gcc_assert (!(sym_flags & (GCC_CP_FLAG_VIRTUAL_FUNCTION
1411 | GCC_CP_FLAG_PURE_VIRTUAL_FUNCTION
1412 | GCC_CP_FLAG_FINAL_VIRTUAL_FUNCTION)));
1413 gcc_assert (!ctor && !dtor && !assop);
1415 if (sym_flags & GCC_CP_FLAG_EXPLICIT_FUNCTION)
1416 DECL_NONCONVERTING_P (decl) = 1;
1417 if (sym_flags & GCC_CP_FLAG_DEFAULTED_FUNCTION)
1419 DECL_INITIAL (decl) = ridpointers[(int)RID_DEFAULT];
1420 DECL_DEFAULTED_FN (decl) = 1;
1422 if (sym_flags & GCC_CP_FLAG_DELETED_FUNCTION)
1424 // DECL_INITIAL (decl) = ridpointers[(int)RID_DELETE];
1425 DECL_DELETED_FN (decl) = 1;
1426 DECL_DECLARED_INLINE_P (decl) = 1;
1427 DECL_INITIAL (decl) = error_mark_node;
1429 if (ctor || dtor)
1431 if (ctor)
1432 DECL_CONSTRUCTOR_P (decl) = 1;
1433 if (dtor)
1434 DECL_DESTRUCTOR_P (decl) = 1;
1436 else
1438 if ((sym_flags & GCC_CP_FLAG_SPECIAL_FUNCTION)
1439 && opcode != ERROR_MARK)
1440 SET_OVERLOADED_OPERATOR_CODE (decl, opcode);
1441 if (assop)
1442 DECL_ASSIGNMENT_OPERATOR_P (decl) = true;
1445 else if (RECORD_OR_UNION_CODE_P (code))
1447 decl = build_named_class_type (code, identifier, loc);
1448 tree type = TREE_TYPE (decl);
1450 if (code == RECORD_TYPE
1451 && !(sym_flags & GCC_CP_FLAG_CLASS_IS_STRUCT))
1452 CLASSTYPE_DECLARED_CLASS (type) = true;
1454 else if (class_member_p)
1456 decl = build_lang_decl_loc (loc, code, identifier, sym_type);
1458 if (TREE_CODE (decl) == VAR_DECL)
1460 DECL_THIS_STATIC (decl) = 1;
1461 // The remainder of this block does the same as:
1462 // set_linkage_for_static_data_member (decl);
1463 TREE_PUBLIC (decl) = 1;
1464 TREE_STATIC (decl) = 1;
1465 DECL_INTERFACE_KNOWN (decl) = 1;
1467 // FIXME: sym_flags & GCC_CP_FLAG_THREAD_LOCAL_VARIABLE
1468 gcc_assert (!(sym_flags & GCC_CP_FLAG_THREAD_LOCAL_VARIABLE));
1470 if (sym_flags & GCC_CP_FLAG_CONSTEXPR_VARIABLE)
1471 DECL_DECLARED_CONSTEXPR_P (decl) = true;
1474 else
1476 decl = build_decl (loc, code, identifier, sym_type);
1478 if (TREE_CODE (decl) == VAR_DECL)
1480 // FIXME: sym_flags & GCC_CP_FLAG_THREAD_LOCAL_VARIABLE
1481 gcc_assert (!(sym_flags & GCC_CP_FLAG_THREAD_LOCAL_VARIABLE));
1483 if (sym_flags & GCC_CP_FLAG_CONSTEXPR_VARIABLE)
1484 DECL_DECLARED_CONSTEXPR_P (decl) = true;
1487 TREE_USED (decl) = 1;
1488 TREE_ADDRESSABLE (decl) = 1;
1490 if (class_member_p)
1491 DECL_CONTEXT (decl) = FROB_CONTEXT (current_class_type);
1492 else if (at_namespace_scope_p ())
1493 DECL_CONTEXT (decl) = FROB_CONTEXT (current_decl_namespace ());
1495 set_access_flags (decl, acc_flags);
1497 if (sym_kind != GCC_CP_SYMBOL_TYPEDEF
1498 && sym_kind != GCC_CP_SYMBOL_CLASS
1499 && sym_kind != GCC_CP_SYMBOL_UNION
1500 && !template_decl_p && !ctor && !dtor)
1502 decl_addr_value value;
1504 DECL_EXTERNAL (decl) = 1;
1505 value.decl = decl;
1506 if (substitution_name != NULL)
1508 // If the translator gave us a name without a binding,
1509 // we can just substitute error_mark_node, since we know the
1510 // translator will be reporting an error anyhow.
1511 value.address
1512 = lookup_name (get_identifier (substitution_name));
1513 if (value.address == NULL_TREE)
1514 value.address = error_mark_node;
1516 else if (address)
1517 value.address = build_int_cst_type (ptr_type_node, address);
1518 else
1519 value.address = NULL;
1520 if (value.address)
1521 record_decl_address (ctx, value);
1524 if (class_member_p && code == FUNCTION_DECL)
1526 if (ctor || dtor)
1527 maybe_retrofit_in_chrg (decl);
1529 grok_special_member_properties (decl);
1532 if (template_decl_p)
1534 if (RECORD_OR_UNION_CODE_P (code))
1535 safe_pushtag (identifier, TREE_TYPE (decl), ts_current);
1536 else
1537 decl = safe_push_template_decl (decl);
1539 tree tdecl = NULL_TREE;
1540 if (class_member_p)
1541 tdecl = finish_member_template_decl (decl);
1543 end_template_decl ();
1545 /* We only support one level of templates, because we only
1546 support declaring generics; actual definitions are only of
1547 specializations. */
1548 gcc_assert (!template_parm_scope_p ());
1550 if (class_member_p)
1551 finish_member_declaration (tdecl);
1553 else if (RECORD_OR_UNION_CODE_P (code))
1554 safe_pushtag (identifier, TREE_TYPE (decl), ts_current);
1555 else if (class_member_p)
1556 finish_member_declaration (decl);
1557 else
1558 decl = safe_pushdecl_maybe_friend (decl, false);
1560 if ((ctor || dtor)
1561 /* Don't crash after a duplicate declaration of a cdtor. */
1562 && TYPE_METHODS (current_class_type) == decl)
1564 /* ctors and dtors clones are chained after DECL.
1565 However, we create the clones before TYPE_METHODS is
1566 reversed. We test for cloned methods after reversal,
1567 however, and the test requires the clones to follow
1568 DECL. So, we reverse the chain of clones now, so
1569 that it will come out in the right order after
1570 reversal. */
1571 tree save = DECL_CHAIN (decl);
1572 DECL_CHAIN (decl) = NULL_TREE;
1573 clone_function_decl (decl, /*update_method_vec_p=*/1);
1574 gcc_assert (TYPE_METHODS (current_class_type) == decl);
1575 TYPE_METHODS (current_class_type)
1576 = nreverse (TYPE_METHODS (current_class_type));
1577 DECL_CHAIN (decl) = save;
1580 rest_of_decl_compilation (decl, toplevel_bindings_p (), 0);
1582 return convert_out (ctx->preserve (decl));
1585 gcc_decl
1586 plugin_define_cdtor_clone (cc1_plugin::connection *self,
1587 const char *name,
1588 gcc_decl cdtor_in,
1589 gcc_address address)
1591 plugin_context *ctx = static_cast<plugin_context *> (self);
1592 tree decl = convert_in (cdtor_in);
1593 bool ctor = false;
1594 bool dtor = false;
1595 tree identifier;
1597 switch (CHARS2 (name[0], name[1]))
1599 case CHARS2 ('C', '1'): // in-charge constructor
1600 identifier = complete_ctor_identifier;
1601 ctor = true;
1602 break;
1603 case CHARS2 ('C', '2'): // not-in-charge constructor
1604 identifier = base_ctor_identifier;
1605 ctor = true;
1606 break;
1607 case CHARS2 ('C', '4'):
1608 identifier = ctor_identifier; // unified constructor
1609 ctor = true;
1610 break;
1611 case CHARS2 ('D', '0'): // deleting destructor
1612 identifier = deleting_dtor_identifier;
1613 dtor = true;
1614 break;
1615 case CHARS2 ('D', '1'): // in-charge destructor
1616 identifier = complete_dtor_identifier;
1617 dtor = true;
1618 break;
1619 case CHARS2 ('D', '2'): // not-in-charge destructor
1620 identifier = base_dtor_identifier;
1621 dtor = true;
1622 break;
1623 case CHARS2 ('D', '4'):
1624 identifier = dtor_identifier; // unified destructor
1625 dtor = true;
1626 break;
1628 default:
1629 gcc_unreachable ();
1632 gcc_assert (!ctor != !dtor);
1633 gcc_assert (ctor
1634 ? (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl)
1635 && DECL_NAME (decl) == ctor_identifier)
1636 : (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (decl)
1637 && DECL_NAME (decl) == dtor_identifier));
1639 while (decl && DECL_NAME (decl) != identifier)
1641 decl = DECL_CHAIN (decl);
1642 if (decl && !DECL_CLONED_FUNCTION_P (decl))
1643 decl = NULL_TREE;
1645 gcc_assert (decl);
1647 record_decl_address (ctx, build_decl_addr_value (decl, address));
1649 return convert_out (decl);
1653 plugin_add_friend (cc1_plugin::connection * /* self */,
1654 gcc_decl decl_in,
1655 gcc_type type_in)
1657 tree decl = convert_in (decl_in);
1658 tree type = convert_in (type_in);
1660 gcc_assert (type || at_class_scope_p ());
1662 if (!type)
1663 type = current_class_type;
1664 else
1665 gcc_assert (TREE_CODE (type) == RECORD_TYPE);
1667 if (TYPE_P (decl))
1668 make_friend_class (type, TREE_TYPE (decl), true);
1669 else
1671 DECL_FRIEND_P (decl) = true;
1672 add_friend (type, decl, true);
1675 return 1;
1678 gcc_type
1679 plugin_build_pointer_type (cc1_plugin::connection *,
1680 gcc_type base_type)
1682 // No need to preserve a pointer type as the base type is preserved.
1683 return convert_out (build_pointer_type (convert_in (base_type)));
1686 gcc_type
1687 plugin_build_reference_type (cc1_plugin::connection *,
1688 gcc_type base_type_in,
1689 enum gcc_cp_ref_qualifiers rquals)
1691 bool rval;
1693 switch (rquals)
1695 case GCC_CP_REF_QUAL_LVALUE:
1696 rval = false;
1697 break;
1698 case GCC_CP_REF_QUAL_RVALUE:
1699 rval = true;
1700 break;
1701 case GCC_CP_REF_QUAL_NONE:
1702 default:
1703 gcc_unreachable ();
1706 tree rtype = cp_build_reference_type (convert_in (base_type_in), rval);
1708 return convert_out (rtype);
1711 static tree
1712 start_class_def (tree type,
1713 const gcc_vbase_array *base_classes)
1715 tree bases = NULL;
1716 if (base_classes)
1718 for (int i = 0; i < base_classes->n_elements; i++)
1720 tree access;
1722 gcc_assert ((base_classes->flags[i] & GCC_CP_SYMBOL_MASK)
1723 == GCC_CP_SYMBOL_BASECLASS);
1725 switch (base_classes->flags[i] & GCC_CP_ACCESS_MASK)
1727 case GCC_CP_ACCESS_PRIVATE:
1728 access = ridpointers[(int)RID_PRIVATE];
1729 break;
1731 case GCC_CP_ACCESS_PROTECTED:
1732 access = ridpointers[(int)RID_PROTECTED];
1733 break;
1735 case GCC_CP_ACCESS_PUBLIC:
1736 access = ridpointers[(int)RID_PUBLIC];
1737 break;
1739 default:
1740 gcc_unreachable ();
1743 tree base = finish_base_specifier
1744 (convert_in (base_classes->elements[i]), access,
1745 (base_classes->flags[i] & GCC_CP_FLAG_BASECLASS_VIRTUAL) != 0);
1746 TREE_CHAIN (base) = bases;
1747 bases = base;
1749 bases = nreverse (bases);
1751 xref_basetypes (type, bases);
1752 begin_class_definition (type);
1753 return type;
1756 gcc_type
1757 plugin_start_class_type (cc1_plugin::connection *self,
1758 gcc_decl typedecl_in,
1759 const gcc_vbase_array *base_classes,
1760 const char *filename,
1761 unsigned int line_number)
1763 plugin_context *ctx = static_cast<plugin_context *> (self);
1764 source_location loc = ctx->get_source_location (filename, line_number);
1765 tree typedecl = convert_in (typedecl_in);
1766 tree type = TREE_TYPE (typedecl);
1768 gcc_assert (RECORD_OR_UNION_CODE_P (TREE_CODE (type)));
1769 gcc_assert (!COMPLETE_TYPE_P (type));
1771 DECL_SOURCE_LOCATION (typedecl) = loc;
1773 tree result = start_class_def (type, base_classes);
1775 return convert_out (ctx->preserve (result));
1778 gcc_type
1779 plugin_start_closure_class_type (cc1_plugin::connection *self,
1780 int discriminator,
1781 gcc_decl extra_scope_in,
1782 enum gcc_cp_symbol_kind flags,
1783 const char *filename,
1784 unsigned int line_number)
1786 plugin_context *ctx = static_cast<plugin_context *> (self);
1787 tree extra_scope = convert_in (extra_scope_in);
1789 gcc_assert ((flags & GCC_CP_SYMBOL_MASK) == GCC_CP_SYMBOL_LAMBDA_CLOSURE);
1790 gcc_assert ((flags & (~(GCC_CP_SYMBOL_MASK | GCC_CP_ACCESS_MASK))) == 0);
1792 gcc_assert (!(flags & GCC_CP_ACCESS_MASK) == !at_class_scope_p ());
1794 /* See at_fake_function_scope_p. */
1795 gcc_assert (!at_function_scope_p ());
1797 if (extra_scope)
1799 if (TREE_CODE (extra_scope) == PARM_DECL)
1801 gcc_assert (at_fake_function_scope_p ());
1802 /* Check that the given extra_scope is one of the parameters of
1803 the current function. */
1804 for (tree parm = DECL_ARGUMENTS (current_function_decl);
1805 ; parm = DECL_CHAIN (parm))
1807 gcc_assert (parm);
1808 if (parm == extra_scope)
1809 break;
1812 else if (TREE_CODE (extra_scope) == FIELD_DECL)
1814 gcc_assert (at_class_scope_p ());
1815 gcc_assert (DECL_CONTEXT (extra_scope) == current_class_type);
1817 else
1818 /* FIXME: does this ever really occur? */
1819 gcc_assert (TREE_CODE (extra_scope) == VAR_DECL);
1822 tree lambda_expr = build_lambda_expr ();
1824 LAMBDA_EXPR_LOCATION (lambda_expr) = ctx->get_source_location (filename,
1825 line_number);
1827 tree type = begin_lambda_type (lambda_expr);
1829 /* Instead of calling record_lambda_scope, do this: */
1830 LAMBDA_EXPR_EXTRA_SCOPE (lambda_expr) = extra_scope;
1831 LAMBDA_EXPR_DISCRIMINATOR (lambda_expr) = discriminator;
1833 tree decl = TYPE_NAME (type);
1834 determine_visibility (decl);
1835 set_access_flags (decl, flags);
1837 return convert_out (ctx->preserve (type));
1840 gcc_expr
1841 plugin_build_lambda_expr (cc1_plugin::connection *self,
1842 gcc_type closure_type_in)
1844 plugin_context *ctx = static_cast<plugin_context *> (self);
1845 tree closure_type = convert_in (closure_type_in);
1847 gcc_assert (LAMBDA_TYPE_P (closure_type));
1849 tree lambda_expr = CLASSTYPE_LAMBDA_EXPR (closure_type);
1851 tree lambda_object = build_lambda_object (lambda_expr);
1853 return convert_out (ctx->preserve (lambda_object));
1856 gcc_decl
1857 plugin_build_field (cc1_plugin::connection *,
1858 const char *field_name,
1859 gcc_type field_type_in,
1860 enum gcc_cp_symbol_kind flags,
1861 unsigned long bitsize,
1862 unsigned long bitpos)
1864 tree record_or_union_type = current_class_type;
1865 tree field_type = convert_in (field_type_in);
1867 gcc_assert (at_class_scope_p ());
1868 gcc_assert (RECORD_OR_UNION_CODE_P (TREE_CODE (record_or_union_type)));
1869 gcc_assert ((flags & GCC_CP_SYMBOL_MASK) == GCC_CP_SYMBOL_FIELD);
1870 gcc_assert ((flags & (~(GCC_CP_SYMBOL_MASK | GCC_CP_ACCESS_MASK
1871 | GCC_CP_FLAG_MASK_FIELD))) == 0);
1872 gcc_assert ((flags & GCC_CP_ACCESS_MASK));
1874 /* Note that gdb does not preserve the location of field decls, so
1875 we can't provide a decent location here. */
1876 tree decl = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1877 get_identifier (field_name), field_type);
1878 DECL_FIELD_CONTEXT (decl) = record_or_union_type;
1880 set_access_flags (decl, flags);
1882 if ((flags & GCC_CP_FLAG_FIELD_MUTABLE) != 0)
1883 DECL_MUTABLE_P (decl) = 1;
1885 if (TREE_CODE (field_type) == INTEGER_TYPE
1886 && TYPE_PRECISION (field_type) != bitsize)
1888 DECL_BIT_FIELD_TYPE (decl) = field_type;
1889 TREE_TYPE (decl)
1890 = c_build_bitfield_integer_type (bitsize, TYPE_UNSIGNED (field_type));
1893 DECL_MODE (decl) = TYPE_MODE (TREE_TYPE (decl));
1895 // There's no way to recover this from DWARF.
1896 SET_DECL_OFFSET_ALIGN (decl, TYPE_PRECISION (pointer_sized_int_node));
1898 tree pos = bitsize_int (bitpos);
1899 pos_from_bit (&DECL_FIELD_OFFSET (decl), &DECL_FIELD_BIT_OFFSET (decl),
1900 DECL_OFFSET_ALIGN (decl), pos);
1902 DECL_SIZE (decl) = bitsize_int (bitsize);
1903 DECL_SIZE_UNIT (decl) = size_int ((bitsize + BITS_PER_UNIT - 1)
1904 / BITS_PER_UNIT);
1906 DECL_CHAIN (decl) = TYPE_FIELDS (record_or_union_type);
1907 TYPE_FIELDS (record_or_union_type) = decl;
1909 return convert_out (decl);
1913 plugin_finish_class_type (cc1_plugin::connection *,
1914 unsigned long size_in_bytes)
1916 tree record_or_union_type = current_class_type;
1918 gcc_assert (RECORD_OR_UNION_CODE_P (TREE_CODE (record_or_union_type)));
1920 finish_struct (record_or_union_type, NULL);
1922 gcc_assert (compare_tree_int (TYPE_SIZE_UNIT (record_or_union_type),
1923 size_in_bytes) == 0);
1925 return 1;
1928 gcc_type
1929 plugin_start_enum_type (cc1_plugin::connection *self,
1930 const char *name,
1931 gcc_type underlying_int_type_in,
1932 enum gcc_cp_symbol_kind flags,
1933 const char *filename,
1934 unsigned int line_number)
1936 plugin_context *ctx = static_cast<plugin_context *> (self);
1937 tree underlying_int_type = convert_in (underlying_int_type_in);
1939 gcc_assert ((flags & GCC_CP_SYMBOL_MASK) == GCC_CP_SYMBOL_ENUM);
1940 gcc_assert ((flags & (~(GCC_CP_SYMBOL_MASK | GCC_CP_ACCESS_MASK
1941 | GCC_CP_FLAG_MASK_ENUM))) == 0);
1942 gcc_assert (!(flags & GCC_CP_ACCESS_MASK) == !at_class_scope_p ());
1944 if (underlying_int_type == error_mark_node)
1945 return convert_out (error_mark_node);
1947 bool is_new_type = false;
1949 tree id = name ? get_identifier (name) : make_anon_name ();
1951 tree type = start_enum (id, NULL_TREE,
1952 underlying_int_type,
1953 /* attributes = */ NULL_TREE,
1954 !!(flags & GCC_CP_FLAG_ENUM_SCOPED), &is_new_type);
1956 gcc_assert (is_new_type);
1958 source_location loc = ctx->get_source_location (filename, line_number);
1959 tree type_decl = TYPE_NAME (type);
1960 DECL_SOURCE_LOCATION (type_decl) = loc;
1961 SET_OPAQUE_ENUM_P (type, false);
1963 set_access_flags (type_decl, flags);
1965 return convert_out (ctx->preserve (type));
1968 gcc_decl
1969 plugin_build_enum_constant (cc1_plugin::connection *,
1970 gcc_type enum_type_in,
1971 const char *name,
1972 unsigned long value)
1974 tree enum_type = convert_in (enum_type_in);
1976 gcc_assert (TREE_CODE (enum_type) == ENUMERAL_TYPE);
1978 build_enumerator (get_identifier (name), build_int_cst (enum_type, value),
1979 enum_type, NULL_TREE, BUILTINS_LOCATION);
1981 return convert_out (TREE_VALUE (TYPE_VALUES (enum_type)));
1985 plugin_finish_enum_type (cc1_plugin::connection *,
1986 gcc_type enum_type_in)
1988 tree enum_type = convert_in (enum_type_in);
1990 finish_enum_value_list (enum_type);
1991 finish_enum (enum_type);
1993 return 1;
1996 gcc_type
1997 plugin_build_function_type (cc1_plugin::connection *self,
1998 gcc_type return_type_in,
1999 const struct gcc_type_array *argument_types_in,
2000 int is_varargs)
2002 tree *argument_types;
2003 tree return_type = convert_in (return_type_in);
2004 tree result;
2006 argument_types = new tree[argument_types_in->n_elements];
2007 for (int i = 0; i < argument_types_in->n_elements; ++i)
2008 argument_types[i] = convert_in (argument_types_in->elements[i]);
2010 if (is_varargs)
2011 result = build_varargs_function_type_array (return_type,
2012 argument_types_in->n_elements,
2013 argument_types);
2014 else
2015 result = build_function_type_array (return_type,
2016 argument_types_in->n_elements,
2017 argument_types);
2019 delete[] argument_types;
2021 plugin_context *ctx = static_cast<plugin_context *> (self);
2022 return convert_out (ctx->preserve (result));
2025 #if 0
2027 gcc_type
2028 plugin_add_function_default_args (cc1_plugin::connection *self,
2029 gcc_type function_type_in,
2030 const struct gcc_cp_function_args *defaults)
2032 tree function_type = convert_in (function_type_in);
2034 gcc_assert (TREE_CODE (function_type) == FUNCTION_TYPE);
2036 if (!defaults || !defaults->n_elements)
2037 return function_type_in;
2039 tree pargs = TYPE_ARG_TYPES (function_type);
2040 tree nargs = NULL_TREE;
2042 /* Build a reversed copy of the list of default-less arguments in
2043 NARGS. At the end of the loop, PARGS will point to the end of
2044 the argument list, or to the first argument that had a default
2045 value. */
2046 while (pargs && TREE_VALUE (pargs) != void_list_node
2047 && !TREE_PURPOSE (pargs))
2049 nargs = tree_cons (NULL_TREE, TREE_VALUE (pargs), nargs);
2050 pargs = TREE_CHAIN (pargs);
2053 /* Set the defaults in the now-leading NARGS, taking into account
2054 that NARGS is reversed but DEFAULTS->elements isn't. */
2055 tree ndargs = nargs;
2056 int i = defaults->n_elements;
2057 while (i--)
2059 gcc_assert (ndargs);
2060 tree deflt = convert_in (defaults->elements[i]);
2061 if (!deflt)
2062 deflt = error_mark_node;
2063 TREE_PURPOSE (ndargs) = deflt;
2064 ndargs = TREE_CHAIN (ndargs);
2067 /* Finally, reverse NARGS, and append the remaining PARGS that
2068 already had defaults. */
2069 nargs = nreverse (nargs);
2070 nargs = chainon (nargs, pargs);
2072 tree result = build_function_type (TREE_TYPE (function_type), nargs);
2074 /* Copy exceptions, attributes and whatnot. */
2075 result = build_exception_variant (result,
2076 TYPE_RAISES_EXCEPTIONS (function_type));
2077 result = cp_build_type_attribute_variant (result,
2078 TYPE_ATTRIBUTES (function_type));
2080 plugin_context *ctx = static_cast<plugin_context *> (self);
2081 return convert_out (ctx->preserve (result));
2085 plugin_set_deferred_function_default_args (cc1_plugin::connection *,
2086 gcc_decl function_in,
2087 const struct gcc_cp_function_args
2088 *defaults)
2090 tree function = convert_in (function_in);
2092 gcc_assert (TREE_CODE (function) == FUNCTION_DECL);
2094 if (!defaults || !defaults->n_elements)
2095 return 1;
2097 tree arg = FUNCTION_FIRST_USER_PARMTYPE (function);
2099 for (int i = 0; i < defaults->n_elements; i++)
2101 while (arg && TREE_PURPOSE (arg) != error_mark_node)
2102 arg = TREE_CHAIN (arg);
2104 if (!arg)
2105 return 0;
2107 TREE_PURPOSE (arg) = convert_in (defaults->elements[i]);
2108 arg = TREE_CHAIN (arg);
2111 return 1;
2114 #endif
2116 gcc_decl
2117 plugin_get_function_parameter_decl (cc1_plugin::connection *,
2118 gcc_decl function_in,
2119 int index)
2121 tree function = convert_in (function_in);
2123 gcc_assert (TREE_CODE (function) == FUNCTION_DECL);
2125 if (index == -1)
2127 gcc_assert (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE);
2129 return convert_out (DECL_ARGUMENTS (function));
2132 gcc_assert (index >= 0);
2134 tree args = FUNCTION_FIRST_USER_PARM (function);
2136 for (int i = 0; args && i < index; i++)
2137 args = DECL_CHAIN (args);
2139 return convert_out (args);
2142 gcc_type
2143 plugin_build_exception_spec_variant (cc1_plugin::connection *self,
2144 gcc_type function_type_in,
2145 const struct gcc_type_array *except_types_in)
2147 tree function_type = convert_in (function_type_in);
2148 tree except_types = NULL_TREE;
2150 if (!except_types_in)
2151 except_types = noexcept_false_spec;
2152 else if (!except_types_in->n_elements)
2153 except_types = empty_except_spec;
2154 else
2155 for (int i = 0; i < except_types_in->n_elements; i++)
2156 except_types = add_exception_specifier (except_types,
2157 convert_in
2158 (except_types_in->elements[i]),
2161 function_type = build_exception_variant (function_type,
2162 except_types);
2164 plugin_context *ctx = static_cast<plugin_context *> (self);
2165 return convert_out (ctx->preserve (function_type));
2168 gcc_type
2169 plugin_build_method_type (cc1_plugin::connection *self,
2170 gcc_type class_type_in,
2171 gcc_type func_type_in,
2172 enum gcc_cp_qualifiers quals_in,
2173 enum gcc_cp_ref_qualifiers rquals_in)
2175 tree class_type = convert_in (class_type_in);
2176 tree func_type = convert_in (func_type_in);
2177 cp_cv_quals quals = 0;
2178 cp_ref_qualifier rquals;
2180 if ((quals_in & GCC_CP_QUALIFIER_CONST) != 0)
2181 quals |= TYPE_QUAL_CONST;
2182 if ((quals_in & GCC_CP_QUALIFIER_VOLATILE) != 0)
2183 quals |= TYPE_QUAL_VOLATILE;
2184 gcc_assert ((quals_in & GCC_CP_QUALIFIER_RESTRICT) == 0);
2186 switch (rquals_in)
2188 case GCC_CP_REF_QUAL_NONE:
2189 rquals = REF_QUAL_NONE;
2190 break;
2191 case GCC_CP_REF_QUAL_LVALUE:
2192 rquals = REF_QUAL_LVALUE;
2193 break;
2194 case GCC_CP_REF_QUAL_RVALUE:
2195 rquals = REF_QUAL_RVALUE;
2196 break;
2197 default:
2198 gcc_unreachable ();
2201 tree method_type = class_type
2202 ? build_memfn_type (func_type, class_type, quals, rquals)
2203 : apply_memfn_quals (func_type, quals, rquals);
2205 plugin_context *ctx = static_cast<plugin_context *> (self);
2206 return convert_out (ctx->preserve (method_type));
2209 gcc_type
2210 plugin_build_pointer_to_member_type (cc1_plugin::connection *self,
2211 gcc_type class_type_in,
2212 gcc_type member_type_in)
2214 tree class_type = convert_in (class_type_in);
2215 tree member_type = convert_in (member_type_in);
2217 tree memptr_type = build_ptrmem_type (class_type, member_type);
2219 plugin_context *ctx = static_cast<plugin_context *> (self);
2220 return convert_out (ctx->preserve (memptr_type));
2224 plugin_start_template_decl (cc1_plugin::connection *)
2226 begin_template_parm_list ();
2228 TP_PARM_LIST = NULL_TREE;
2230 return 1;
2233 gcc_decl
2234 plugin_get_type_decl (cc1_plugin::connection *,
2235 gcc_type type_in)
2237 tree type = convert_in (type_in);
2239 tree name = TYPE_NAME (type);
2240 gcc_assert (name);
2242 return convert_out (name);
2245 gcc_type
2246 plugin_get_decl_type (cc1_plugin::connection *,
2247 gcc_decl decl_in)
2249 tree decl = convert_in (decl_in);
2251 tree type = TREE_TYPE (decl);
2252 gcc_assert (type);
2254 return convert_out (type);
2257 gcc_type
2258 plugin_build_type_template_parameter (cc1_plugin::connection *self,
2259 const char *id,
2260 int /* bool */ pack_p,
2261 gcc_type default_type,
2262 const char *filename,
2263 unsigned int line_number)
2265 plugin_context *ctx = static_cast<plugin_context *> (self);
2266 source_location loc = ctx->get_source_location (filename, line_number);
2268 gcc_assert (template_parm_scope_p ());
2270 tree parm = finish_template_type_parm (class_type_node, get_identifier (id));
2271 parm = build_tree_list (convert_in (default_type), parm);
2273 gcc_assert (!(pack_p && default_type));
2275 /* Create a type and a decl for the type parm, and add the decl to
2276 TP_PARM_LIST. */
2277 TP_PARM_LIST = process_template_parm (TP_PARM_LIST, loc, parm,
2278 /* is_non_type = */ false, pack_p);
2280 /* Locate the decl of the newly-added, processed template parm. */
2281 parm = TREE_VALUE (tree_last (TP_PARM_LIST));
2283 /* Return its type. */
2284 return convert_out (ctx->preserve (TREE_TYPE (parm)));
2287 gcc_utempl
2288 plugin_build_template_template_parameter (cc1_plugin::connection *self,
2289 const char *id,
2290 int /* bool */ pack_p,
2291 gcc_utempl default_templ,
2292 const char *filename,
2293 unsigned int line_number)
2295 plugin_context *ctx = static_cast<plugin_context *> (self);
2296 source_location loc = ctx->get_source_location (filename, line_number);
2298 gcc_assert (template_parm_scope_p ());
2300 /* Finish the template parm list that started this template parm. */
2301 end_template_parm_list (TP_PARM_LIST);
2303 gcc_assert (template_parm_scope_p ());
2305 tree parm = finish_template_template_parm (class_type_node,
2306 get_identifier (id));
2307 parm = build_tree_list (convert_in (default_templ), parm);
2309 gcc_assert (!(pack_p && default_templ));
2311 /* Create a type and a decl for the template parm, and add the decl
2312 to TP_PARM_LIST. */
2313 TP_PARM_LIST = process_template_parm (TP_PARM_LIST, loc, parm,
2314 /* is_non_type = */ false, pack_p);
2316 /* Locate the decl of the newly-added, processed template parm. */
2317 parm = TREE_VALUE (tree_last (TP_PARM_LIST));
2319 return convert_out (ctx->preserve (parm));
2322 gcc_decl
2323 plugin_build_value_template_parameter (cc1_plugin::connection *self,
2324 gcc_type type,
2325 const char *id,
2326 gcc_expr default_value,
2327 const char *filename,
2328 unsigned int line_number)
2330 plugin_context *ctx = static_cast<plugin_context *> (self);
2331 source_location loc = ctx->get_source_location (filename, line_number);
2333 gcc_assert (template_parm_scope_p ());
2335 cp_declarator declarator;
2336 memset (&declarator, 0, sizeof (declarator));
2337 // &declarator = make_id_declarator (NULL, get_identifier (id), sfk_none):
2338 declarator.kind = cdk_id;
2339 declarator.u.id.qualifying_scope = NULL;
2340 declarator.u.id.unqualified_name = get_identifier (id);
2341 declarator.u.id.sfk = sfk_none;
2343 cp_decl_specifier_seq declspec;
2344 memset (&declspec, 0, sizeof (declspec));
2345 // cp_parser_set_decl_spec_type (&declspec, convert_in (type), -token-, false):
2346 declspec.any_specifiers_p = declspec.any_type_specifiers_p = true;
2347 declspec.type = convert_in (type);
2348 declspec.locations[ds_type_spec] = loc;
2350 tree parm = grokdeclarator (&declarator, &declspec, TPARM, 0, 0);
2351 parm = build_tree_list (convert_in (default_value), parm);
2353 /* Create a type and a decl for the template parm, and add the decl
2354 to TP_PARM_LIST. */
2355 TP_PARM_LIST = process_template_parm (TP_PARM_LIST, loc, parm,
2356 /* is_non_type = */ true, false);
2358 /* Locate the decl of the newly-added, processed template parm. */
2359 parm = TREE_VALUE (tree_last (TP_PARM_LIST));
2361 return convert_out (ctx->preserve (parm));
2364 static tree
2365 targlist (const gcc_cp_template_args *targs)
2367 int n = targs->n_elements;
2368 tree vec = make_tree_vec (n);
2369 while (n--)
2371 switch (targs->kinds[n])
2373 case GCC_CP_TPARG_VALUE:
2374 TREE_VEC_ELT (vec, n) = convert_in (targs->elements[n].value);
2375 break;
2376 case GCC_CP_TPARG_CLASS:
2377 TREE_VEC_ELT (vec, n) = convert_in (targs->elements[n].type);
2378 break;
2379 case GCC_CP_TPARG_TEMPL:
2380 TREE_VEC_ELT (vec, n) = convert_in (targs->elements[n].templ);
2381 break;
2382 case GCC_CP_TPARG_PACK:
2383 TREE_VEC_ELT (vec, n) = convert_in (targs->elements[n].pack);
2384 break;
2385 default:
2386 gcc_unreachable ();
2389 return vec;
2392 gcc_type
2393 plugin_build_dependent_typename (cc1_plugin::connection *self,
2394 gcc_type enclosing_type,
2395 const char *id,
2396 const gcc_cp_template_args *targs)
2398 plugin_context *ctx = static_cast<plugin_context *> (self);
2399 tree type = convert_in (enclosing_type);
2400 tree name = get_identifier (id);
2401 if (targs)
2402 name = build_min_nt_loc (/*loc=*/0, TEMPLATE_ID_EXPR,
2403 name, targlist (targs));
2404 tree res = make_typename_type (type, name, typename_type,
2405 /*complain=*/tf_error);
2406 return convert_out (ctx->preserve (res));
2409 gcc_utempl
2410 plugin_build_dependent_class_template (cc1_plugin::connection *self,
2411 gcc_type enclosing_type,
2412 const char *id)
2414 plugin_context *ctx = static_cast<plugin_context *> (self);
2415 tree type = convert_in (enclosing_type);
2416 tree name = get_identifier (id);
2417 tree res = make_unbound_class_template (type, name, NULL_TREE,
2418 /*complain=*/tf_error);
2419 return convert_out (ctx->preserve (res));
2422 gcc_type
2423 plugin_build_dependent_type_template_id (cc1_plugin::connection *self,
2424 gcc_utempl template_decl,
2425 const gcc_cp_template_args *targs)
2427 plugin_context *ctx = static_cast<plugin_context *> (self);
2428 tree type = convert_in (template_decl);
2429 tree decl = finish_template_type (type, targlist (targs),
2430 /*entering_scope=*/false);
2431 return convert_out (ctx->preserve (TREE_TYPE (decl)));
2434 gcc_expr
2435 plugin_build_dependent_expr (cc1_plugin::connection *self,
2436 gcc_decl enclosing_scope,
2437 enum gcc_cp_symbol_kind flags,
2438 const char *name,
2439 gcc_type conv_type_in,
2440 const gcc_cp_template_args *targs)
2442 plugin_context *ctx = static_cast<plugin_context *> (self);
2443 tree scope = convert_in (enclosing_scope);
2444 tree conv_type = convert_in (conv_type_in);
2445 tree identifier;
2447 if (TREE_CODE (scope) != NAMESPACE_DECL)
2449 tree type = TREE_TYPE (scope);
2450 gcc_assert (TYPE_NAME (type) == scope);
2451 scope = type;
2454 if (flags == (GCC_CP_SYMBOL_FUNCTION | GCC_CP_FLAG_SPECIAL_FUNCTION))
2456 bool assop = false, convop = false;
2457 tree_code opcode = ERROR_MARK;
2459 switch (CHARS2 (name[0], name[1]))
2461 case CHARS2 ('C', 0x0): // ctor base declaration
2462 case CHARS2 ('C', ' '):
2463 case CHARS2 ('C', '1'):
2464 case CHARS2 ('C', '2'):
2465 case CHARS2 ('C', '4'):
2466 identifier = ctor_identifier;
2467 break;
2468 case CHARS2 ('D', 0x0): // dtor base declaration
2469 case CHARS2 ('D', ' '):
2470 case CHARS2 ('D', '0'):
2471 case CHARS2 ('D', '1'):
2472 case CHARS2 ('D', '2'):
2473 case CHARS2 ('D', '4'):
2474 gcc_assert (!targs);
2475 identifier = dtor_identifier;
2476 break;
2477 case CHARS2 ('n', 'w'): // operator new
2478 opcode = NEW_EXPR;
2479 break;
2480 case CHARS2 ('n', 'a'): // operator new[]
2481 opcode = VEC_NEW_EXPR;
2482 break;
2483 case CHARS2 ('d', 'l'): // operator delete
2484 opcode = DELETE_EXPR;
2485 break;
2486 case CHARS2 ('d', 'a'): // operator delete[]
2487 opcode = VEC_DELETE_EXPR;
2488 break;
2489 case CHARS2 ('p', 's'): // operator + (unary)
2490 opcode = PLUS_EXPR;
2491 break;
2492 case CHARS2 ('n', 'g'): // operator - (unary)
2493 opcode = MINUS_EXPR;
2494 break;
2495 case CHARS2 ('a', 'd'): // operator & (unary)
2496 opcode = BIT_AND_EXPR;
2497 break;
2498 case CHARS2 ('d', 'e'): // operator * (unary)
2499 opcode = MULT_EXPR;
2500 break;
2501 case CHARS2 ('c', 'o'): // operator ~
2502 opcode = BIT_NOT_EXPR;
2503 break;
2504 case CHARS2 ('p', 'l'): // operator +
2505 opcode = PLUS_EXPR;
2506 break;
2507 case CHARS2 ('m', 'i'): // operator -
2508 opcode = MINUS_EXPR;
2509 break;
2510 case CHARS2 ('m', 'l'): // operator *
2511 opcode = MULT_EXPR;
2512 break;
2513 case CHARS2 ('d', 'v'): // operator /
2514 opcode = TRUNC_DIV_EXPR;
2515 break;
2516 case CHARS2 ('r', 'm'): // operator %
2517 opcode = TRUNC_MOD_EXPR;
2518 break;
2519 case CHARS2 ('a', 'n'): // operator &
2520 opcode = BIT_AND_EXPR;
2521 break;
2522 case CHARS2 ('o', 'r'): // operator |
2523 opcode = BIT_IOR_EXPR;
2524 break;
2525 case CHARS2 ('e', 'o'): // operator ^
2526 opcode = BIT_XOR_EXPR;
2527 break;
2528 case CHARS2 ('a', 'S'): // operator =
2529 opcode = NOP_EXPR;
2530 assop = true;
2531 break;
2532 case CHARS2 ('p', 'L'): // operator +=
2533 opcode = PLUS_EXPR;
2534 assop = true;
2535 break;
2536 case CHARS2 ('m', 'I'): // operator -=
2537 opcode = MINUS_EXPR;
2538 assop = true;
2539 break;
2540 case CHARS2 ('m', 'L'): // operator *=
2541 opcode = MULT_EXPR;
2542 assop = true;
2543 break;
2544 case CHARS2 ('d', 'V'): // operator /=
2545 opcode = TRUNC_DIV_EXPR;
2546 assop = true;
2547 break;
2548 case CHARS2 ('r', 'M'): // operator %=
2549 opcode = TRUNC_MOD_EXPR;
2550 assop = true;
2551 break;
2552 case CHARS2 ('a', 'N'): // operator &=
2553 opcode = BIT_AND_EXPR;
2554 assop = true;
2555 break;
2556 case CHARS2 ('o', 'R'): // operator |=
2557 opcode = BIT_IOR_EXPR;
2558 assop = true;
2559 break;
2560 case CHARS2 ('e', 'O'): // operator ^=
2561 opcode = BIT_XOR_EXPR;
2562 assop = true;
2563 break;
2564 case CHARS2 ('l', 's'): // operator <<
2565 opcode = LSHIFT_EXPR;
2566 break;
2567 case CHARS2 ('r', 's'): // operator >>
2568 opcode = RSHIFT_EXPR;
2569 break;
2570 case CHARS2 ('l', 'S'): // operator <<=
2571 opcode = LSHIFT_EXPR;
2572 assop = true;
2573 break;
2574 case CHARS2 ('r', 'S'): // operator >>=
2575 opcode = RSHIFT_EXPR;
2576 assop = true;
2577 break;
2578 case CHARS2 ('e', 'q'): // operator ==
2579 opcode = EQ_EXPR;
2580 break;
2581 case CHARS2 ('n', 'e'): // operator !=
2582 opcode = NE_EXPR;
2583 break;
2584 case CHARS2 ('l', 't'): // operator <
2585 opcode = LT_EXPR;
2586 break;
2587 case CHARS2 ('g', 't'): // operator >
2588 opcode = GT_EXPR;
2589 break;
2590 case CHARS2 ('l', 'e'): // operator <=
2591 opcode = LE_EXPR;
2592 break;
2593 case CHARS2 ('g', 'e'): // operator >=
2594 opcode = GE_EXPR;
2595 break;
2596 case CHARS2 ('n', 't'): // operator !
2597 opcode = TRUTH_NOT_EXPR;
2598 break;
2599 case CHARS2 ('a', 'a'): // operator &&
2600 opcode = TRUTH_ANDIF_EXPR;
2601 break;
2602 case CHARS2 ('o', 'o'): // operator ||
2603 opcode = TRUTH_ORIF_EXPR;
2604 break;
2605 case CHARS2 ('p', 'p'): // operator ++
2606 opcode = POSTINCREMENT_EXPR;
2607 break;
2608 case CHARS2 ('m', 'm'): // operator --
2609 opcode = PREDECREMENT_EXPR;
2610 break;
2611 case CHARS2 ('c', 'm'): // operator ,
2612 opcode = COMPOUND_EXPR;
2613 break;
2614 case CHARS2 ('p', 'm'): // operator ->*
2615 opcode = MEMBER_REF;
2616 break;
2617 case CHARS2 ('p', 't'): // operator ->
2618 opcode = COMPONENT_REF;
2619 break;
2620 case CHARS2 ('c', 'l'): // operator ()
2621 opcode = CALL_EXPR;
2622 break;
2623 case CHARS2 ('i', 'x'): // operator []
2624 opcode = ARRAY_REF;
2625 break;
2626 case CHARS2 ('c', 'v'): // operator <T> (conversion operator)
2627 convop = true;
2628 identifier = mangle_conv_op_name_for_type (conv_type);
2629 break;
2630 // C++11-only:
2631 case CHARS2 ('l', 'i'): // operator "" <id>
2633 char *id = (char *)name + 2;
2634 bool freeid = false;
2635 if (*id >= '0' && *id <= '9')
2637 unsigned len = 0;
2640 len *= 10;
2641 len += id[0] - '0';
2642 id++;
2644 while (*id && *id >= '0' && *id <= '9');
2645 id = xstrndup (id, len);
2646 freeid = true;
2648 identifier = cp_literal_operator_id (id);
2649 if (freeid)
2650 free (id);
2652 break;
2653 case CHARS2 ('q', 'u'): // ternary operator, not overloadable.
2654 default:
2655 gcc_unreachable ();
2658 gcc_assert (convop || !conv_type);
2660 if (opcode != ERROR_MARK)
2662 if (assop)
2663 identifier = cp_assignment_operator_id (opcode);
2664 else
2665 identifier = cp_operator_id (opcode);
2668 gcc_assert (identifier);
2670 else
2672 gcc_assert (flags == GCC_CP_SYMBOL_MASK);
2673 gcc_assert (!conv_type);
2674 identifier = get_identifier (name);
2676 tree res = identifier;
2677 if (!scope)
2678 res = lookup_name_real (res, 0, 0, true, 0, 0);
2679 else if (!TYPE_P (scope) || !dependent_scope_p (scope))
2681 res = lookup_qualified_name (scope, res, false, true);
2682 /* We've already resolved the name in the scope, so skip the
2683 build_qualified_name call below. */
2684 scope = NULL;
2686 if (targs)
2687 res = lookup_template_function (res, targlist (targs));
2688 if (scope)
2689 res = build_qualified_name (NULL_TREE, scope, res, !!targs);
2690 return convert_out (ctx->preserve (res));
2693 gcc_expr
2694 plugin_build_literal_expr (cc1_plugin::connection *self,
2695 gcc_type type, unsigned long value)
2697 plugin_context *ctx = static_cast<plugin_context *> (self);
2698 tree t = convert_in (type);
2699 tree val = build_int_cst_type (t, (unsigned HOST_WIDE_INT) value);
2700 return convert_out (ctx->preserve (val));
2703 gcc_expr
2704 plugin_build_decl_expr (cc1_plugin::connection *self,
2705 gcc_decl decl_in,
2706 int qualified_p)
2708 plugin_context *ctx = static_cast<plugin_context *> (self);
2709 tree decl = convert_in (decl_in);
2710 gcc_assert (DECL_P (decl));
2711 tree result = decl;
2712 if (qualified_p)
2714 gcc_assert (DECL_CLASS_SCOPE_P (decl));
2715 result = build_offset_ref (DECL_CONTEXT (decl), decl,
2716 /*address_p=*/true, tf_error);
2718 return convert_out (ctx->preserve (result));
2721 gcc_expr
2722 plugin_build_unary_expr (cc1_plugin::connection *self,
2723 const char *unary_op,
2724 gcc_expr operand)
2726 plugin_context *ctx = static_cast<plugin_context *> (self);
2727 tree op0 = convert_in (operand);
2728 tree_code opcode = ERROR_MARK;
2729 bool global_scope_p = false;
2731 once_more:
2732 switch (CHARS2 (unary_op[0], unary_op[1]))
2734 case CHARS2 ('p', 's'): // operator + (unary)
2735 opcode = UNARY_PLUS_EXPR;
2736 break;
2737 case CHARS2 ('n', 'g'): // operator - (unary)
2738 opcode = NEGATE_EXPR;
2739 break;
2740 case CHARS2 ('a', 'd'): // operator & (unary)
2741 opcode = ADDR_EXPR;
2742 break;
2743 case CHARS2 ('d', 'e'): // operator * (unary)
2744 opcode = INDIRECT_REF;
2745 break;
2746 case CHARS2 ('c', 'o'): // operator ~
2747 opcode = BIT_NOT_EXPR;
2748 break;
2749 case CHARS2 ('n', 't'): // operator !
2750 opcode = TRUTH_NOT_EXPR;
2751 break;
2752 case CHARS2 ('p', 'p'): // operator ++
2753 opcode = unary_op[2] == '_' ? PREINCREMENT_EXPR : POSTINCREMENT_EXPR;
2754 break;
2755 case CHARS2 ('m', 'm'): // operator --
2756 opcode = unary_op[2] == '_' ? PREDECREMENT_EXPR : POSTDECREMENT_EXPR;
2757 break;
2758 case CHARS2 ('n', 'x'): // noexcept
2759 opcode = NOEXCEPT_EXPR;
2760 break;
2761 case CHARS2 ('t', 'w'): // throw
2762 gcc_assert (op0);
2763 opcode = THROW_EXPR;
2764 break;
2765 case CHARS2 ('t', 'r'): // rethrow
2766 gcc_assert (!op0);
2767 opcode = THROW_EXPR;
2768 break;
2769 case CHARS2 ('t', 'e'): // typeid (value)
2770 opcode = TYPEID_EXPR;
2771 break;
2772 case CHARS2 ('s', 'z'): // sizeof (value)
2773 opcode = SIZEOF_EXPR;
2774 break;
2775 case CHARS2 ('a', 'z'): // alignof (value)
2776 opcode = ALIGNOF_EXPR;
2777 break;
2778 case CHARS2 ('g', 's'): // global scope (for delete, delete[])
2779 gcc_assert (!global_scope_p);
2780 global_scope_p = true;
2781 unary_op += 2;
2782 goto once_more;
2783 case CHARS2 ('d', 'l'): // delete
2784 opcode = DELETE_EXPR;
2785 break;
2786 case CHARS2 ('d', 'a'): // delete[]
2787 opcode = VEC_DELETE_EXPR;
2788 break;
2789 case CHARS2 ('s', 'p'): // pack...
2790 opcode = EXPR_PACK_EXPANSION;
2791 break;
2792 case CHARS2 ('s', 'Z'): // sizeof...(pack)
2793 opcode = TYPE_PACK_EXPANSION; // Not really, but let's use its code.
2794 break;
2796 /* FIXME: __real__, __imag__? */
2798 default:
2799 gcc_unreachable ();
2802 gcc_assert (!global_scope_p
2803 || opcode == DELETE_EXPR || opcode == VEC_DELETE_EXPR);
2805 processing_template_decl++;
2806 bool template_dependent_p = op0
2807 && (type_dependent_expression_p (op0)
2808 || value_dependent_expression_p (op0));
2809 if (!template_dependent_p)
2810 processing_template_decl--;
2812 tree result;
2814 gcc_assert (op0 || opcode == THROW_EXPR);
2816 switch (opcode)
2818 case NOEXCEPT_EXPR:
2819 result = finish_noexcept_expr (op0, tf_error);
2820 break;
2822 case THROW_EXPR:
2823 result = build_throw (op0);
2824 break;
2826 case TYPEID_EXPR:
2827 result = build_typeid (op0, tf_error);
2828 break;
2830 case SIZEOF_EXPR:
2831 case ALIGNOF_EXPR:
2832 result = cxx_sizeof_or_alignof_expr (op0, opcode, true);
2833 break;
2835 case DELETE_EXPR:
2836 case VEC_DELETE_EXPR:
2837 result = delete_sanity (op0, NULL_TREE, opcode == VEC_DELETE_EXPR,
2838 global_scope_p, tf_error);
2839 break;
2841 case EXPR_PACK_EXPANSION:
2842 result = make_pack_expansion (op0);
2843 break;
2845 // We're using this for sizeof...(pack). */
2846 case TYPE_PACK_EXPANSION:
2847 result = make_pack_expansion (op0);
2848 PACK_EXPANSION_SIZEOF_P (result) = true;
2849 break;
2851 default:
2852 result = build_x_unary_op (/*loc=*/0, opcode, op0, tf_error);
2853 break;
2856 if (template_dependent_p)
2857 processing_template_decl--;
2859 return convert_out (ctx->preserve (result));
2862 gcc_expr
2863 plugin_build_binary_expr (cc1_plugin::connection *self,
2864 const char *binary_op,
2865 gcc_expr operand1,
2866 gcc_expr operand2)
2868 plugin_context *ctx = static_cast<plugin_context *> (self);
2869 tree op0 = convert_in (operand1);
2870 tree op1 = convert_in (operand2);
2871 tree_code opcode = ERROR_MARK;
2873 switch (CHARS2 (binary_op[0], binary_op[1]))
2875 case CHARS2 ('p', 'l'): // operator +
2876 opcode = PLUS_EXPR;
2877 break;
2878 case CHARS2 ('m', 'i'): // operator -
2879 opcode = MINUS_EXPR;
2880 break;
2881 case CHARS2 ('m', 'l'): // operator *
2882 opcode = MULT_EXPR;
2883 break;
2884 case CHARS2 ('d', 'v'): // operator /
2885 opcode = TRUNC_DIV_EXPR;
2886 break;
2887 case CHARS2 ('r', 'm'): // operator %
2888 opcode = TRUNC_MOD_EXPR;
2889 break;
2890 case CHARS2 ('a', 'n'): // operator &
2891 opcode = BIT_AND_EXPR;
2892 break;
2893 case CHARS2 ('o', 'r'): // operator |
2894 opcode = BIT_IOR_EXPR;
2895 break;
2896 case CHARS2 ('e', 'o'): // operator ^
2897 opcode = BIT_XOR_EXPR;
2898 break;
2899 case CHARS2 ('l', 's'): // operator <<
2900 opcode = LSHIFT_EXPR;
2901 break;
2902 case CHARS2 ('r', 's'): // operator >>
2903 opcode = RSHIFT_EXPR;
2904 break;
2905 case CHARS2 ('e', 'q'): // operator ==
2906 opcode = EQ_EXPR;
2907 break;
2908 case CHARS2 ('n', 'e'): // operator !=
2909 opcode = NE_EXPR;
2910 break;
2911 case CHARS2 ('l', 't'): // operator <
2912 opcode = LT_EXPR;
2913 break;
2914 case CHARS2 ('g', 't'): // operator >
2915 opcode = GT_EXPR;
2916 break;
2917 case CHARS2 ('l', 'e'): // operator <=
2918 opcode = LE_EXPR;
2919 break;
2920 case CHARS2 ('g', 'e'): // operator >=
2921 opcode = GE_EXPR;
2922 break;
2923 case CHARS2 ('a', 'a'): // operator &&
2924 opcode = TRUTH_ANDIF_EXPR;
2925 break;
2926 case CHARS2 ('o', 'o'): // operator ||
2927 opcode = TRUTH_ORIF_EXPR;
2928 break;
2929 case CHARS2 ('c', 'm'): // operator ,
2930 opcode = COMPOUND_EXPR;
2931 break;
2932 case CHARS2 ('p', 'm'): // operator ->*
2933 opcode = MEMBER_REF;
2934 break;
2935 case CHARS2 ('p', 't'): // operator ->
2936 opcode = INDIRECT_REF; // Not really! This will stand for
2937 // INDIRECT_REF followed by COMPONENT_REF
2938 // later on.
2939 break;
2940 case CHARS2 ('i', 'x'): // operator []
2941 opcode = ARRAY_REF;
2942 break;
2943 case CHARS2 ('d', 's'): // operator .*
2944 opcode = DOTSTAR_EXPR;
2945 break;
2946 case CHARS2 ('d', 't'): // operator .
2947 opcode = COMPONENT_REF;
2948 break;
2950 default:
2951 gcc_unreachable ();
2954 processing_template_decl++;
2955 bool template_dependent_p = type_dependent_expression_p (op0)
2956 || value_dependent_expression_p (op0)
2957 || type_dependent_expression_p (op1)
2958 || value_dependent_expression_p (op1);
2959 if (!template_dependent_p)
2960 processing_template_decl--;
2962 tree result;
2964 switch (opcode)
2966 case INDIRECT_REF: // This is actually a "->".
2967 op0 = build_x_arrow (/*loc=*/0, op0, tf_error);
2968 /* Fall through. */
2969 case COMPONENT_REF:
2970 result = finish_class_member_access_expr (op0, op1,
2971 /*template_p=*/false,
2972 tf_error);
2973 break;
2975 default:
2976 result = build_x_binary_op (/*loc=*/0, opcode, op0, ERROR_MARK,
2977 op1, ERROR_MARK, NULL, tf_error);
2978 break;
2981 if (template_dependent_p)
2982 processing_template_decl--;
2984 return convert_out (ctx->preserve (result));
2987 gcc_expr
2988 plugin_build_ternary_expr (cc1_plugin::connection *self,
2989 const char *ternary_op,
2990 gcc_expr operand1,
2991 gcc_expr operand2,
2992 gcc_expr operand3)
2994 plugin_context *ctx = static_cast<plugin_context *> (self);
2995 tree op0 = convert_in (operand1);
2996 tree op1 = convert_in (operand2);
2997 tree op2 = convert_in (operand3);
2998 gcc_assert (CHARS2 (ternary_op[0], ternary_op[1])
2999 == CHARS2 ('q', 'u')); // ternary operator
3001 processing_template_decl++;
3002 bool template_dependent_p = type_dependent_expression_p (op0)
3003 || value_dependent_expression_p (op0)
3004 || type_dependent_expression_p (op1)
3005 || value_dependent_expression_p (op1)
3006 || type_dependent_expression_p (op2)
3007 || value_dependent_expression_p (op2);
3008 if (!template_dependent_p)
3009 processing_template_decl--;
3011 tree val = build_x_conditional_expr (/*loc=*/0, op0, op1, op2, tf_error);
3013 if (template_dependent_p)
3014 processing_template_decl--;
3016 return convert_out (ctx->preserve (val));
3019 gcc_expr
3020 plugin_build_unary_type_expr (cc1_plugin::connection *self,
3021 const char *unary_op,
3022 gcc_type operand)
3024 plugin_context *ctx = static_cast<plugin_context *> (self);
3025 tree type = convert_in (operand);
3026 tree_code opcode = ERROR_MARK;
3028 switch (CHARS2 (unary_op[0], unary_op[1]))
3030 case CHARS2 ('t', 'i'): // typeid (type)
3031 opcode = TYPEID_EXPR;
3032 break;
3034 case CHARS2 ('s', 't'): // sizeof (type)
3035 opcode = SIZEOF_EXPR;
3036 break;
3037 case CHARS2 ('a', 't'): // alignof (type)
3038 opcode = ALIGNOF_EXPR;
3039 break;
3041 case CHARS2 ('s', 'Z'): // sizeof...(pack)
3042 opcode = TYPE_PACK_EXPANSION; // Not really, but let's use its code.
3043 break;
3045 // FIXME: do we have to handle "sp", for the size of a captured
3046 // template parameter pack from an alias template, taking
3047 // multiple template arguments?
3049 default:
3050 gcc_unreachable ();
3053 processing_template_decl++;
3054 bool template_dependent_p = dependent_type_p (type);
3055 if (!template_dependent_p)
3056 processing_template_decl--;
3058 tree result;
3060 switch (opcode)
3062 case TYPEID_EXPR:
3063 result = get_typeid (type, tf_error);
3064 break;
3066 // We're using this for sizeof...(pack). */
3067 case TYPE_PACK_EXPANSION:
3068 result = make_pack_expansion (type);
3069 PACK_EXPANSION_SIZEOF_P (result) = true;
3070 break;
3072 default:
3073 result = cxx_sizeof_or_alignof_type (type, opcode, true);
3076 if (template_dependent_p)
3077 processing_template_decl--;
3079 return convert_out (ctx->preserve (result));
3082 gcc_expr
3083 plugin_build_cast_expr (cc1_plugin::connection *self,
3084 const char *binary_op,
3085 gcc_type operand1,
3086 gcc_expr operand2)
3088 plugin_context *ctx = static_cast<plugin_context *> (self);
3089 tree (*build_cast)(tree type, tree expr, tsubst_flags_t complain) = NULL;
3090 tree type = convert_in (operand1);
3091 tree expr = convert_in (operand2);
3093 switch (CHARS2 (binary_op[0], binary_op[1]))
3095 case CHARS2 ('d', 'c'): // dynamic_cast
3096 build_cast = build_dynamic_cast;
3097 break;
3099 case CHARS2 ('s', 'c'): // static_cast
3100 build_cast = build_static_cast;
3101 break;
3103 case CHARS2 ('c', 'c'): // const_cast
3104 build_cast = build_const_cast;
3105 break;
3107 case CHARS2 ('r', 'c'): // reinterpret_cast
3108 build_cast = build_reinterpret_cast;
3109 break;
3111 case CHARS2 ('c', 'v'): // C cast, conversion with one argument
3112 build_cast = cp_build_c_cast;
3113 break;
3115 default:
3116 gcc_unreachable ();
3119 processing_template_decl++;
3120 bool template_dependent_p = dependent_type_p (type)
3121 || type_dependent_expression_p (expr)
3122 || value_dependent_expression_p (expr);
3123 if (!template_dependent_p)
3124 processing_template_decl--;
3126 tree val = build_cast (type, expr, tf_error);
3128 if (template_dependent_p)
3129 processing_template_decl--;
3131 return convert_out (ctx->preserve (val));
3134 static inline vec<tree, va_gc> *
3135 args_to_tree_vec (const struct gcc_cp_function_args *args_in)
3137 vec<tree, va_gc> *args = make_tree_vector ();
3138 for (int i = 0; i < args_in->n_elements; i++)
3139 vec_safe_push (args, convert_in (args_in->elements[i]));
3140 return args;
3143 static inline tree
3144 args_to_tree_list (const struct gcc_cp_function_args *args_in)
3146 tree args, *tail = &args;
3147 for (int i = 0; i < args_in->n_elements; i++)
3149 *tail = build_tree_list (NULL, convert_in (args_in->elements[i]));
3150 tail = &TREE_CHAIN (*tail);
3152 return args;
3155 static inline vec<constructor_elt, va_gc> *
3156 args_to_ctor_elts (const struct gcc_cp_function_args *args_in)
3158 vec<constructor_elt, va_gc> *args = NULL;
3159 for (int i = 0; i < args_in->n_elements; i++)
3160 CONSTRUCTOR_APPEND_ELT (args, NULL_TREE, convert_in (args_in->elements[i]));
3161 return args;
3164 gcc_expr
3165 plugin_build_expression_list_expr (cc1_plugin::connection *self,
3166 const char *conv_op,
3167 gcc_type type_in,
3168 const struct gcc_cp_function_args *values_in)
3170 plugin_context *ctx = static_cast<plugin_context *> (self);
3171 tree type = convert_in (type_in);
3172 tree args;
3173 tree result;
3175 switch (CHARS2 (conv_op[0], conv_op[1]))
3177 case CHARS2 ('c', 'v'): // conversion with parenthesized expression list
3178 gcc_assert (TYPE_P (type));
3179 args = args_to_tree_list (values_in);
3180 result = build_functional_cast (type, args, tf_error);
3181 break;
3183 case CHARS2 ('t', 'l'): // conversion with braced expression list
3184 gcc_assert (type);
3185 gcc_assert (TYPE_P (type));
3186 args = make_node (CONSTRUCTOR);
3187 CONSTRUCTOR_ELTS (args) = args_to_ctor_elts (values_in);
3188 CONSTRUCTOR_IS_DIRECT_INIT (args) = 1;
3189 result = finish_compound_literal (type, args, tf_error);
3190 break;
3192 case CHARS2 ('i', 'l'): // untyped braced expression list
3193 gcc_assert (!type);
3194 result = make_node (CONSTRUCTOR);
3195 CONSTRUCTOR_ELTS (result) = args_to_ctor_elts (values_in);
3196 break;
3198 default:
3199 gcc_unreachable ();
3202 return convert_out (ctx->preserve (result));
3205 gcc_expr
3206 plugin_build_new_expr (cc1_plugin::connection *self,
3207 const char *new_op,
3208 const struct gcc_cp_function_args *placement_in,
3209 gcc_type type_in,
3210 const struct gcc_cp_function_args *initializer_in)
3212 plugin_context *ctx = static_cast<plugin_context *> (self);
3213 tree type = convert_in (type_in);
3214 vec<tree, va_gc> *placement = NULL, *initializer = NULL;
3215 bool global_scope_p = false;
3216 tree nelts = NULL;
3218 if (placement_in)
3219 placement = args_to_tree_vec (placement_in);
3220 if (initializer_in)
3221 initializer = args_to_tree_vec (initializer_in);
3223 gcc_assert (TYPE_P (type));
3225 once_more:
3226 switch (CHARS2 (new_op[0], new_op[1]))
3228 case CHARS2 ('g', 's'):
3229 gcc_assert (!global_scope_p);
3230 global_scope_p = true;
3231 new_op += 2;
3232 goto once_more;
3234 case CHARS2 ('n', 'w'): // non-array new
3235 gcc_assert (TREE_CODE (type) != ARRAY_TYPE);
3236 break;
3238 case CHARS2 ('n', 'a'): // array new
3239 gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
3240 gcc_assert (TYPE_DOMAIN (type));
3242 // Compute the length of the outermost array type, then discard it.
3243 tree maxelt = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
3244 tree eltype = TREE_TYPE (maxelt);
3245 tree onecst = integer_one_node;
3247 processing_template_decl++;
3248 bool template_dependent_p = value_dependent_expression_p (maxelt)
3249 || type_dependent_expression_p (maxelt);
3250 if (!template_dependent_p)
3252 processing_template_decl--;
3253 onecst = fold_convert (eltype, onecst);
3256 nelts = fold_build2 (PLUS_EXPR, eltype, nelts, onecst);
3258 if (template_dependent_p)
3259 processing_template_decl--;
3261 type = TREE_TYPE (type);
3263 break;
3265 default:
3266 gcc_unreachable ();
3269 processing_template_decl++;
3270 bool template_dependent_p = dependent_type_p (type)
3271 || value_dependent_expression_p (nelts)
3272 || (placement
3273 && any_type_dependent_arguments_p (placement))
3274 || (initializer
3275 && any_type_dependent_arguments_p (initializer));
3276 if (!template_dependent_p)
3277 processing_template_decl--;
3279 tree result = build_new (&placement, type, nelts, &initializer,
3280 global_scope_p, tf_error);
3282 if (template_dependent_p)
3283 processing_template_decl--;
3285 if (placement != NULL)
3286 release_tree_vector (placement);
3287 if (initializer != NULL)
3288 release_tree_vector (initializer);
3290 return convert_out (ctx->preserve (result));
3293 gcc_expr
3294 plugin_build_call_expr (cc1_plugin::connection *self,
3295 gcc_expr callable_in, int qualified_p,
3296 const struct gcc_cp_function_args *args_in)
3298 plugin_context *ctx = static_cast<plugin_context *> (self);
3299 tree callable = convert_in (callable_in);
3300 tree call_expr;
3302 vec<tree, va_gc> *args = args_to_tree_vec (args_in);
3304 bool koenig_p = false;
3305 if (!qualified_p && !args->is_empty ())
3307 if (identifier_p (callable))
3308 koenig_p = true;
3309 else if (is_overloaded_fn (callable))
3311 tree fn = get_first_fn (callable);
3312 fn = STRIP_TEMPLATE (fn);
3314 if (!DECL_FUNCTION_MEMBER_P (fn)
3315 && !DECL_LOCAL_FUNCTION_P (fn))
3316 koenig_p = true;
3320 if (koenig_p && !any_type_dependent_arguments_p (args))
3321 callable = perform_koenig_lookup (callable, args, tf_none);
3323 if (TREE_CODE (callable) == COMPONENT_REF)
3325 tree object = TREE_OPERAND (callable, 0);
3326 tree memfn = TREE_OPERAND (callable, 1);
3328 if (type_dependent_expression_p (object)
3329 || (!BASELINK_P (memfn) && TREE_CODE (memfn) != FIELD_DECL)
3330 || type_dependent_expression_p (memfn)
3331 || any_type_dependent_arguments_p (args))
3332 call_expr = build_nt_call_vec (callable, args);
3333 else if (BASELINK_P (memfn))
3334 call_expr = build_new_method_call (object, memfn, &args, NULL_TREE,
3335 qualified_p
3336 ? LOOKUP_NORMAL|LOOKUP_NONVIRTUAL
3337 : LOOKUP_NORMAL,
3338 NULL, tf_none);
3339 else
3340 call_expr = finish_call_expr (callable, &args, false, false, tf_none);
3342 else if (TREE_CODE (callable) == OFFSET_REF
3343 || TREE_CODE (callable) == MEMBER_REF
3344 || TREE_CODE (callable) == DOTSTAR_EXPR)
3345 call_expr = build_offset_ref_call_from_tree (callable, &args, tf_none);
3346 else
3347 call_expr = finish_call_expr (callable, &args,
3348 !!qualified_p, koenig_p, tf_none);
3350 release_tree_vector (args);
3351 return convert_out (ctx->preserve (call_expr));
3354 gcc_type
3355 plugin_get_expr_type (cc1_plugin::connection *self,
3356 gcc_expr operand)
3358 plugin_context *ctx = static_cast<plugin_context *> (self);
3359 tree op0 = convert_in (operand);
3360 tree type;
3361 if (op0)
3362 type = TREE_TYPE (op0);
3363 else
3365 type = make_decltype_auto ();
3366 AUTO_IS_DECLTYPE (type) = true;
3368 return convert_out (ctx->preserve (type));
3371 gcc_decl
3372 plugin_build_function_template_specialization (cc1_plugin::connection *self,
3373 gcc_decl template_decl,
3374 const gcc_cp_template_args *targs,
3375 gcc_address address,
3376 const char *filename,
3377 unsigned int line_number)
3379 plugin_context *ctx = static_cast<plugin_context *> (self);
3380 source_location loc = ctx->get_source_location (filename, line_number);
3381 tree name = convert_in (template_decl);
3382 tree targsl = targlist (targs);
3384 tree decl = tsubst (name, targsl, tf_error, NULL_TREE);
3385 DECL_SOURCE_LOCATION (decl) = loc;
3387 record_decl_address (ctx, build_decl_addr_value (decl, address));
3389 return convert_out (ctx->preserve (decl));
3392 gcc_decl
3393 plugin_build_class_template_specialization (cc1_plugin::connection *self,
3394 gcc_decl template_decl,
3395 const gcc_cp_template_args *args,
3396 const char *filename,
3397 unsigned int line_number)
3399 plugin_context *ctx = static_cast<plugin_context *> (self);
3400 source_location loc = ctx->get_source_location (filename, line_number);
3401 tree name = convert_in (template_decl);
3403 tree tdecl = finish_template_type (name, targlist (args), false);;
3404 DECL_SOURCE_LOCATION (tdecl) = loc;
3406 return convert_out (ctx->preserve (tdecl));
3409 /* Return a builtin type associated with BUILTIN_NAME. */
3411 static tree
3412 safe_lookup_builtin_type (const char *builtin_name)
3414 tree result = NULL_TREE;
3416 if (!builtin_name)
3417 return result;
3419 result = identifier_global_value (get_identifier (builtin_name));
3421 if (!result)
3422 return result;
3424 gcc_assert (TREE_CODE (result) == TYPE_DECL);
3425 result = TREE_TYPE (result);
3426 return result;
3429 gcc_type
3430 plugin_get_int_type (cc1_plugin::connection *self,
3431 int is_unsigned, unsigned long size_in_bytes,
3432 const char *builtin_name)
3434 tree result;
3436 if (builtin_name)
3438 result = safe_lookup_builtin_type (builtin_name);
3439 gcc_assert (!result || TREE_CODE (result) == INTEGER_TYPE);
3441 else
3442 result = c_common_type_for_size (BITS_PER_UNIT * size_in_bytes,
3443 is_unsigned);
3445 if (result == NULL_TREE)
3446 result = error_mark_node;
3447 else
3449 gcc_assert (!TYPE_UNSIGNED (result) == !is_unsigned);
3450 gcc_assert (TREE_CODE (TYPE_SIZE (result)) == INTEGER_CST);
3451 gcc_assert (TYPE_PRECISION (result) == BITS_PER_UNIT * size_in_bytes);
3453 plugin_context *ctx = static_cast<plugin_context *> (self);
3454 ctx->preserve (result);
3456 return convert_out (result);
3459 gcc_type
3460 plugin_get_char_type (cc1_plugin::connection *)
3462 return convert_out (char_type_node);
3465 gcc_type
3466 plugin_get_float_type (cc1_plugin::connection *,
3467 unsigned long size_in_bytes,
3468 const char *builtin_name)
3470 if (builtin_name)
3472 tree result = safe_lookup_builtin_type (builtin_name);
3474 if (!result)
3475 return convert_out (error_mark_node);
3477 gcc_assert (TREE_CODE (result) == REAL_TYPE);
3478 gcc_assert (BITS_PER_UNIT * size_in_bytes == TYPE_PRECISION (result));
3480 return convert_out (result);
3483 if (BITS_PER_UNIT * size_in_bytes == TYPE_PRECISION (float_type_node))
3484 return convert_out (float_type_node);
3485 if (BITS_PER_UNIT * size_in_bytes == TYPE_PRECISION (double_type_node))
3486 return convert_out (double_type_node);
3487 if (BITS_PER_UNIT * size_in_bytes == TYPE_PRECISION (long_double_type_node))
3488 return convert_out (long_double_type_node);
3489 return convert_out (error_mark_node);
3492 gcc_type
3493 plugin_get_void_type (cc1_plugin::connection *)
3495 return convert_out (void_type_node);
3498 gcc_type
3499 plugin_get_bool_type (cc1_plugin::connection *)
3501 return convert_out (boolean_type_node);
3504 gcc_type
3505 plugin_get_nullptr_type (cc1_plugin::connection *)
3507 return convert_out (nullptr_type_node);
3510 gcc_expr
3511 plugin_get_nullptr_constant (cc1_plugin::connection *)
3513 return convert_out (nullptr_node);
3516 gcc_type
3517 plugin_build_array_type (cc1_plugin::connection *self,
3518 gcc_type element_type_in, int num_elements)
3520 tree element_type = convert_in (element_type_in);
3521 tree result;
3523 if (num_elements == -1)
3524 result = build_array_type (element_type, NULL_TREE);
3525 else
3526 result = build_array_type_nelts (element_type, num_elements);
3528 plugin_context *ctx = static_cast<plugin_context *> (self);
3529 return convert_out (ctx->preserve (result));
3532 gcc_type
3533 plugin_build_dependent_array_type (cc1_plugin::connection *self,
3534 gcc_type element_type_in,
3535 gcc_expr num_elements_in)
3537 plugin_context *ctx = static_cast<plugin_context *> (self);
3538 tree element_type = convert_in (element_type_in);
3539 tree size = convert_in (num_elements_in);
3540 tree name = get_identifier ("dependent array type");
3542 processing_template_decl++;
3543 bool template_dependent_p = dependent_type_p (element_type)
3544 || type_dependent_expression_p (size)
3545 || value_dependent_expression_p (size);
3546 if (!template_dependent_p)
3547 processing_template_decl--;
3549 tree itype = compute_array_index_type (name, size, tf_error);
3550 tree type = build_cplus_array_type (element_type, itype);
3552 if (template_dependent_p)
3553 processing_template_decl--;
3555 return convert_out (ctx->preserve (type));
3558 gcc_type
3559 plugin_build_vla_array_type (cc1_plugin::connection *self,
3560 gcc_type element_type_in,
3561 const char *upper_bound_name)
3563 tree element_type = convert_in (element_type_in);
3564 tree upper_bound = lookup_name (get_identifier (upper_bound_name));
3565 tree size = fold_build2 (PLUS_EXPR, TREE_TYPE (upper_bound), upper_bound,
3566 build_one_cst (TREE_TYPE (upper_bound)));
3567 tree range = compute_array_index_type (NULL_TREE, size,
3568 tf_error);
3570 tree result = build_cplus_array_type (element_type, range);
3572 plugin_context *ctx = static_cast<plugin_context *> (self);
3573 return convert_out (ctx->preserve (result));
3576 gcc_type
3577 plugin_build_qualified_type (cc1_plugin::connection *,
3578 gcc_type unqualified_type_in,
3579 enum gcc_cp_qualifiers qualifiers)
3581 tree unqualified_type = convert_in (unqualified_type_in);
3582 cp_cv_quals quals = 0;
3584 if ((qualifiers & GCC_CP_QUALIFIER_CONST) != 0)
3585 quals |= TYPE_QUAL_CONST;
3586 if ((qualifiers & GCC_CP_QUALIFIER_VOLATILE) != 0)
3587 quals |= TYPE_QUAL_VOLATILE;
3588 if ((qualifiers & GCC_CP_QUALIFIER_RESTRICT) != 0)
3589 quals |= TYPE_QUAL_RESTRICT;
3591 gcc_assert ((TREE_CODE (unqualified_type) != METHOD_TYPE
3592 && TREE_CODE (unqualified_type) != REFERENCE_TYPE)
3593 || quals == 0);
3595 return convert_out (build_qualified_type (unqualified_type, quals));
3598 gcc_type
3599 plugin_build_complex_type (cc1_plugin::connection *self,
3600 gcc_type base_type)
3602 plugin_context *ctx = static_cast<plugin_context *> (self);
3603 return convert_out (ctx->preserve (build_complex_type (convert_in (base_type))));
3606 gcc_type
3607 plugin_build_vector_type (cc1_plugin::connection *self,
3608 gcc_type base_type, int nunits)
3610 plugin_context *ctx = static_cast<plugin_context *> (self);
3611 return convert_out (ctx->preserve (build_vector_type (convert_in (base_type),
3612 nunits)));
3616 plugin_build_constant (cc1_plugin::connection *self, gcc_type type_in,
3617 const char *name, unsigned long value,
3618 const char *filename, unsigned int line_number)
3620 plugin_context *ctx = static_cast<plugin_context *> (self);
3621 tree cst, decl;
3622 tree type = convert_in (type_in);
3624 cst = build_int_cst (type, value);
3625 if (!TYPE_READONLY (type))
3626 type = build_qualified_type (type, TYPE_QUAL_CONST);
3627 decl = build_decl (ctx->get_source_location (filename, line_number),
3628 VAR_DECL, get_identifier (name), type);
3629 TREE_STATIC (decl) = 1;
3630 TREE_READONLY (decl) = 1;
3631 cp_finish_decl (decl, cst, true, NULL, LOOKUP_ONLYCONVERTING);
3632 safe_pushdecl_maybe_friend (decl, false);
3634 return 1;
3637 gcc_type
3638 plugin_error (cc1_plugin::connection *,
3639 const char *message)
3641 error ("%s", message);
3642 return convert_out (error_mark_node);
3646 plugin_add_static_assert (cc1_plugin::connection *self,
3647 gcc_expr condition_in,
3648 const char *errormsg,
3649 const char *filename,
3650 unsigned int line_number)
3652 plugin_context *ctx = static_cast<plugin_context *> (self);
3653 tree condition = convert_in (condition_in);
3655 if (!errormsg)
3656 errormsg = "";
3658 tree message = build_string (strlen (errormsg) + 1, errormsg);
3660 TREE_TYPE (message) = char_array_type_node;
3661 fix_string_type (message);
3663 source_location loc = ctx->get_source_location (filename, line_number);
3665 bool member_p = at_class_scope_p ();
3667 finish_static_assert (condition, message, loc, member_p);
3669 return 1;
3674 // Perform GC marking.
3676 static void
3677 gc_mark (void *, void *)
3679 if (current_context != NULL)
3680 current_context->mark ();
3683 #ifdef __GNUC__
3684 #pragma GCC visibility push(default)
3685 #endif
3688 plugin_init (struct plugin_name_args *plugin_info,
3689 struct plugin_gcc_version *)
3691 long fd = -1;
3692 for (int i = 0; i < plugin_info->argc; ++i)
3694 if (strcmp (plugin_info->argv[i].key, "fd") == 0)
3696 char *tail;
3697 errno = 0;
3698 fd = strtol (plugin_info->argv[i].value, &tail, 0);
3699 if (*tail != '\0' || errno != 0)
3700 fatal_error (input_location,
3701 "%s: invalid file descriptor argument to plugin",
3702 plugin_info->base_name);
3703 break;
3706 if (fd == -1)
3707 fatal_error (input_location,
3708 "%s: required plugin argument %<fd%> is missing",
3709 plugin_info->base_name);
3711 current_context = new plugin_context (fd);
3713 // Handshake.
3714 cc1_plugin::protocol_int version;
3715 if (!current_context->require ('H')
3716 || ! ::cc1_plugin::unmarshall (current_context, &version))
3717 fatal_error (input_location,
3718 "%s: handshake failed", plugin_info->base_name);
3719 if (version != GCC_CP_FE_VERSION_0)
3720 fatal_error (input_location,
3721 "%s: unknown version in handshake", plugin_info->base_name);
3723 register_callback (plugin_info->base_name, PLUGIN_PRAGMAS,
3724 plugin_init_extra_pragmas, NULL);
3725 register_callback (plugin_info->base_name, PLUGIN_PRE_GENERICIZE,
3726 rewrite_decls_to_addresses, NULL);
3727 register_callback (plugin_info->base_name, PLUGIN_GGC_MARKING,
3728 gc_mark, NULL);
3730 lang_hooks.print_error_function = plugin_print_error_function;
3732 #define GCC_METHOD0(R, N) \
3734 cc1_plugin::callback_ftype *fun \
3735 = cc1_plugin::callback<R, plugin_ ## N>; \
3736 current_context->add_callback (# N, fun); \
3738 #define GCC_METHOD1(R, N, A) \
3740 cc1_plugin::callback_ftype *fun \
3741 = cc1_plugin::callback<R, A, plugin_ ## N>; \
3742 current_context->add_callback (# N, fun); \
3744 #define GCC_METHOD2(R, N, A, B) \
3746 cc1_plugin::callback_ftype *fun \
3747 = cc1_plugin::callback<R, A, B, plugin_ ## N>; \
3748 current_context->add_callback (# N, fun); \
3750 #define GCC_METHOD3(R, N, A, B, C) \
3752 cc1_plugin::callback_ftype *fun \
3753 = cc1_plugin::callback<R, A, B, C, plugin_ ## N>; \
3754 current_context->add_callback (# N, fun); \
3756 #define GCC_METHOD4(R, N, A, B, C, D) \
3758 cc1_plugin::callback_ftype *fun \
3759 = cc1_plugin::callback<R, A, B, C, D, \
3760 plugin_ ## N>; \
3761 current_context->add_callback (# N, fun); \
3763 #define GCC_METHOD5(R, N, A, B, C, D, E) \
3765 cc1_plugin::callback_ftype *fun \
3766 = cc1_plugin::callback<R, A, B, C, D, E, \
3767 plugin_ ## N>; \
3768 current_context->add_callback (# N, fun); \
3770 #define GCC_METHOD7(R, N, A, B, C, D, E, F, G) \
3772 cc1_plugin::callback_ftype *fun \
3773 = cc1_plugin::callback<R, A, B, C, D, E, F, G, \
3774 plugin_ ## N>; \
3775 current_context->add_callback (# N, fun); \
3778 #include "gcc-cp-fe.def"
3780 #undef GCC_METHOD0
3781 #undef GCC_METHOD1
3782 #undef GCC_METHOD2
3783 #undef GCC_METHOD3
3784 #undef GCC_METHOD4
3785 #undef GCC_METHOD5
3786 #undef GCC_METHOD7
3788 return 0;