|  | /* Fortran language support definitions for GDB, the GNU debugger. | 
|  |  | 
|  | Copyright (C) 1992-2021 Free Software Foundation, Inc. | 
|  |  | 
|  | Contributed by Motorola.  Adapted from the C definitions by Farooq Butt | 
|  | (fmbutt@engage.sps.mot.com). | 
|  |  | 
|  | This file is part of GDB. | 
|  |  | 
|  | 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 F_LANG_H | 
|  | #define F_LANG_H | 
|  |  | 
|  | #include "valprint.h" | 
|  |  | 
|  | struct type_print_options; | 
|  | struct parser_state; | 
|  |  | 
|  | /* Class representing the Fortran language.  */ | 
|  |  | 
|  | class f_language : public language_defn | 
|  | { | 
|  | public: | 
|  | f_language () | 
|  | : language_defn (language_fortran) | 
|  | { /* Nothing.  */ } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | const char *name () const override | 
|  | { return "fortran"; } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | const char *natural_name () const override | 
|  | { return "Fortran"; } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | const std::vector<const char *> &filename_extensions () const override | 
|  | { | 
|  | static const std::vector<const char *> extensions = { | 
|  | ".f", ".F", ".for", ".FOR", ".ftn", ".FTN", ".fpp", ".FPP", | 
|  | ".f90", ".F90", ".f95", ".F95", ".f03", ".F03", ".f08", ".F08" | 
|  | }; | 
|  | return extensions; | 
|  | } | 
|  |  | 
|  | /* See language.h.  */ | 
|  | void language_arch_info (struct gdbarch *gdbarch, | 
|  | struct language_arch_info *lai) const override; | 
|  |  | 
|  | /* See language.h.  */ | 
|  | unsigned int search_name_hash (const char *name) const override; | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | gdb::unique_xmalloc_ptr<char> demangle_symbol (const char *mangled, | 
|  | int options) const override | 
|  | { | 
|  | /* We could support demangling here to provide module namespaces | 
|  | also for inferiors with only minimal symbol table (ELF symbols). | 
|  | Just the mangling standard is not standardized across compilers | 
|  | and there is no DW_AT_producer available for inferiors with only | 
|  | the ELF symbols to check the mangling kind.  */ | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | void print_type (struct type *type, const char *varstring, | 
|  | struct ui_file *stream, int show, int level, | 
|  | const struct type_print_options *flags) const override; | 
|  |  | 
|  | /* See language.h.  This just returns default set of word break | 
|  | characters but with the modules separator `::' removed.  */ | 
|  |  | 
|  | const char *word_break_characters (void) const override | 
|  | { | 
|  | static char *retval; | 
|  |  | 
|  | if (!retval) | 
|  | { | 
|  | char *s; | 
|  |  | 
|  | retval = xstrdup (language_defn::word_break_characters ()); | 
|  | s = strchr (retval, ':'); | 
|  | if (s) | 
|  | { | 
|  | char *last_char = &s[strlen (s) - 1]; | 
|  |  | 
|  | *s = *last_char; | 
|  | *last_char = 0; | 
|  | } | 
|  | } | 
|  | return retval; | 
|  | } | 
|  |  | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | void collect_symbol_completion_matches (completion_tracker &tracker, | 
|  | complete_symbol_mode mode, | 
|  | symbol_name_match_type name_match_type, | 
|  | const char *text, const char *word, | 
|  | enum type_code code) const override | 
|  | { | 
|  | /* Consider the modules separator :: as a valid symbol name character | 
|  | class.  */ | 
|  | default_collect_symbol_completion_matches_break_on (tracker, mode, | 
|  | name_match_type, | 
|  | text, word, ":", | 
|  | code); | 
|  | } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | void value_print_inner | 
|  | (struct value *val, struct ui_file *stream, int recurse, | 
|  | const struct value_print_options *options) const override; | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | struct block_symbol lookup_symbol_nonlocal | 
|  | (const char *name, const struct block *block, | 
|  | const domain_enum domain) const override; | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | int parser (struct parser_state *ps) const override; | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | void emitchar (int ch, struct type *chtype, | 
|  | struct ui_file *stream, int quoter) const override | 
|  | { | 
|  | const char *encoding = get_encoding (chtype); | 
|  | generic_emit_char (ch, chtype, stream, quoter, encoding); | 
|  | } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | void printchar (int ch, struct type *chtype, | 
|  | struct ui_file *stream) const override | 
|  | { | 
|  | fputs_filtered ("'", stream); | 
|  | emitchar (ch, chtype, stream, '\''); | 
|  | fputs_filtered ("'", stream); | 
|  | } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | void printstr (struct ui_file *stream, struct type *elttype, | 
|  | const gdb_byte *string, unsigned int length, | 
|  | const char *encoding, int force_ellipses, | 
|  | const struct value_print_options *options) const override | 
|  | { | 
|  | const char *type_encoding = get_encoding (elttype); | 
|  |  | 
|  | if (TYPE_LENGTH (elttype) == 4) | 
|  | fputs_filtered ("4_", stream); | 
|  |  | 
|  | if (!encoding || !*encoding) | 
|  | encoding = type_encoding; | 
|  |  | 
|  | generic_printstr (stream, elttype, string, length, encoding, | 
|  | force_ellipses, '\'', 0, options); | 
|  | } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | void print_typedef (struct type *type, struct symbol *new_symbol, | 
|  | struct ui_file *stream) const override; | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | bool is_string_type_p (struct type *type) const override | 
|  | { | 
|  | type = check_typedef (type); | 
|  | return (type->code () == TYPE_CODE_STRING | 
|  | || (type->code () == TYPE_CODE_ARRAY | 
|  | && TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_CHAR)); | 
|  | } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | const char *struct_too_deep_ellipsis () const override | 
|  | { return "(...)"; } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | bool c_style_arrays_p () const override | 
|  | { return false; } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | bool range_checking_on_by_default () const override | 
|  | { return true; } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | enum case_sensitivity case_sensitivity () const override | 
|  | { return case_sensitive_off; } | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | enum array_ordering array_ordering () const override | 
|  | { return array_column_major; } | 
|  |  | 
|  | protected: | 
|  |  | 
|  | /* See language.h.  */ | 
|  |  | 
|  | symbol_name_matcher_ftype *get_symbol_name_matcher_inner | 
|  | (const lookup_name_info &lookup_name) const override; | 
|  |  | 
|  | private: | 
|  | /* Return the encoding that should be used for the character type | 
|  | TYPE.  */ | 
|  |  | 
|  | static const char *get_encoding (struct type *type); | 
|  |  | 
|  | /* Print any asterisks or open-parentheses needed before the variable | 
|  | name (to describe its type). | 
|  |  | 
|  | On outermost call, pass 0 for PASSED_A_PTR. | 
|  | On outermost call, SHOW > 0 means should ignore | 
|  | any typename for TYPE and show its details. | 
|  | SHOW is always zero on recursive calls.  */ | 
|  |  | 
|  | void f_type_print_varspec_prefix (struct type *type, | 
|  | struct ui_file * stream, | 
|  | int show, int passed_a_ptr) const; | 
|  |  | 
|  | /* Print any array sizes, function arguments or close parentheses needed | 
|  | after the variable name (to describe its type).  Args work like | 
|  | c_type_print_varspec_prefix. | 
|  |  | 
|  | PRINT_RANK_ONLY is true when TYPE is an array which should be printed | 
|  | without the upper and lower bounds being specified, this will occur | 
|  | when the array is not allocated or not associated and so there are no | 
|  | known upper or lower bounds.  */ | 
|  |  | 
|  | void f_type_print_varspec_suffix (struct type *type, | 
|  | struct ui_file *stream, | 
|  | int show, int passed_a_ptr, | 
|  | int demangled_args, | 
|  | int arrayprint_recurse_level, | 
|  | bool print_rank_only) const; | 
|  |  | 
|  | /* Print the name of the type (or the ultimate pointer target, function | 
|  | value or array element), or the description of a structure or union. | 
|  |  | 
|  | SHOW nonzero means don't print this type as just its name; | 
|  | show its real definition even if it has a name. | 
|  | SHOW zero means print just typename or struct tag if there is one | 
|  | SHOW negative means abbreviate structure elements. | 
|  | SHOW is decremented for printing of structure elements. | 
|  |  | 
|  | LEVEL is the depth to indent by.  We increase it for some recursive | 
|  | calls.  */ | 
|  |  | 
|  | void f_type_print_base (struct type *type, struct ui_file *stream, int show, | 
|  | int level) const; | 
|  | }; | 
|  |  | 
|  | /* Language-specific data structures */ | 
|  |  | 
|  | /* A common block.  */ | 
|  |  | 
|  | struct common_block | 
|  | { | 
|  | /* The number of entries in the block.  */ | 
|  | size_t n_entries; | 
|  |  | 
|  | /* The contents of the block, allocated using the struct hack.  All | 
|  | pointers in the array are non-NULL.  */ | 
|  | struct symbol *contents[1]; | 
|  | }; | 
|  |  | 
|  | extern LONGEST f77_get_upperbound (struct type *); | 
|  |  | 
|  | extern LONGEST f77_get_lowerbound (struct type *); | 
|  |  | 
|  | extern int calc_f77_array_dims (struct type *); | 
|  |  | 
|  | /* Fortran (F77) types */ | 
|  |  | 
|  | struct builtin_f_type | 
|  | { | 
|  | struct type *builtin_character; | 
|  | struct type *builtin_integer; | 
|  | struct type *builtin_integer_s2; | 
|  | struct type *builtin_integer_s8; | 
|  | struct type *builtin_logical; | 
|  | struct type *builtin_logical_s1; | 
|  | struct type *builtin_logical_s2; | 
|  | struct type *builtin_logical_s8; | 
|  | struct type *builtin_real; | 
|  | struct type *builtin_real_s8; | 
|  | struct type *builtin_real_s16; | 
|  | struct type *builtin_complex_s8; | 
|  | struct type *builtin_complex_s16; | 
|  | struct type *builtin_complex_s32; | 
|  | struct type *builtin_void; | 
|  | }; | 
|  |  | 
|  | /* Return the Fortran type table for the specified architecture.  */ | 
|  | extern const struct builtin_f_type *builtin_f_type (struct gdbarch *gdbarch); | 
|  |  | 
|  | /* Ensures that function argument TYPE is appropriate to inform the debugger | 
|  | that ARG should be passed as a pointer.  Returns the potentially updated | 
|  | argument type. | 
|  |  | 
|  | If ARG is of type pointer then the type of ARG is returned, otherwise | 
|  | TYPE is returned untouched. | 
|  |  | 
|  | This function exists to augment the types of Fortran function call | 
|  | parameters to be pointers to the reported value, when the corresponding ARG | 
|  | has also been wrapped in a pointer (by fortran_argument_convert).  This | 
|  | informs the debugger that these arguments should be passed as a pointer | 
|  | rather than as the pointed to type.  */ | 
|  |  | 
|  | extern struct type *fortran_preserve_arg_pointer (struct value *arg, | 
|  | struct type *type); | 
|  |  | 
|  | /* Fortran arrays can have a negative stride.  When this happens it is | 
|  | often the case that the base address for an object is not the lowest | 
|  | address occupied by that object.  For example, an array slice (10:1:-1) | 
|  | will be encoded with lower bound 1, upper bound 10, a stride of | 
|  | -ELEMENT_SIZE, and have a base address pointer that points at the | 
|  | element with the highest address in memory. | 
|  |  | 
|  | This really doesn't play well with our current model of value contents, | 
|  | but could easily require a significant update in order to be supported | 
|  | "correctly". | 
|  |  | 
|  | For now, we manually force the base address to be the lowest addressed | 
|  | element here.  Yes, this will break some things, but it fixes other | 
|  | things.  The hope is that it fixes more than it breaks.  */ | 
|  |  | 
|  | extern CORE_ADDR fortran_adjust_dynamic_array_base_address_hack | 
|  | (struct type *type, CORE_ADDR address); | 
|  |  | 
|  | #endif /* F_LANG_H */ |