| /* Interface between GCC C++ FE and GDB -*- c -*- | |
| Copyright (C) 2014-2026 Free Software Foundation, Inc. | |
| This file is part of GCC. | |
| This program is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 3 of the License, or | |
| (at your option) any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
| /* Push namespace NAME as the current binding level, to which | |
| newly-introduced decls will be bound. An empty string identifies | |
| the global namespace, whereas NULL identifies an anonymous | |
| namespace. A namespace named NAME is created in the current scope, | |
| if needed. | |
| If the newly-created namespace is to be an inline namespace, see | |
| make_namespace_inline. */ | |
| GCC_METHOD1 (int /* bool */, push_namespace, | |
| const char *) /* Argument NAME. */ | |
| /* Push TYPE as the current binding level, making its members visible | |
| for name lookup. The current scope before the call must be the | |
| scope in which the class was declared. This should be used if the | |
| definition of a class is already finished, but one wishes to define | |
| a nested class, or to enter the scope of one of its member | |
| functions. */ | |
| GCC_METHOD1 (int /* bool */, push_class, | |
| gcc_type) /* Argument TYPE. */ | |
| /* Push FUNCTION_DECL as the current (empty) binding level (see | |
| reactivate_decl). The current enclosing scope before the call must | |
| be the scope in which the function was declared. */ | |
| GCC_METHOD1 (int /* bool */, push_function, | |
| gcc_decl) /* Argument FUNCTION_DECL. */ | |
| /* Make DECL visible (again?) within SCOPE. When SCOPE is NULL, it | |
| means the current scope; if it is not NULL, it must name a function | |
| that is currently active, even if not at the top of the binding | |
| chain. | |
| This function can be used to make e.g. a global function or | |
| variable visible in a namespace or local scope (overriding another | |
| enclosing definition of the same name), but its most common | |
| expected use of this primitive, that gives it its name, is to make | |
| declarations visible again after reentering a function scope, | |
| because when a function is entered with push_function, that does | |
| NOT make any of the declarations nested in it visible for name | |
| lookup. | |
| There is a reason/excuse for that: unlike namespaces and classes, | |
| G++ doesn't ever have to reenter function scopes, so its name | |
| resolution infrastructure is not prepared to do that. But wait, | |
| there is also a good use for this apparent limitation: a function | |
| may contain multiple scopes (blocks), and the name may be bound to | |
| different symbols in each of these scopes. With this interface, as | |
| we reenter a function scope, we may choose which symbols to make | |
| visible for the code snippet, or, if there could be template | |
| functions in local scopes, for unresolved names in nested template | |
| class default arguments, or in nested template function signatures. | |
| As for making a local declaration visible for the code snippet, | |
| there are two possibilities: a) introduce it upfront, while | |
| entering the scope for the user expression (see the enter_scope | |
| callback, called by g++ when encountering the push_user_expression | |
| pragma), which might save some scope switching and reactivate_decl | |
| (though this can't be helped if some declarations have to be | |
| introduced and discarded, because of multiple definitions of the | |
| same name in different scopes within a function: they have to be | |
| defined in discriminator order); or b) introduce it when its name | |
| is looked up, entering the scope, introducing the declaration, | |
| leaving the scope, and then reactivating the declaration in its | |
| local scope. | |
| Here's some more detail on how reactivate_decl works. Say there's | |
| a function foo whose body looks like this: | |
| { | |
| { | |
| // point 1 | |
| class c {} o __attribute__ ((__used__)); // c , o | |
| } | |
| struct c { | |
| void f() { | |
| // point 2 | |
| } | |
| } o __attribute__ ((__used__)); // c_0, o_0 | |
| { | |
| class c {} p __attribute__ ((__used__)); // c_1, p | |
| // point 3 | |
| o.f(); | |
| } | |
| } | |
| When we are about to define class c at point 1, we enter the | |
| function foo scope, and since no symbols are visible at point 1, we | |
| proceed to declare class c. We may then define the class right | |
| away, or, if we leave the function scope, and we later wish to | |
| define it, or to define object o, we can reenter the scope and just | |
| use the previously-obtained gcc_decl to define the class, without | |
| having to reactivate the declaration. | |
| Now, if we are to set up the binding context for point 2, we have | |
| to define c_0::f, and in order to do so, we have to declare and | |
| define c_0. Before we can declare c_0, we MUST at least declare c. | |
| As a general rule, before we can declare or define any local name | |
| with a discriminator, we have to at least declare any other | |
| occurrences of the same name in the same enclosing entity with | |
| lower or absent discriminator. | |
| So, we declare c, then we leave the function scope and reenter it | |
| so as to declare c_0 (also with name "c", which is why we have to | |
| leave and reenter the function scope, otherwise we would get an | |
| error because of the duplicate definition; g++ will assign a | |
| discriminator because it still remembers there was an earlier | |
| declaration of c_0 within the function, it's just no longer in | |
| scope), then we can define c_0, including its member function f. | |
| Likewise, if we wish to define o_0, we have to define o first. If | |
| we wish to declare (and maybe then define) c_1, we have to at least | |
| declare (c and then) c_0 first. | |
| Then, as we set up the binding context to compile a code snippet at | |
| point 3, we may choose to activate c_1, o_0 and p upfront, | |
| declaring and discarding c, c_0 and o, and then reentering the | |
| function scope to declare c_1, o_0 and p; or we can wait for oracle | |
| lookups of c, o or p. If c is looked up, and the debugger resolves | |
| c in the scope to c_1, it is expected to enter the function scope | |
| from the top level, declare c, leave it, reenter it, declare c_0, | |
| leave it, reenter it, declare c_1, leave it, and then reactivate | |
| c_1 in the function scope. If c_1 is needed as a complete type, | |
| the definition may be given right after the declaration, or the | |
| scope will have to be reentered in order to define the class. | |
| . If the code snippet is at point 2, we don't need to (re)activate | |
| any declaration: nothing from any local scope is visible. Just | |
| entering the scope of the class containing member function f | |
| reactivates the names of its members, including the class name | |
| itself. */ | |
| GCC_METHOD2 (int /* bool */, reactivate_decl, | |
| gcc_decl, /* Argument DECL. */ | |
| gcc_decl) /* Argument SCOPE. */ | |
| /* Pop the namespace last entered with push_namespace, or class last | |
| entered with push_class, or function last entered with | |
| push_function, restoring the binding level in effect before the | |
| matching push_* call. */ | |
| GCC_METHOD0 (int /* bool */, pop_binding_level) | |
| /* Return the NAMESPACE_DECL, TYPE_DECL or FUNCTION_DECL of the | |
| binding level that would be popped by pop_scope. */ | |
| GCC_METHOD0 (gcc_decl, get_current_binding_level_decl) | |
| /* Make the current binding level an inline namespace. It must be a | |
| namespace to begin with. It is safe to call this more than once | |
| for the same namespace, but after the first call, subsequent ones | |
| will not return a success status. */ | |
| GCC_METHOD0 (int /* bool */, make_namespace_inline) | |
| /* Add USED_NS to the namespaces used by the current binding level. | |
| Use get_current_binding_level_decl to obtain USED_NS's | |
| gcc_decl. */ | |
| GCC_METHOD1 (int /* bool */, add_using_namespace, | |
| gcc_decl) /* Argument USED_NS. */ | |
| /* Introduce a namespace alias declaration, as in: | |
| namespace foo = [... ::] bar; | |
| After this call, namespace TARGET will be visible as ALIAS within | |
| the current namespace. Get the declaration for TARGET by calling | |
| get_current_binding_level_decl after pushing into it. */ | |
| GCC_METHOD2 (int /* bool */, add_namespace_alias, | |
| const char *, /* Argument ALIAS. */ | |
| gcc_decl) /* Argument TARGET. */ | |
| /* Introduce a using declaration, as in: | |
| using foo::bar; | |
| The TARGET decl names the qualifying scope (foo:: above) and the | |
| identifier (bar), but that does not mean that only TARGET will be | |
| brought into the current scope: all bindings of TARGET's identifier | |
| in the qualifying scope will be brought in. | |
| FLAGS should specify GCC_CP_SYMBOL_USING. If the current scope is | |
| a class scope, visibility flags must be supplied. | |
| Even when TARGET is template dependent, we don't need to specify | |
| whether or not it is a typename: the supplied declaration (that | |
| could be a template-dependent type converted to declaration by | |
| get_type_decl) indicates so. */ | |
| GCC_METHOD2 (int /* bool */, add_using_decl, | |
| enum gcc_cp_symbol_kind, /* Argument FLAGS. */ | |
| gcc_decl) /* Argument TARGET. */ | |
| /* Create a new "decl" in GCC, and bind it in the current binding | |
| level. A decl is a declaration, basically a kind of symbol. | |
| NAME is the name of the new symbol. SYM_KIND is the kind of | |
| symbol being requested. SYM_TYPE is the new symbol's C++ type; | |
| except for labels, where this is not meaningful and should be | |
| zero. If SUBSTITUTION_NAME is not NULL, then a reference to this | |
| decl in the source will later be substituted with a dereference | |
| of a variable of the given name. Otherwise, for symbols having | |
| an address (e.g., functions), ADDRESS is the address. FILENAME | |
| and LINE_NUMBER refer to the symbol's source location. If this | |
| is not known, FILENAME can be NULL and LINE_NUMBER can be 0. | |
| This function returns the new decl. | |
| Use this function to register typedefs, functions and variables to | |
| namespace and local binding levels, and typedefs, member functions | |
| (static or not), and static data members to class binding levels. | |
| Class members must have their access controls specified with | |
| GCC_CP_ACCESS_* flags in SYM_KIND. | |
| Note that, since access controls are disabled, we have no means to | |
| express private, protected and public. | |
| There are various flags that can be set in SYM_KIND to specify | |
| additional semantics. Look for GCC_CP_FLAGs in the definition of | |
| enum gcc_cp_symbol_kind in gcc-cp-interface.h. | |
| In order to define member functions, pass GCC_CP_SYMBOL_FUNCTION in | |
| SYM_KIND, and a function_type for static member functions or a | |
| method type for non-static member functions, including constructors | |
| and destructors. Use build_function_type to create a function | |
| type; for a method type, start by creating a function type without | |
| any compiler-introduced artificial arguments (the implicit this | |
| pointer, and the __in_chrg added to constructors and destructors, | |
| and __vtt_parm added to the former), and then use build_method_type | |
| to create the method type out of the class type and the function | |
| type. | |
| For operator functions, set GCC_CP_FLAG_SPECIAL_FUNCTION in | |
| SYM_KIND, in addition to any other applicable flags, and pass as | |
| NAME a string starting with the two-character mangling for operator | |
| name: "ps" for unary plus, "mL" for multiply and assign, *=; etc. | |
| Use "cv" for type conversion operators (the target type portion | |
| may be omitted, as it is taken from the return type in SYM_TYPE). | |
| For operator"", use "li" followed by the identifier (the mangled | |
| name mandates digits specifying the length of the identifier; if | |
| present, they determine the end of the identifier, otherwise, the | |
| identifier extents to the end of the string, so that "li3_Kme" and | |
| "li_Km" are equivalent). | |
| Constructors and destructors need special care, because for each | |
| constructor and destructor there may be multiple clones defined | |
| internally by the compiler. With build_decl, you can introduce the | |
| base declaration of a constructor or a destructor, setting | |
| GCC_CP_FLAG_SPECIAL_FUNCTION the flag and using names starting with | |
| capital "C" or "D", respectively, followed by a digit (see below), | |
| a blank, or NUL ('\0'). DO NOT supply an ADDRESS or a | |
| SUBSTITUTION_NAME to build_decl, it would be meaningless (and | |
| rejected) for the base declaration; use define_cdtor_clone to | |
| introduce the address of each clone. For constructor templates, | |
| declare the template with build_decl, and then, for each | |
| specialization, introduce it with | |
| build_function_template_specialization, and then define the | |
| addresses of each of its clones with define_cdtor_clone. | |
| NAMEs for GCC_CP_FLAG_SPECIAL_FUNCTION: | |
| NAME meaning | |
| C? constructor base declaration (? may be 1, 2, 4, blank or NUL) | |
| D? destructor base declaration (? may be 0, 1, 2, 4, blank or NUL) | |
| nw operator new | |
| na operator new[] | |
| dl operator delete | |
| da operator delete[] | |
| ps operator + (unary) | |
| ng operator - (unary) | |
| ad operator & (unary) | |
| de operator * (unary) | |
| co operator ~ | |
| pl operator + | |
| mi operator - | |
| ml operator * | |
| dv operator / | |
| rm operator % | |
| an operator & | |
| or operator | | |
| eo operator ^ | |
| aS operator = | |
| pL operator += | |
| mI operator -= | |
| mL operator *= | |
| dV operator /= | |
| rM operator %= | |
| aN operator &= | |
| oR operator |= | |
| eO operator ^= | |
| ls operator << | |
| rs operator >> | |
| lS operator <<= | |
| rS operator >>= | |
| eq operator == | |
| ne operator != | |
| lt operator < | |
| gt operator > | |
| le operator <= | |
| ge operator >= | |
| nt operator ! | |
| aa operator && | |
| oo operator || | |
| pp operator ++ | |
| mm operator -- | |
| cm operator , | |
| pm operator ->* | |
| pt operator -> | |
| cl operator () | |
| ix operator [] | |
| qu operator ? | |
| cv operator <T> (conversion operator) | |
| li<id> operator "" <id> | |
| FIXME: How about attributes? */ | |
| GCC_METHOD7 (gcc_decl, build_decl, | |
| const char *, /* Argument NAME. */ | |
| enum gcc_cp_symbol_kind, /* Argument SYM_KIND. */ | |
| gcc_type, /* Argument SYM_TYPE. */ | |
| const char *, /* Argument SUBSTITUTION_NAME. */ | |
| gcc_address, /* Argument ADDRESS. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Supply the ADDRESS of one of the multiple clones of constructor or | |
| destructor CDTOR. The clone is specified by NAME, using the | |
| following name mangling conventions: | |
| C1 in-charge constructor | |
| C2 not-in-charge constructor | |
| C4 unified constructor | |
| D0 deleting destructor | |
| D1 in-charge destructor | |
| D2 not-in-charge destructor | |
| D4 unified destructor | |
| The following information is not necessary to use the API. | |
| C1 initializes an instance of the class (rather than of derived | |
| classes), including virtual base classes, whereas C2 initializes a | |
| sub-object (of the given class type) of an instance of some derived | |
| class (or a full object that doesn't have any virtual base | |
| classes). | |
| D0 and D1 destruct an instance of the class, including virtual base | |
| classes, but only the former calls operator delete to release the | |
| object's storage at the end; D2 destructs a sub-object (of the | |
| given class type) of an instance of a derived class (or a full | |
| object that doesn't have any virtual base classes). | |
| The [CD]4 manglings (and symbol definitions) are non-standard, but | |
| GCC uses them in some cases: rather than assuming they are | |
| in-charge or not-in-charge, they test the implicit argument that | |
| the others ignore to tell how to behave. These are used instead of | |
| cloning when we just can't use aliases. */ | |
| GCC_METHOD3 (gcc_decl, define_cdtor_clone, | |
| const char *, /* Argument NAME. */ | |
| gcc_decl, /* Argument CDTOR. */ | |
| gcc_address) /* Argument ADDRESS. */ | |
| /* Return the type associated with the given declaration. This is | |
| most useful to obtain the type associated with a forward-declared | |
| class, because it is the gcc_type, rather than the gcc_decl, that | |
| has to be used to build other types, but build_decl returns a | |
| gcc_decl rather than a gcc_type. This call can in theory be used | |
| to obtain the type from any other declaration; it is supposed to | |
| return the same type that was supplied when the declaration was | |
| created. */ | |
| GCC_METHOD1 (gcc_type, get_decl_type, | |
| gcc_decl) /* Argument DECL. */ | |
| /* Return the declaration for a type. */ | |
| GCC_METHOD1 (gcc_decl, get_type_decl, | |
| gcc_type) /* Argument TYPE. */ | |
| /* Declare DECL as a friend of the current class scope, if TYPE is | |
| NULL, or of TYPE itself otherwise. DECL may be a function or a | |
| class, be they template generics, template specializations or not | |
| templates. TYPE must be a class type (not a template generic). | |
| The add_friend call cannot introduce a declaration; even if the | |
| friend is first declared as a friend in the source code, the | |
| declaration belongs in the enclosing namespace, so it must be | |
| introduced in that namespace, and the resulting declaration can | |
| then be made a friend. | |
| DECL cannot, however, be a member of a template class generic, | |
| because we have no means to introduce their declarations. This | |
| interface has no notion of definitions for template generics. As a | |
| consequence, users of this interface must introduce each friend | |
| template member specialization separately, i.e., instead of: | |
| template <typename T> friend struct X<T>::M; | |
| they must be declared as if they were: | |
| friend struct X<onetype>::M; | |
| friend struct X<anothertype>::M; | |
| ... for each specialization of X. | |
| Specializations of a template can have each others' members as | |
| friends: | |
| template <typename T> class foo { | |
| int f(); | |
| template <typename U> friend int foo<U>::f(); | |
| }; | |
| It wouldn't always be possible to define all specializations of a | |
| template class before introducing the friend declarations in their | |
| expanded, per-specialization form. | |
| In order to simplify such friend declarations, and to enable | |
| incremental friend declarations as template specializations are | |
| introduced, add_friend can be called after the befriending class is | |
| fully defined, passing it a non-NULL TYPE argument naming the | |
| befriending class type. */ | |
| GCC_METHOD2 (int /* bool */, add_friend, | |
| gcc_decl, /* Argument DECL. */ | |
| gcc_type) /* Argument TYPE. */ | |
| /* Return the type of a pointer to a given base type. */ | |
| GCC_METHOD1 (gcc_type, build_pointer_type, | |
| gcc_type) /* Argument BASE_TYPE. */ | |
| /* Return the type of a reference to a given base type. */ | |
| GCC_METHOD2 (gcc_type, build_reference_type, | |
| gcc_type, /* Argument BASE_TYPE. */ | |
| enum gcc_cp_ref_qualifiers) /* Argument RQUALS. */ | |
| /* Create a new pointer-to-member type. MEMBER_TYPE is the data | |
| member type, while CLASS_TYPE is the class type containing the data | |
| member. For pointers to member functions, MEMBER_TYPE must be a | |
| method type, and CLASS_TYPE must be specified even though it might | |
| be possible to extract it from the method type. */ | |
| GCC_METHOD2 (gcc_type, build_pointer_to_member_type, | |
| gcc_type, /* Argument CLASS_TYPE. */ | |
| gcc_type) /* Argument MEMBER_TYPE. */ | |
| /* Start a template parameter list scope and enters it, so that | |
| subsequent build_type_template_parameter and | |
| build_value_template_parameter calls create template parameters in | |
| the list. The list is closed by a build_decl call with | |
| GCC_CP_SYMBOL_FUNCTION or GCC_CP_SYMBOL_CLASS, that, when the scope | |
| is a template parameter list, declares a template function or a | |
| template class with the then-closed parameter list. The scope in | |
| which the new declaration is to be introduced by build_decl must be | |
| entered before calling start_template_decl, and build_decl returns | |
| to that scope, from the template parameter list scope, before | |
| introducing the declaration. */ | |
| GCC_METHOD0 (int /* bool */, start_template_decl) | |
| /* Build a typename template-parameter (e.g., the T in template | |
| <typename T = X>). Either PACK_P should be nonzero, to indicate an | |
| argument pack (the last argument in a variadic template argument | |
| list, as in template <typename... T>), or DEFAULT_TYPE may be | |
| non-NULL to set the default type argument (e.g. X) for the template | |
| parameter. FILENAME and LINE_NUMBER may specify the source | |
| location in which the template parameter was declared. */ | |
| GCC_METHOD5 (gcc_type, build_type_template_parameter, | |
| const char *, /* Argument ID. */ | |
| int /* bool */, /* Argument PACK_P. */ | |
| gcc_type, /* Argument DEFAULT_TYPE. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Build a template template-parameter (e.g., the T in template | |
| <template <[...]> class T = X>). DEFAULT_TEMPL may be non-NULL to | |
| set the default type-template argument (e.g. X) for the template | |
| template parameter. FILENAME and LINE_NUMBER may specify the | |
| source location in which the template parameter was declared. */ | |
| GCC_METHOD5 (gcc_utempl, build_template_template_parameter, | |
| const char *, /* Argument ID. */ | |
| int /* bool */, /* Argument PACK_P. */ | |
| gcc_utempl, /* Argument DEFAULT_TEMPL. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Build a value template-parameter (e.g., the V in template <typename | |
| T, T V> or in template <int V = X>). DEFAULT_VALUE may be non-NULL | |
| to set the default value argument for the template parameter (e.g., | |
| X). FILENAME and LINE_NUMBER may specify the source location in | |
| which the template parameter was declared. */ | |
| GCC_METHOD5 (gcc_decl, build_value_template_parameter, | |
| gcc_type, /* Argument TYPE. */ | |
| const char *, /* Argument ID. */ | |
| gcc_expr, /* Argument DEFAULT_VALUE. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Build a template-dependent typename (e.g., typename T::bar or | |
| typename T::template bart<X>). ENCLOSING_TYPE should be the | |
| template-dependent nested name specifier (e.g., T), ID should be | |
| the name of the member of the ENCLOSING_TYPE (e.g., bar or bart), | |
| and TARGS should be non-NULL and specify the template arguments | |
| (e.g. <X>) iff ID is to name a class template. | |
| In this and other calls, a template-dependent nested name specifier | |
| may be a template class parameter (build_type_template_parameter), | |
| a specialization (returned by build_dependent_type_template_id) of | |
| a template template parameter (returned by | |
| build_template_template_parameter) or a member type thereof | |
| (returned by build_dependent_typename itself). */ | |
| GCC_METHOD3 (gcc_type, build_dependent_typename, | |
| gcc_type, /* Argument ENCLOSING_TYPE. */ | |
| const char *, /* Argument ID. */ | |
| const struct gcc_cp_template_args *) /* Argument TARGS. */ | |
| /* Build a template-dependent class template (e.g., T::template bart). | |
| ENCLOSING_TYPE should be the template-dependent nested name | |
| specifier (e.g., T), ID should be the name of the class template | |
| member of the ENCLOSING_TYPE (e.g., bart). */ | |
| GCC_METHOD2 (gcc_utempl, build_dependent_class_template, | |
| gcc_type, /* Argument ENCLOSING_TYPE. */ | |
| const char *) /* Argument ID. */ | |
| /* Build a template-dependent type template-id (e.g., T<A>). | |
| TEMPLATE_DECL should be a template template parameter (e.g., the T | |
| in template <template <[...]> class T = X>), and TARGS should | |
| specify the template arguments (e.g. <A>). */ | |
| GCC_METHOD2 (gcc_type, build_dependent_type_template_id, | |
| gcc_utempl, /* Argument TEMPLATE_DECL. */ | |
| const struct gcc_cp_template_args *) /* Argument TARGS. */ | |
| /* Build a template-dependent expression (e.g., S::val or S::template | |
| mtf<X>, or unqualified f or template tf<X>). | |
| ENCLOSING_SCOPE should be a template-dependent nested name | |
| specifier (e.g., T), a resolved namespace or class decl, or NULL | |
| for unqualified names; ID should be the name of the member of the | |
| ENCLOSING_SCOPE (e.g., val or mtf) or unqualified overloaded | |
| function; and TARGS should list template arguments (e.g. <X>) when | |
| mtf or tf are to name a template function, or be NULL otherwise. | |
| Unqualified names and namespace- or class-qualified names can only | |
| resolve to overloaded functions, to be used in contexts that | |
| involve overload resolution that cannot be resolved because of | |
| template-dependent argument or return types, such as call | |
| expressions with template-dependent arguments, conversion | |
| expressions to function types with template-dependent argument | |
| types or the like. Other cases of unqualified or | |
| non-template-dependent-qualified names should NOT use this | |
| function, and use decl_expr to convert the appropriate function or | |
| object declaration to an expression. | |
| If ID is the name of a special member function, FLAGS should be | |
| GCC_CP_SYMBOL_FUNCTION|GCC_CP_FLAG_SPECIAL_FUNCTION, and ID should | |
| be one of the encodings for special member functions documented in | |
| build_decl. Otherwise, FLAGS should be GCC_CP_SYMBOL_MASK, which | |
| suggests the symbol kind is not known (though we know it is not a | |
| type). | |
| If ID denotes a conversion operator, CONV_TYPE should name the | |
| target type of the conversion. Otherwise, CONV_TYPE must be | |
| NULL. */ | |
| GCC_METHOD5 (gcc_expr, build_dependent_expr, | |
| gcc_decl, /* Argument ENCLOSING_SCOPE. */ | |
| enum gcc_cp_symbol_kind, /* Argument FLAGS. */ | |
| const char *, /* Argument NAME. */ | |
| gcc_type, /* Argument CONV_TYPE. */ | |
| const struct gcc_cp_template_args *) /* Argument TARGS. */ | |
| /* Build a gcc_expr for the value VALUE in type TYPE. */ | |
| GCC_METHOD2 (gcc_expr, build_literal_expr, | |
| gcc_type, /* Argument TYPE. */ | |
| unsigned long) /* Argument VALUE. */ | |
| /* Build a gcc_expr that denotes DECL, the declaration of a variable | |
| or function in namespace scope, or of a static member variable or | |
| function. Use QUALIFIED_P to build the operand of unary & so as to | |
| compute a pointer-to-member, rather than a regular pointer. */ | |
| GCC_METHOD2 (gcc_expr, build_decl_expr, | |
| gcc_decl, /* Argument DECL. */ | |
| int /* bool */) /* Argument QUALIFIED_P. */ | |
| /* Build a gcc_expr that denotes the unary operation UNARY_OP applied | |
| to the gcc_expr OPERAND. For non-expr operands, see | |
| unary_type_expr. Besides the UNARY_OP encodings used for operator | |
| names, we support "pp_" for preincrement, and "mm_" for | |
| predecrement, "nx" for noexcept, "tw" for throw, "tr" for rethrow | |
| (pass NULL as the operand), "te" for typeid, "sz" for sizeof, "az" | |
| for alignof, "dl" for delete, "gsdl" for ::delete, "da" for | |
| delete[], "gsda" for ::delete[], "sp" for pack expansion, "sZ" for | |
| sizeof...(function argument pack). */ | |
| GCC_METHOD2 (gcc_expr, build_unary_expr, | |
| const char *, /* Argument UNARY_OP. */ | |
| gcc_expr) /* Argument OPERAND. */ | |
| /* Build a gcc_expr that denotes the binary operation BINARY_OP | |
| applied to gcc_exprs OPERAND1 and OPERAND2. Besides the BINARY_OP | |
| encodings used for operator names, we support "ds" for the operator | |
| token ".*" and "dt" for the operator token ".". When using | |
| operators that take a name as their second operand ("." and "->") | |
| use decl_expr to convert the gcc_decl of the member name to a | |
| gcc_expr, if the member name wasn't created with | |
| e.g. build_dependent_expr. */ | |
| GCC_METHOD3 (gcc_expr, build_binary_expr, | |
| const char *, /* Argument BINARY_OP. */ | |
| gcc_expr, /* Argument OPERAND1. */ | |
| gcc_expr) /* Argument OPERAND2. */ | |
| /* Build a gcc_expr that denotes the ternary operation TERNARY_OP | |
| applied to gcc_exprs OPERAND1, OPERAND2 and OPERAND3. The only | |
| supported TERNARY_OP is "qu", for the "?:" operator. */ | |
| GCC_METHOD4 (gcc_expr, build_ternary_expr, | |
| const char *, /* Argument TERNARY_OP. */ | |
| gcc_expr, /* Argument OPERAND1. */ | |
| gcc_expr, /* Argument OPERAND2. */ | |
| gcc_expr) /* Argument OPERAND3. */ | |
| /* Build a gcc_expr that denotes the unary operation UNARY_OP applied | |
| to the gcc_type OPERAND. Supported unary operations taking types | |
| are "ti" for typeid, "st" for sizeof, "at" for alignof, and "sZ" | |
| for sizeof...(template argument pack). */ | |
| GCC_METHOD2 (gcc_expr, build_unary_type_expr, | |
| const char *, /* Argument UNARY_OP. */ | |
| gcc_type) /* Argument OPERAND. */ | |
| /* Build a gcc_expr that denotes the binary operation BINARY_OP | |
| applied to gcc_type OPERAND1 and gcc_expr OPERAND2. Use this for | |
| all kinds of (single-argument) type casts ("dc", "sc", "cc", "rc" | |
| for dynamic, static, const and reinterpret casts, respectively; | |
| "cv" for functional or C-style casts). */ | |
| GCC_METHOD3 (gcc_expr, build_cast_expr, | |
| const char *, /* Argument BINARY_OP. */ | |
| gcc_type, /* Argument OPERAND1. */ | |
| gcc_expr) /* Argument OPERAND2. */ | |
| /* Build a gcc_expr that denotes the conversion of an expression list | |
| VALUES to TYPE, with ("tl") or without ("cv") braces, or a braced | |
| initializer list of unspecified type (e.g., a component of another | |
| braced initializer list; pass "il" for CONV_OP, and NULL for | |
| TYPE). */ | |
| GCC_METHOD3 (gcc_expr, build_expression_list_expr, | |
| const char *, /* Argument CONV_OP. */ | |
| gcc_type, /* Argument TYPE. */ | |
| const struct gcc_cp_function_args *) /* Argument VALUES. */ | |
| /* Build a gcc_expr that denotes a new ("nw") or new[] ("na") | |
| expression of TYPE, with or without a GLOBAL_NS qualifier (prefix | |
| the NEW_OP with "gs"), with or without PLACEMENT, with or without | |
| INITIALIZER. If it's not a placement new, PLACEMENT must be NULL | |
| (rather than a zero-length placement arg list). If there's no | |
| specified initializer, INITIALIZER must be NULL; a zero-length arg | |
| list stands for a default initializer. */ | |
| GCC_METHOD4 (gcc_expr, build_new_expr, | |
| const char *, /* Argument NEW_OP. */ | |
| const struct gcc_cp_function_args *, /* Argument PLACEMENT. */ | |
| gcc_type, /* Argument TYPE. */ | |
| const struct gcc_cp_function_args *) /* Argument INITIALIZER. */ | |
| /* Return a call expression that calls CALLABLE with arguments ARGS. | |
| CALLABLE may be a function, a callable object, a pointer to | |
| function, an unresolved expression, an unresolved overload set, an | |
| object expression combined with a member function overload set or a | |
| pointer-to-member. If QUALIFIED_P, CALLABLE will be interpreted as | |
| a qualified name, preventing virtual function dispatch. */ | |
| GCC_METHOD3 (gcc_expr, build_call_expr, | |
| gcc_expr, /* Argument CALLABLE. */ | |
| int /* bool */, /* Argument QUALIFIED_P. */ | |
| const struct gcc_cp_function_args *) /* Argument ARGS. */ | |
| /* Return the type of the gcc_expr OPERAND. | |
| Use this for decltype. | |
| For decltype (auto), pass a NULL OPERAND. | |
| Note: for template-dependent expressions, the result is NULL, | |
| because the type is only computed when template argument | |
| substitution is performed. */ | |
| GCC_METHOD1 (gcc_type, get_expr_type, | |
| gcc_expr) /* Argument OPERAND. */ | |
| /* Introduce a specialization of a template function. | |
| TEMPLATE_DECL is the template function, and TARGS are the arguments | |
| for the specialization. ADDRESS is the address of the | |
| specialization. FILENAME and LINE_NUMBER specify the source | |
| location associated with the template function specialization. */ | |
| GCC_METHOD5 (gcc_decl, build_function_template_specialization, | |
| gcc_decl, /* Argument TEMPLATE_DECL. */ | |
| const struct gcc_cp_template_args *, /* Argument TARGS. */ | |
| gcc_address, /* Argument ADDRESS. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Specialize a template class as an incomplete type. A definition | |
| can be supplied later, with start_class_type. | |
| TEMPLATE_DECL is the template class, and TARGS are the arguments | |
| for the specialization. FILENAME and LINE_NUMBER specify the | |
| source location associated with the template class | |
| specialization. */ | |
| GCC_METHOD4 (gcc_decl, build_class_template_specialization, | |
| gcc_decl, /* Argument TEMPLATE_DECL. */ | |
| const struct gcc_cp_template_args *, /* Argument TARGS. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Start defining a 'class', 'struct' or 'union' type, entering its | |
| own binding level. Initially it has no fields. | |
| TYPEDECL is the forward-declaration of the type, returned by | |
| build_decl. BASE_CLASSES indicate the base classes of class NAME. | |
| FILENAME and LINE_NUMBER specify the source location associated | |
| with the class definition, should they be different from those of | |
| the forward declaration. */ | |
| GCC_METHOD4 (gcc_type, start_class_type, | |
| gcc_decl, /* Argument TYPEDECL. */ | |
| const struct gcc_vbase_array *,/* Argument BASE_CLASSES. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Create a new closure class type, record it as the | |
| DISCRIMINATOR-numbered closure type in the current scope (or | |
| associated with EXTRA_SCOPE, if non-NULL), and enter the closure | |
| type's own binding level. This primitive would sort of combine | |
| build_decl and start_class_type, if they could be used to introduce | |
| a closure type. Initially it has no fields. | |
| FILENAME and LINE_NUMBER specify the source location associated | |
| with the class. EXTRA_SCOPE, if non-NULL, must be a PARM_DECL of | |
| the current function, or a FIELD_DECL of the current class. If it | |
| is NULL, the current scope must be a function. */ | |
| GCC_METHOD5 (gcc_type, start_closure_class_type, | |
| int, /* Argument DISCRIMINATOR. */ | |
| gcc_decl, /* Argument EXTRA_SCOPE. */ | |
| enum gcc_cp_symbol_kind, /* Argument FLAGS. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Add a non-static data member to the most-recently-started | |
| unfinished struct or union type. FIELD_NAME is the field's name. | |
| FIELD_TYPE is the type of the field. BITSIZE and BITPOS indicate | |
| where in the struct the field occurs. */ | |
| GCC_METHOD5 (gcc_decl, build_field, | |
| const char *, /* Argument FIELD_NAME. */ | |
| gcc_type, /* Argument FIELD_TYPE. */ | |
| enum gcc_cp_symbol_kind, /* Argument FIELD_FLAGS. */ | |
| unsigned long, /* Argument BITSIZE. */ | |
| unsigned long) /* Argument BITPOS. */ | |
| /* After all the fields have been added to a struct, class or union, | |
| the struct or union type must be "finished". This does some final | |
| cleanups in GCC, and pops to the binding level that was in effect | |
| before the matching start_class_type or | |
| start_closure_class_type. */ | |
| GCC_METHOD1 (int /* bool */, finish_class_type, | |
| unsigned long) /* Argument SIZE_IN_BYTES. */ | |
| /* Create a new 'enum' type, and record it in the current binding | |
| level. The new type initially has no associated constants. | |
| NAME is the enum name. FILENAME and LINE_NUMBER specify its source | |
| location. */ | |
| GCC_METHOD5 (gcc_type, start_enum_type, | |
| const char *, /* Argument NAME. */ | |
| gcc_type, /* Argument UNDERLYING_INT_TYPE. */ | |
| enum gcc_cp_symbol_kind, /* Argument FLAGS. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Add a new constant to an enum type. NAME is the constant's name | |
| and VALUE is its value. Returns a gcc_decl for the constant. */ | |
| GCC_METHOD3 (gcc_decl, build_enum_constant, | |
| gcc_type, /* Argument ENUM_TYPE. */ | |
| const char *, /* Argument NAME. */ | |
| unsigned long) /* Argument VALUE. */ | |
| /* After all the constants have been added to an enum, the type must | |
| be "finished". This does some final cleanups in GCC. */ | |
| GCC_METHOD1 (int /* bool */, finish_enum_type, | |
| gcc_type) /* Argument ENUM_TYPE. */ | |
| /* Create a new function type. RETURN_TYPE is the type returned by | |
| the function, and ARGUMENT_TYPES is a vector, of length NARGS, of | |
| the argument types. IS_VARARGS is true if the function is | |
| varargs. */ | |
| GCC_METHOD3 (gcc_type, build_function_type, | |
| gcc_type, /* Argument RETURN_TYPE. */ | |
| const struct gcc_type_array *,/* Argument ARGUMENT_TYPES. */ | |
| int /* bool */) /* Argument IS_VARARGS. */ | |
| /* Create a variant of a function type with an exception | |
| specification. FUNCTION_TYPE is a function or method type. | |
| EXCEPT_TYPES is an array with the list of exception types. Zero as | |
| the array length implies throw() AKA noexcept(true); NULL as the | |
| pointer to gcc_type_array implies noexcept(false), which is almost | |
| equivalent (but distinguishable by the compiler) to an unspecified | |
| exception list. */ | |
| GCC_METHOD2 (gcc_type, build_exception_spec_variant, | |
| gcc_type, /* Argument FUNCTION_TYPE. */ | |
| const struct gcc_type_array *)/* Argument EXCEPT_TYPES. */ | |
| /* Create a new non-static member function type. FUNC_TYPE is the | |
| method prototype, without the implicit THIS pointer, added as a | |
| pointer to the QUALS-qualified CLASS_TYPE. If CLASS_TYPE is NULL, | |
| this creates a cv-qualified (member) function type not associated | |
| with any specific class, as needed to support "typedef void f(int) | |
| const;", which can later be used to declare member functions and | |
| pointers to member functions. */ | |
| GCC_METHOD4 (gcc_type, build_method_type, | |
| gcc_type, /* Argument CLASS_TYPE. */ | |
| gcc_type, /* Argument FUNC_TYPE. */ | |
| enum gcc_cp_qualifiers, /* Argument QUALS. */ | |
| enum gcc_cp_ref_qualifiers) /* Argument RQUALS. */ | |
| /* Return a declaration for the (INDEX - 1)th argument of | |
| FUNCTION_DECL, i.e., for the first argument, use zero as the index. | |
| If FUNCTION_DECL is a non-static member function, use -1 to get the | |
| implicit THIS parameter. */ | |
| GCC_METHOD2 (gcc_decl, get_function_parameter_decl, | |
| gcc_decl, /* Argument FUNCTION_DECL. */ | |
| int) /* Argument INDEX. */ | |
| /* Return a lambda expr that constructs an instance of CLOSURE_TYPE. | |
| Only lambda exprs without any captures can be correctly created | |
| through these mechanisms; that's all we need to support lambdas | |
| expressions in default parameters, the only kind that may have to | |
| be introduced through this interface. */ | |
| GCC_METHOD1 (gcc_expr, build_lambda_expr, | |
| gcc_type) /* Argument CLOSURE_TYPE. */ | |
| /* Return an integer type with the given properties. If BUILTIN_NAME | |
| is non-NULL, it must name a builtin integral type with the given | |
| signedness and size, and that is the type that will be returned. */ | |
| GCC_METHOD3 (gcc_type, get_int_type, | |
| int /* bool */, /* Argument IS_UNSIGNED. */ | |
| unsigned long, /* Argument SIZE_IN_BYTES. */ | |
| const char *) /* Argument BUILTIN_NAME. */ | |
| /* Return the 'char' type, a distinct type from both 'signed char' and | |
| 'unsigned char' returned by int_type. */ | |
| GCC_METHOD0 (gcc_type, get_char_type) | |
| /* Return a floating point type with the given properties. If BUILTIN_NAME | |
| is non-NULL, it must name a builtin integral type with the given | |
| signedness and size, and that is the type that will be returned. */ | |
| GCC_METHOD2 (gcc_type, get_float_type, | |
| unsigned long, /* Argument SIZE_IN_BYTES. */ | |
| const char *) /* Argument BUILTIN_NAME. */ | |
| /* Return the 'void' type. */ | |
| GCC_METHOD0 (gcc_type, get_void_type) | |
| /* Return the 'bool' type. */ | |
| GCC_METHOD0 (gcc_type, get_bool_type) | |
| /* Return the std::nullptr_t type. */ | |
| GCC_METHOD0 (gcc_type, get_nullptr_type) | |
| /* Return the nullptr constant. */ | |
| GCC_METHOD0 (gcc_expr, get_nullptr_constant) | |
| /* Create a new array type. If NUM_ELEMENTS is -1, then the array | |
| is assumed to have an unknown length. */ | |
| GCC_METHOD2 (gcc_type, build_array_type, | |
| gcc_type, /* Argument ELEMENT_TYPE. */ | |
| int) /* Argument NUM_ELEMENTS. */ | |
| /* Create a new array type. NUM_ELEMENTS is a template-dependent | |
| expression. */ | |
| GCC_METHOD2 (gcc_type, build_dependent_array_type, | |
| gcc_type, /* Argument ELEMENT_TYPE. */ | |
| gcc_expr) /* Argument NUM_ELEMENTS. */ | |
| /* Create a new variably-sized array type. UPPER_BOUND_NAME is the | |
| name of a local variable that holds the upper bound of the array; | |
| it is one less than the array size. */ | |
| GCC_METHOD2 (gcc_type, build_vla_array_type, | |
| gcc_type, /* Argument ELEMENT_TYPE. */ | |
| const char *) /* Argument UPPER_BOUND_NAME. */ | |
| /* Return a qualified variant of a given base type. QUALIFIERS says | |
| which qualifiers to use; it is composed of or'd together | |
| constants from 'enum gcc_cp_qualifiers'. */ | |
| GCC_METHOD2 (gcc_type, build_qualified_type, | |
| gcc_type, /* Argument UNQUALIFIED_TYPE. */ | |
| enum gcc_cp_qualifiers) /* Argument QUALIFIERS. */ | |
| /* Build a complex type given its element type. */ | |
| GCC_METHOD1 (gcc_type, build_complex_type, | |
| gcc_type) /* Argument ELEMENT_TYPE. */ | |
| /* Build a vector type given its element type and number of | |
| elements. */ | |
| GCC_METHOD2 (gcc_type, build_vector_type, | |
| gcc_type, /* Argument ELEMENT_TYPE. */ | |
| int) /* Argument NUM_ELEMENTS. */ | |
| /* Build a constant. NAME is the constant's name and VALUE is its | |
| value. FILENAME and LINE_NUMBER refer to the type's source | |
| location. If this is not known, FILENAME can be NULL and | |
| LINE_NUMBER can be 0. */ | |
| GCC_METHOD5 (int /* bool */, build_constant, | |
| gcc_type, /* Argument TYPE. */ | |
| const char *, /* Argument NAME. */ | |
| unsigned long, /* Argument VALUE. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| /* Emit an error and return an error type object. */ | |
| GCC_METHOD1 (gcc_type, error, | |
| const char *) /* Argument MESSAGE. */ | |
| /* Declare a static_assert with the given CONDITION and ERRORMSG at | |
| FILENAME:LINE_NUMBER. */ | |
| GCC_METHOD4 (int /* bool */, add_static_assert, | |
| gcc_expr, /* Argument CONDITION. */ | |
| const char *, /* Argument ERRORMSG. */ | |
| const char *, /* Argument FILENAME. */ | |
| unsigned int) /* Argument LINE_NUMBER. */ | |
| #if 0 | |
| /* FIXME: We don't want to expose the internal implementation detail | |
| that default parms are stored in function types, and it's not clear | |
| how this or other approaches would interact with the type sharing | |
| of e.g. ctor clones, so we're leaving this out, since default args | |
| are not even present in debug information anyway. Besides, the set | |
| of default args for a function may grow within its scope, and vary | |
| independently in other scopes. */ | |
| /* Create a modified version of a function type that has default | |
| values for some of its arguments. The returned type should ONLY be | |
| used to define functions or methods, never to declare parameters, | |
| variables, types or the like. | |
| DEFAULTS must have at most as many N_ELEMENTS as there are | |
| arguments without default values in FUNCTION_TYPE. Say, if | |
| FUNCTION_TYPE has an argument list such as (T1, T2, T3, T4 = V0) | |
| and DEFAULTS has 2 elements (V1, V2), the returned type will have | |
| the following argument list: (T1, T2 = V1, T3 = V2, T4 = V0). | |
| Any NULL expressions in DEFAULTS will be marked as deferred, and | |
| they should be filled in with set_deferred_function_default_args. */ | |
| GCC_METHOD2 (gcc_type, add_function_default_args, | |
| gcc_type, /* Argument FUNCTION_TYPE. */ | |
| const struct gcc_cp_function_args *) /* Argument DEFAULTS. */ | |
| /* Fill in the first deferred default args in FUNCTION_DECL with the | |
| expressions given in DEFAULTS. This can be used when the | |
| declaration of a parameter is needed to create a default | |
| expression, such as taking the size of an earlier parameter, or | |
| building a lambda expression in the parameter's context. */ | |
| GCC_METHOD2 (int /* bool */, set_deferred_function_default_args, | |
| gcc_decl, /* Argument FUNCTION_DECL. */ | |
| const struct gcc_cp_function_args *) /* Argument DEFAULTS. */ | |
| #endif | |
| /* When you add entry points, add them at the end, so that the new API | |
| version remains compatible with the old version. | |
| The following conventions have been observed as to naming entry points: | |
| - build_* creates (and maybe records) something and returns it; | |
| - add_* creates and records something, but doesn't return it; | |
| - get_* obtains something without creating it; | |
| - start_* marks the beginning of a compound (type, list, ...); | |
| - finish_* completes the compound when needed. | |
| Entry points that return an int (bool) and don't have a return value | |
| specification return nonzero (true) on success and zero (false) on | |
| failure. This is in line with libcc1's conventions of returning a | |
| zero-initialized value in case of e.g. a transport error. */ |