| /* Interface between GCC C FE and GDB |
| |
| Copyright (C) 2014-2020 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/>. */ |
| |
| #ifndef GCC_C_INTERFACE_H |
| #define GCC_C_INTERFACE_H |
| |
| #include "gcc-interface.h" |
| |
| /* This header defines the interface to the GCC API. It must be both |
| valid C and valid C++, because it is included by both programs. */ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* Forward declaration. */ |
| |
| struct gcc_c_context; |
| |
| /* |
| * Definitions and declarations for the C front end. |
| */ |
| |
| /* Defined versions of the C front-end API. */ |
| |
| enum gcc_c_api_version |
| { |
| GCC_C_FE_VERSION_0 = 0, |
| |
| /* Added char_type. Added new version of int_type and float_type, |
| deprecated int_type_v0 and float_type_v0. */ |
| GCC_C_FE_VERSION_1 = 1 |
| }; |
| |
| /* Qualifiers. */ |
| |
| enum gcc_qualifiers |
| { |
| GCC_QUALIFIER_CONST = 1, |
| GCC_QUALIFIER_VOLATILE = 2, |
| GCC_QUALIFIER_RESTRICT = 4 |
| }; |
| |
| /* This enumerates the kinds of decls that GDB can create. */ |
| |
| enum gcc_c_symbol_kind |
| { |
| /* A function. */ |
| |
| GCC_C_SYMBOL_FUNCTION, |
| |
| /* A variable. */ |
| |
| GCC_C_SYMBOL_VARIABLE, |
| |
| /* A typedef. */ |
| |
| GCC_C_SYMBOL_TYPEDEF, |
| |
| /* A label. */ |
| |
| GCC_C_SYMBOL_LABEL |
| }; |
| |
| /* This enumerates the types of symbols that GCC might request from |
| GDB. */ |
| |
| enum gcc_c_oracle_request |
| { |
| /* An ordinary symbol -- a variable, function, typedef, or enum |
| constant. */ |
| |
| GCC_C_ORACLE_SYMBOL, |
| |
| /* A struct, union, or enum tag. */ |
| |
| GCC_C_ORACLE_TAG, |
| |
| /* A label. */ |
| |
| GCC_C_ORACLE_LABEL |
| }; |
| |
| /* The type of the function called by GCC to ask GDB for a symbol's |
| definition. DATUM is an arbitrary value supplied when the oracle |
| function is registered. CONTEXT is the GCC context in which the |
| request is being made. REQUEST specifies what sort of symbol is |
| being requested, and IDENTIFIER is the name of the symbol. */ |
| |
| typedef void gcc_c_oracle_function (void *datum, |
| struct gcc_c_context *context, |
| enum gcc_c_oracle_request request, |
| const char *identifier); |
| |
| /* The type of the function called by GCC to ask GDB for a symbol's |
| address. This should return 0 if the address is not known. */ |
| |
| typedef gcc_address gcc_c_symbol_address_function (void *datum, |
| struct gcc_c_context *ctxt, |
| const char *identifier); |
| |
| /* The vtable used by the C front end. */ |
| |
| struct gcc_c_fe_vtable |
| { |
| /* The version of the C interface. The value is one of the |
| gcc_c_api_version constants. */ |
| |
| unsigned int c_version; |
| |
| /* Set the callbacks for this context. |
| |
| The binding oracle is called whenever the C parser needs to look |
| up a symbol. This gives the caller a chance to lazily |
| instantiate symbols using other parts of the gcc_c_fe_interface |
| API. |
| |
| The address oracle is called whenever the C parser needs to look |
| up a symbol. This is only called for symbols not provided by the |
| symbol oracle -- that is, just built-in functions where GCC |
| provides the declaration. |
| |
| DATUM is an arbitrary piece of data that is passed back verbatim |
| to the callbacks in requests. */ |
| |
| void (*set_callbacks) (struct gcc_c_context *self, |
| gcc_c_oracle_function *binding_oracle, |
| gcc_c_symbol_address_function *address_oracle, |
| void *datum); |
| |
| #define GCC_METHOD0(R, N) \ |
| R (*N) (struct gcc_c_context *); |
| #define GCC_METHOD1(R, N, A) \ |
| R (*N) (struct gcc_c_context *, A); |
| #define GCC_METHOD2(R, N, A, B) \ |
| R (*N) (struct gcc_c_context *, A, B); |
| #define GCC_METHOD3(R, N, A, B, C) \ |
| R (*N) (struct gcc_c_context *, A, B, C); |
| #define GCC_METHOD4(R, N, A, B, C, D) \ |
| R (*N) (struct gcc_c_context *, A, B, C, D); |
| #define GCC_METHOD5(R, N, A, B, C, D, E) \ |
| R (*N) (struct gcc_c_context *, A, B, C, D, E); |
| #define GCC_METHOD7(R, N, A, B, C, D, E, F, G) \ |
| R (*N) (struct gcc_c_context *, A, B, C, D, E, F, G); |
| |
| #include "gcc-c-fe.def" |
| |
| #undef GCC_METHOD0 |
| #undef GCC_METHOD1 |
| #undef GCC_METHOD2 |
| #undef GCC_METHOD3 |
| #undef GCC_METHOD4 |
| #undef GCC_METHOD5 |
| #undef GCC_METHOD7 |
| |
| }; |
| |
| /* The C front end object. */ |
| |
| struct gcc_c_context |
| { |
| /* Base class. */ |
| |
| struct gcc_base_context base; |
| |
| /* Our vtable. This is a separate field because this is simpler |
| than implementing a vtable inheritance scheme in C. */ |
| |
| const struct gcc_c_fe_vtable *c_ops; |
| }; |
| |
| /* The name of the .so that the compiler builds. We dlopen this |
| later. */ |
| |
| #define GCC_C_FE_LIBCC libcc1.so |
| |
| /* The compiler exports a single initialization function. This macro |
| holds its name as a symbol. */ |
| |
| #define GCC_C_FE_CONTEXT gcc_c_fe_context |
| |
| /* The type of the initialization function. The caller passes in the |
| desired base version and desired C-specific version. If the |
| request can be satisfied, a compatible gcc_context object will be |
| returned. Otherwise, the function returns NULL. */ |
| |
| typedef struct gcc_c_context *gcc_c_fe_context_function |
| (enum gcc_base_api_version, |
| enum gcc_c_api_version); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* GCC_C_INTERFACE_H */ |