| /* 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 */ |