1 1.1 christos /* Fortran language support routines for GDB, the GNU debugger. 2 1.1 christos 3 1.11 christos Copyright (C) 1993-2024 Free Software Foundation, Inc. 4 1.1 christos 5 1.1 christos Contributed by Motorola. Adapted from the C parser by Farooq Butt 6 1.1 christos (fmbutt (at) engage.sps.mot.com). 7 1.1 christos 8 1.1 christos This file is part of GDB. 9 1.1 christos 10 1.1 christos This program is free software; you can redistribute it and/or modify 11 1.1 christos it under the terms of the GNU General Public License as published by 12 1.1 christos the Free Software Foundation; either version 3 of the License, or 13 1.1 christos (at your option) any later version. 14 1.1 christos 15 1.1 christos This program is distributed in the hope that it will be useful, 16 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 17 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 1.1 christos GNU General Public License for more details. 19 1.1 christos 20 1.1 christos You should have received a copy of the GNU General Public License 21 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 22 1.1 christos 23 1.1 christos #include "symtab.h" 24 1.1 christos #include "gdbtypes.h" 25 1.1 christos #include "expression.h" 26 1.1 christos #include "parser-defs.h" 27 1.1 christos #include "language.h" 28 1.1 christos #include "varobj.h" 29 1.9 christos #include "gdbcore.h" 30 1.1 christos #include "f-lang.h" 31 1.1 christos #include "valprint.h" 32 1.1 christos #include "value.h" 33 1.1 christos #include "cp-support.h" 34 1.1 christos #include "charset.h" 35 1.1 christos #include "c-lang.h" 36 1.9 christos #include "target-float.h" 37 1.9 christos #include "gdbarch.h" 38 1.11 christos #include "cli/cli-cmds.h" 39 1.10 christos #include "f-array-walker.h" 40 1.10 christos #include "f-exp.h" 41 1.1 christos 42 1.9 christos #include <math.h> 43 1.1 christos 44 1.10 christos /* Whether GDB should repack array slices created by the user. */ 45 1.10 christos static bool repack_array_slices = false; 46 1.10 christos 47 1.10 christos /* Implement 'show fortran repack-array-slices'. */ 48 1.10 christos static void 49 1.10 christos show_repack_array_slices (struct ui_file *file, int from_tty, 50 1.10 christos struct cmd_list_element *c, const char *value) 51 1.10 christos { 52 1.10 christos gdb_printf (file, _("Repacking of Fortran array slices is %s.\n"), 53 1.10 christos value); 54 1.10 christos } 55 1.10 christos 56 1.10 christos /* Debugging of Fortran's array slicing. */ 57 1.10 christos static bool fortran_array_slicing_debug = false; 58 1.10 christos 59 1.10 christos /* Implement 'show debug fortran-array-slicing'. */ 60 1.10 christos static void 61 1.10 christos show_fortran_array_slicing_debug (struct ui_file *file, int from_tty, 62 1.10 christos struct cmd_list_element *c, 63 1.10 christos const char *value) 64 1.10 christos { 65 1.10 christos gdb_printf (file, _("Debugging of Fortran array slicing is %s.\n"), 66 1.10 christos value); 67 1.10 christos } 68 1.10 christos 69 1.1 christos /* Local functions */ 70 1.1 christos 71 1.10 christos static value *fortran_prepare_argument (struct expression *exp, 72 1.10 christos expr::operation *subexp, 73 1.10 christos int arg_num, bool is_internal_call_p, 74 1.10 christos struct type *func_type, enum noside noside); 75 1.10 christos 76 1.1 christos /* Return the encoding that should be used for the character type 77 1.1 christos TYPE. */ 78 1.1 christos 79 1.10 christos const char * 80 1.10 christos f_language::get_encoding (struct type *type) 81 1.1 christos { 82 1.1 christos const char *encoding; 83 1.1 christos 84 1.10 christos switch (type->length ()) 85 1.1 christos { 86 1.1 christos case 1: 87 1.10 christos encoding = target_charset (type->arch ()); 88 1.1 christos break; 89 1.1 christos case 4: 90 1.9 christos if (type_byte_order (type) == BFD_ENDIAN_BIG) 91 1.1 christos encoding = "UTF-32BE"; 92 1.1 christos else 93 1.1 christos encoding = "UTF-32LE"; 94 1.1 christos break; 95 1.1 christos 96 1.1 christos default: 97 1.1 christos error (_("unrecognized character type")); 98 1.1 christos } 99 1.1 christos 100 1.1 christos return encoding; 101 1.1 christos } 102 1.1 christos 103 1.11 christos /* See language.h. */ 104 1.11 christos 105 1.11 christos struct value * 106 1.11 christos f_language::value_string (struct gdbarch *gdbarch, 107 1.11 christos const char *ptr, ssize_t len) const 108 1.11 christos { 109 1.11 christos struct type *type = language_string_char_type (this, gdbarch); 110 1.11 christos return ::value_string (ptr, len, type); 111 1.11 christos } 112 1.11 christos 113 1.10 christos /* A helper function for the "bound" intrinsics that checks that TYPE 114 1.10 christos is an array. LBOUND_P is true for lower bound; this is used for 115 1.10 christos the error message, if any. */ 116 1.10 christos 117 1.10 christos static void 118 1.10 christos fortran_require_array (struct type *type, bool lbound_p) 119 1.10 christos { 120 1.10 christos type = check_typedef (type); 121 1.10 christos if (type->code () != TYPE_CODE_ARRAY) 122 1.10 christos { 123 1.10 christos if (lbound_p) 124 1.10 christos error (_("LBOUND can only be applied to arrays")); 125 1.10 christos else 126 1.10 christos error (_("UBOUND can only be applied to arrays")); 127 1.10 christos } 128 1.10 christos } 129 1.1 christos 130 1.10 christos /* Create an array containing the lower bounds (when LBOUND_P is true) or 131 1.10 christos the upper bounds (when LBOUND_P is false) of ARRAY (which must be of 132 1.10 christos array type). GDBARCH is the current architecture. */ 133 1.1 christos 134 1.10 christos static struct value * 135 1.10 christos fortran_bounds_all_dims (bool lbound_p, 136 1.10 christos struct gdbarch *gdbarch, 137 1.10 christos struct value *array) 138 1.1 christos { 139 1.11 christos type *array_type = check_typedef (array->type ()); 140 1.10 christos int ndimensions = calc_f77_array_dims (array_type); 141 1.10 christos 142 1.10 christos /* Allocate a result value of the correct type. */ 143 1.11 christos type_allocator alloc (gdbarch); 144 1.10 christos struct type *range 145 1.11 christos = create_static_range_type (alloc, 146 1.10 christos builtin_f_type (gdbarch)->builtin_integer, 147 1.10 christos 1, ndimensions); 148 1.10 christos struct type *elm_type = builtin_f_type (gdbarch)->builtin_integer; 149 1.11 christos struct type *result_type = create_array_type (alloc, elm_type, range); 150 1.11 christos struct value *result = value::allocate (result_type); 151 1.10 christos 152 1.10 christos /* Walk the array dimensions backwards due to the way the array will be 153 1.10 christos laid out in memory, the first dimension will be the most inner. */ 154 1.10 christos LONGEST elm_len = elm_type->length (); 155 1.10 christos for (LONGEST dst_offset = elm_len * (ndimensions - 1); 156 1.10 christos dst_offset >= 0; 157 1.10 christos dst_offset -= elm_len) 158 1.10 christos { 159 1.10 christos LONGEST b; 160 1.10 christos 161 1.10 christos /* Grab the required bound. */ 162 1.10 christos if (lbound_p) 163 1.10 christos b = f77_get_lowerbound (array_type); 164 1.10 christos else 165 1.10 christos b = f77_get_upperbound (array_type); 166 1.10 christos 167 1.10 christos /* And copy the value into the result value. */ 168 1.10 christos struct value *v = value_from_longest (elm_type, b); 169 1.11 christos gdb_assert (dst_offset + v->type ()->length () 170 1.11 christos <= result->type ()->length ()); 171 1.11 christos gdb_assert (v->type ()->length () == elm_len); 172 1.11 christos v->contents_copy (result, dst_offset, 0, elm_len); 173 1.1 christos 174 1.10 christos /* Peel another dimension of the array. */ 175 1.10 christos array_type = array_type->target_type (); 176 1.10 christos } 177 1.9 christos 178 1.10 christos return result; 179 1.10 christos } 180 1.10 christos 181 1.10 christos /* Return the lower bound (when LBOUND_P is true) or the upper bound (when 182 1.10 christos LBOUND_P is false) for dimension DIM_VAL (which must be an integer) of 183 1.10 christos ARRAY (which must be an array). RESULT_TYPE corresponds to the type kind 184 1.10 christos the function should be evaluated in. */ 185 1.10 christos 186 1.10 christos static value * 187 1.10 christos fortran_bounds_for_dimension (bool lbound_p, value *array, value *dim_val, 188 1.10 christos type* result_type) 189 1.9 christos { 190 1.10 christos /* Check the requested dimension is valid for this array. */ 191 1.11 christos type *array_type = check_typedef (array->type ()); 192 1.10 christos int ndimensions = calc_f77_array_dims (array_type); 193 1.10 christos long dim = value_as_long (dim_val); 194 1.10 christos if (dim < 1 || dim > ndimensions) 195 1.10 christos { 196 1.10 christos if (lbound_p) 197 1.10 christos error (_("LBOUND dimension must be from 1 to %d"), ndimensions); 198 1.10 christos else 199 1.10 christos error (_("UBOUND dimension must be from 1 to %d"), ndimensions); 200 1.10 christos } 201 1.9 christos 202 1.10 christos /* Walk the dimensions backwards, due to the ordering in which arrays are 203 1.10 christos laid out the first dimension is the most inner. */ 204 1.10 christos for (int i = ndimensions - 1; i >= 0; --i) 205 1.9 christos { 206 1.10 christos /* If this is the requested dimension then we're done. Grab the 207 1.10 christos bounds and return. */ 208 1.10 christos if (i == dim - 1) 209 1.10 christos { 210 1.10 christos LONGEST b; 211 1.10 christos 212 1.10 christos if (lbound_p) 213 1.10 christos b = f77_get_lowerbound (array_type); 214 1.10 christos else 215 1.10 christos b = f77_get_upperbound (array_type); 216 1.9 christos 217 1.10 christos return value_from_longest (result_type, b); 218 1.9 christos } 219 1.9 christos 220 1.10 christos /* Peel off another dimension of the array. */ 221 1.10 christos array_type = array_type->target_type (); 222 1.10 christos } 223 1.10 christos 224 1.10 christos gdb_assert_not_reached ("failed to find matching dimension"); 225 1.10 christos } 226 1.10 christos 227 1.10 christos /* Return the number of dimensions for a Fortran array or string. */ 228 1.10 christos 229 1.10 christos int 230 1.10 christos calc_f77_array_dims (struct type *array_type) 231 1.10 christos { 232 1.10 christos int ndimen = 1; 233 1.10 christos struct type *tmp_type; 234 1.10 christos 235 1.10 christos if ((array_type->code () == TYPE_CODE_STRING)) 236 1.10 christos return 1; 237 1.10 christos 238 1.10 christos if ((array_type->code () != TYPE_CODE_ARRAY)) 239 1.10 christos error (_("Can't get dimensions for a non-array type")); 240 1.10 christos 241 1.10 christos tmp_type = array_type; 242 1.10 christos 243 1.10 christos while ((tmp_type = tmp_type->target_type ())) 244 1.10 christos { 245 1.10 christos if (tmp_type->code () == TYPE_CODE_ARRAY) 246 1.10 christos ++ndimen; 247 1.10 christos } 248 1.10 christos return ndimen; 249 1.10 christos } 250 1.10 christos 251 1.10 christos /* A class used by FORTRAN_VALUE_SUBARRAY when repacking Fortran array 252 1.10 christos slices. This is a base class for two alternative repacking mechanisms, 253 1.10 christos one for when repacking from a lazy value, and one for repacking from a 254 1.10 christos non-lazy (already loaded) value. */ 255 1.10 christos class fortran_array_repacker_base_impl 256 1.10 christos : public fortran_array_walker_base_impl 257 1.10 christos { 258 1.10 christos public: 259 1.10 christos /* Constructor, DEST is the value we are repacking into. */ 260 1.10 christos fortran_array_repacker_base_impl (struct value *dest) 261 1.10 christos : m_dest (dest), 262 1.10 christos m_dest_offset (0) 263 1.10 christos { /* Nothing. */ } 264 1.10 christos 265 1.10 christos /* When we start processing the inner most dimension, this is where we 266 1.10 christos will be creating values for each element as we load them and then copy 267 1.10 christos them into the M_DEST value. Set a value mark so we can free these 268 1.10 christos temporary values. */ 269 1.10 christos void start_dimension (struct type *index_type, LONGEST nelts, bool inner_p) 270 1.10 christos { 271 1.10 christos if (inner_p) 272 1.9 christos { 273 1.11 christos gdb_assert (!m_mark.has_value ()); 274 1.11 christos m_mark.emplace (); 275 1.9 christos } 276 1.10 christos } 277 1.9 christos 278 1.10 christos /* When we finish processing the inner most dimension free all temporary 279 1.10 christos value that were created. */ 280 1.10 christos void finish_dimension (bool inner_p, bool last_p) 281 1.10 christos { 282 1.10 christos if (inner_p) 283 1.9 christos { 284 1.11 christos gdb_assert (m_mark.has_value ()); 285 1.11 christos m_mark.reset (); 286 1.9 christos } 287 1.10 christos } 288 1.10 christos 289 1.10 christos protected: 290 1.10 christos /* Copy the contents of array element ELT into M_DEST at the next 291 1.10 christos available offset. */ 292 1.10 christos void copy_element_to_dest (struct value *elt) 293 1.10 christos { 294 1.11 christos elt->contents_copy (m_dest, m_dest_offset, 0, 295 1.11 christos elt->type ()->length ()); 296 1.11 christos m_dest_offset += elt->type ()->length (); 297 1.10 christos } 298 1.10 christos 299 1.10 christos /* The value being written to. */ 300 1.10 christos struct value *m_dest; 301 1.10 christos 302 1.10 christos /* The byte offset in M_DEST at which the next element should be 303 1.10 christos written. */ 304 1.10 christos LONGEST m_dest_offset; 305 1.10 christos 306 1.11 christos /* Set and reset to handle removing intermediate values from the 307 1.11 christos value chain. */ 308 1.11 christos std::optional<scoped_value_mark> m_mark; 309 1.10 christos }; 310 1.10 christos 311 1.10 christos /* A class used by FORTRAN_VALUE_SUBARRAY when repacking Fortran array 312 1.10 christos slices. This class is specialised for repacking an array slice from a 313 1.10 christos lazy array value, as such it does not require the parent array value to 314 1.10 christos be loaded into GDB's memory; the parent value could be huge, while the 315 1.10 christos slice could be tiny. */ 316 1.10 christos class fortran_lazy_array_repacker_impl 317 1.10 christos : public fortran_array_repacker_base_impl 318 1.10 christos { 319 1.10 christos public: 320 1.10 christos /* Constructor. TYPE is the type of the slice being loaded from the 321 1.10 christos parent value, so this type will correctly reflect the strides required 322 1.10 christos to find all of the elements from the parent value. ADDRESS is the 323 1.10 christos address in target memory of value matching TYPE, and DEST is the value 324 1.10 christos we are repacking into. */ 325 1.10 christos explicit fortran_lazy_array_repacker_impl (struct type *type, 326 1.10 christos CORE_ADDR address, 327 1.10 christos struct value *dest) 328 1.10 christos : fortran_array_repacker_base_impl (dest), 329 1.10 christos m_addr (address) 330 1.10 christos { /* Nothing. */ } 331 1.10 christos 332 1.10 christos /* Create a lazy value in target memory representing a single element, 333 1.10 christos then load the element into GDB's memory and copy the contents into the 334 1.10 christos destination value. */ 335 1.10 christos void process_element (struct type *elt_type, LONGEST elt_off, 336 1.10 christos LONGEST index, bool last_p) 337 1.10 christos { 338 1.10 christos copy_element_to_dest (value_at_lazy (elt_type, m_addr + elt_off)); 339 1.10 christos } 340 1.10 christos 341 1.10 christos private: 342 1.10 christos /* The address in target memory where the parent value starts. */ 343 1.10 christos CORE_ADDR m_addr; 344 1.10 christos }; 345 1.10 christos 346 1.10 christos /* A class used by FORTRAN_VALUE_SUBARRAY when repacking Fortran array 347 1.10 christos slices. This class is specialised for repacking an array slice from a 348 1.10 christos previously loaded (non-lazy) array value, as such it fetches the 349 1.10 christos element values from the contents of the parent value. */ 350 1.10 christos class fortran_array_repacker_impl 351 1.10 christos : public fortran_array_repacker_base_impl 352 1.10 christos { 353 1.10 christos public: 354 1.10 christos /* Constructor. TYPE is the type for the array slice within the parent 355 1.10 christos value, as such it has stride values as required to find the elements 356 1.10 christos within the original parent value. ADDRESS is the address in target 357 1.10 christos memory of the value matching TYPE. BASE_OFFSET is the offset from 358 1.10 christos the start of VAL's content buffer to the start of the object of TYPE, 359 1.10 christos VAL is the parent object from which we are loading the value, and 360 1.10 christos DEST is the value into which we are repacking. */ 361 1.10 christos explicit fortran_array_repacker_impl (struct type *type, CORE_ADDR address, 362 1.10 christos LONGEST base_offset, 363 1.10 christos struct value *val, struct value *dest) 364 1.10 christos : fortran_array_repacker_base_impl (dest), 365 1.10 christos m_base_offset (base_offset), 366 1.10 christos m_val (val) 367 1.10 christos { 368 1.11 christos gdb_assert (!val->lazy ()); 369 1.10 christos } 370 1.10 christos 371 1.10 christos /* Extract an element of ELT_TYPE at offset (M_BASE_OFFSET + ELT_OFF) 372 1.10 christos from the content buffer of M_VAL then copy this extracted value into 373 1.10 christos the repacked destination value. */ 374 1.10 christos void process_element (struct type *elt_type, LONGEST elt_off, 375 1.10 christos LONGEST index, bool last_p) 376 1.10 christos { 377 1.10 christos struct value *elt 378 1.10 christos = value_from_component (m_val, elt_type, (elt_off + m_base_offset)); 379 1.10 christos copy_element_to_dest (elt); 380 1.10 christos } 381 1.10 christos 382 1.10 christos private: 383 1.10 christos /* The offset into the content buffer of M_VAL to the start of the slice 384 1.10 christos being extracted. */ 385 1.10 christos LONGEST m_base_offset; 386 1.10 christos 387 1.10 christos /* The parent value from which we are extracting a slice. */ 388 1.10 christos struct value *m_val; 389 1.10 christos }; 390 1.10 christos 391 1.10 christos 392 1.10 christos /* Evaluate FORTRAN_ASSOCIATED expressions. Both GDBARCH and LANG are 393 1.10 christos extracted from the expression being evaluated. POINTER is the required 394 1.10 christos first argument to the 'associated' keyword, and TARGET is the optional 395 1.10 christos second argument, this will be nullptr if the user only passed one 396 1.10 christos argument to their use of 'associated'. */ 397 1.10 christos 398 1.10 christos static struct value * 399 1.10 christos fortran_associated (struct gdbarch *gdbarch, const language_defn *lang, 400 1.10 christos struct value *pointer, struct value *target = nullptr) 401 1.10 christos { 402 1.10 christos struct type *result_type = language_bool_type (lang, gdbarch); 403 1.10 christos 404 1.10 christos /* All Fortran pointers should have the associated property, this is 405 1.10 christos how we know the pointer is pointing at something or not. */ 406 1.11 christos struct type *pointer_type = check_typedef (pointer->type ()); 407 1.10 christos if (TYPE_ASSOCIATED_PROP (pointer_type) == nullptr 408 1.10 christos && pointer_type->code () != TYPE_CODE_PTR) 409 1.10 christos error (_("ASSOCIATED can only be applied to pointers")); 410 1.10 christos 411 1.10 christos /* Get an address from POINTER. Fortran (or at least gfortran) models 412 1.10 christos array pointers as arrays with a dynamic data address, so we need to 413 1.10 christos use two approaches here, for real pointers we take the contents of the 414 1.10 christos pointer as an address. For non-pointers we take the address of the 415 1.10 christos content. */ 416 1.10 christos CORE_ADDR pointer_addr; 417 1.10 christos if (pointer_type->code () == TYPE_CODE_PTR) 418 1.10 christos pointer_addr = value_as_address (pointer); 419 1.10 christos else 420 1.11 christos pointer_addr = pointer->address (); 421 1.10 christos 422 1.10 christos /* The single argument case, is POINTER associated with anything? */ 423 1.10 christos if (target == nullptr) 424 1.10 christos { 425 1.10 christos bool is_associated = false; 426 1.10 christos 427 1.10 christos /* If POINTER is an actual pointer and doesn't have an associated 428 1.10 christos property then we need to figure out whether this pointer is 429 1.10 christos associated by looking at the value of the pointer itself. We make 430 1.10 christos the assumption that a non-associated pointer will be set to 0. 431 1.10 christos This is probably true for most targets, but might not be true for 432 1.10 christos everyone. */ 433 1.10 christos if (pointer_type->code () == TYPE_CODE_PTR 434 1.10 christos && TYPE_ASSOCIATED_PROP (pointer_type) == nullptr) 435 1.10 christos is_associated = (pointer_addr != 0); 436 1.10 christos else 437 1.10 christos is_associated = !type_not_associated (pointer_type); 438 1.10 christos return value_from_longest (result_type, is_associated ? 1 : 0); 439 1.10 christos } 440 1.10 christos 441 1.10 christos /* The two argument case, is POINTER associated with TARGET? */ 442 1.10 christos 443 1.11 christos struct type *target_type = check_typedef (target->type ()); 444 1.10 christos 445 1.10 christos struct type *pointer_target_type; 446 1.10 christos if (pointer_type->code () == TYPE_CODE_PTR) 447 1.10 christos pointer_target_type = pointer_type->target_type (); 448 1.10 christos else 449 1.10 christos pointer_target_type = pointer_type; 450 1.10 christos 451 1.10 christos struct type *target_target_type; 452 1.10 christos if (target_type->code () == TYPE_CODE_PTR) 453 1.10 christos target_target_type = target_type->target_type (); 454 1.10 christos else 455 1.10 christos target_target_type = target_type; 456 1.10 christos 457 1.10 christos if (pointer_target_type->code () != target_target_type->code () 458 1.10 christos || (pointer_target_type->code () != TYPE_CODE_ARRAY 459 1.10 christos && (pointer_target_type->length () 460 1.10 christos != target_target_type->length ()))) 461 1.10 christos error (_("arguments to associated must be of same type and kind")); 462 1.10 christos 463 1.10 christos /* If TARGET is not in memory, or the original pointer is specifically 464 1.10 christos known to be not associated with anything, then the answer is obviously 465 1.10 christos false. Alternatively, if POINTER is an actual pointer and has no 466 1.10 christos associated property, then we have to check if its associated by 467 1.10 christos looking the value of the pointer itself. We make the assumption that 468 1.10 christos a non-associated pointer will be set to 0. This is probably true for 469 1.10 christos most targets, but might not be true for everyone. */ 470 1.11 christos if (target->lval () != lval_memory 471 1.10 christos || type_not_associated (pointer_type) 472 1.10 christos || (TYPE_ASSOCIATED_PROP (pointer_type) == nullptr 473 1.10 christos && pointer_type->code () == TYPE_CODE_PTR 474 1.10 christos && pointer_addr == 0)) 475 1.10 christos return value_from_longest (result_type, 0); 476 1.10 christos 477 1.10 christos /* See the comment for POINTER_ADDR above. */ 478 1.10 christos CORE_ADDR target_addr; 479 1.10 christos if (target_type->code () == TYPE_CODE_PTR) 480 1.10 christos target_addr = value_as_address (target); 481 1.10 christos else 482 1.11 christos target_addr = target->address (); 483 1.10 christos 484 1.10 christos /* Wrap the following checks inside a do { ... } while (false) loop so 485 1.10 christos that we can use `break' to jump out of the loop. */ 486 1.10 christos bool is_associated = false; 487 1.10 christos do 488 1.10 christos { 489 1.10 christos /* If the addresses are different then POINTER is definitely not 490 1.10 christos pointing at TARGET. */ 491 1.10 christos if (pointer_addr != target_addr) 492 1.10 christos break; 493 1.10 christos 494 1.10 christos /* If POINTER is a real pointer (i.e. not an array pointer, which are 495 1.10 christos implemented as arrays with a dynamic content address), then this 496 1.10 christos is all the checking that is needed. */ 497 1.10 christos if (pointer_type->code () == TYPE_CODE_PTR) 498 1.10 christos { 499 1.10 christos is_associated = true; 500 1.10 christos break; 501 1.10 christos } 502 1.10 christos 503 1.10 christos /* We have an array pointer. Check the number of dimensions. */ 504 1.10 christos int pointer_dims = calc_f77_array_dims (pointer_type); 505 1.10 christos int target_dims = calc_f77_array_dims (target_type); 506 1.10 christos if (pointer_dims != target_dims) 507 1.10 christos break; 508 1.10 christos 509 1.10 christos /* Now check that every dimension has the same upper bound, lower 510 1.10 christos bound, and stride value. */ 511 1.10 christos int dim = 0; 512 1.10 christos while (dim < pointer_dims) 513 1.10 christos { 514 1.10 christos LONGEST pointer_lowerbound, pointer_upperbound, pointer_stride; 515 1.10 christos LONGEST target_lowerbound, target_upperbound, target_stride; 516 1.10 christos 517 1.10 christos pointer_type = check_typedef (pointer_type); 518 1.10 christos target_type = check_typedef (target_type); 519 1.10 christos 520 1.10 christos struct type *pointer_range = pointer_type->index_type (); 521 1.10 christos struct type *target_range = target_type->index_type (); 522 1.10 christos 523 1.10 christos if (!get_discrete_bounds (pointer_range, &pointer_lowerbound, 524 1.10 christos &pointer_upperbound)) 525 1.10 christos break; 526 1.10 christos 527 1.10 christos if (!get_discrete_bounds (target_range, &target_lowerbound, 528 1.10 christos &target_upperbound)) 529 1.10 christos break; 530 1.10 christos 531 1.10 christos if (pointer_lowerbound != target_lowerbound 532 1.10 christos || pointer_upperbound != target_upperbound) 533 1.10 christos break; 534 1.10 christos 535 1.10 christos /* Figure out the stride (in bits) for both pointer and target. 536 1.10 christos If either doesn't have a stride then we take the element size, 537 1.10 christos but we need to convert to bits (hence the * 8). */ 538 1.10 christos pointer_stride = pointer_range->bounds ()->bit_stride (); 539 1.10 christos if (pointer_stride == 0) 540 1.10 christos pointer_stride 541 1.10 christos = type_length_units (check_typedef 542 1.10 christos (pointer_type->target_type ())) * 8; 543 1.10 christos target_stride = target_range->bounds ()->bit_stride (); 544 1.10 christos if (target_stride == 0) 545 1.10 christos target_stride 546 1.10 christos = type_length_units (check_typedef 547 1.10 christos (target_type->target_type ())) * 8; 548 1.10 christos if (pointer_stride != target_stride) 549 1.10 christos break; 550 1.10 christos 551 1.10 christos ++dim; 552 1.10 christos } 553 1.9 christos 554 1.10 christos if (dim < pointer_dims) 555 1.10 christos break; 556 1.9 christos 557 1.10 christos is_associated = true; 558 1.9 christos } 559 1.10 christos while (false); 560 1.9 christos 561 1.10 christos return value_from_longest (result_type, is_associated ? 1 : 0); 562 1.9 christos } 563 1.9 christos 564 1.10 christos struct value * 565 1.10 christos eval_op_f_associated (struct type *expect_type, 566 1.10 christos struct expression *exp, 567 1.10 christos enum noside noside, 568 1.10 christos enum exp_opcode opcode, 569 1.10 christos struct value *arg1) 570 1.10 christos { 571 1.10 christos return fortran_associated (exp->gdbarch, exp->language_defn, arg1); 572 1.10 christos } 573 1.10 christos 574 1.10 christos struct value * 575 1.10 christos eval_op_f_associated (struct type *expect_type, 576 1.10 christos struct expression *exp, 577 1.10 christos enum noside noside, 578 1.10 christos enum exp_opcode opcode, 579 1.10 christos struct value *arg1, 580 1.10 christos struct value *arg2) 581 1.10 christos { 582 1.10 christos return fortran_associated (exp->gdbarch, exp->language_defn, arg1, arg2); 583 1.10 christos } 584 1.9 christos 585 1.10 christos /* Implement FORTRAN_ARRAY_SIZE expression, this corresponds to the 'SIZE' 586 1.10 christos keyword. RESULT_TYPE corresponds to the type kind the function should be 587 1.10 christos evaluated in, ARRAY is the value that should be an array, though this will 588 1.10 christos not have been checked before calling this function. DIM is optional, if 589 1.10 christos present then it should be an integer identifying a dimension of the 590 1.10 christos array to ask about. As with ARRAY the validity of DIM is not checked 591 1.10 christos before calling this function. 592 1.10 christos 593 1.10 christos Return either the total number of elements in ARRAY (when DIM is 594 1.10 christos nullptr), or the number of elements in dimension DIM. */ 595 1.10 christos 596 1.10 christos static value * 597 1.10 christos fortran_array_size (value *array, value *dim_val, type *result_type) 598 1.9 christos { 599 1.10 christos /* Check that ARRAY is the correct type. */ 600 1.11 christos struct type *array_type = check_typedef (array->type ()); 601 1.10 christos if (array_type->code () != TYPE_CODE_ARRAY) 602 1.10 christos error (_("SIZE can only be applied to arrays")); 603 1.10 christos if (type_not_allocated (array_type) || type_not_associated (array_type)) 604 1.10 christos error (_("SIZE can only be used on allocated/associated arrays")); 605 1.10 christos 606 1.10 christos int ndimensions = calc_f77_array_dims (array_type); 607 1.10 christos int dim = -1; 608 1.10 christos LONGEST result = 0; 609 1.9 christos 610 1.10 christos if (dim_val != nullptr) 611 1.9 christos { 612 1.11 christos if (check_typedef (dim_val->type ())->code () != TYPE_CODE_INT) 613 1.10 christos error (_("DIM argument to SIZE must be an integer")); 614 1.10 christos dim = (int) value_as_long (dim_val); 615 1.10 christos 616 1.10 christos if (dim < 1 || dim > ndimensions) 617 1.10 christos error (_("DIM argument to SIZE must be between 1 and %d"), 618 1.10 christos ndimensions); 619 1.10 christos } 620 1.10 christos 621 1.10 christos /* Now walk over all the dimensions of the array totalling up the 622 1.10 christos elements in each dimension. */ 623 1.10 christos for (int i = ndimensions - 1; i >= 0; --i) 624 1.10 christos { 625 1.10 christos /* If this is the requested dimension then we're done. Grab the 626 1.10 christos bounds and return. */ 627 1.10 christos if (i == dim - 1 || dim == -1) 628 1.10 christos { 629 1.10 christos LONGEST lbound, ubound; 630 1.10 christos struct type *range = array_type->index_type (); 631 1.10 christos 632 1.10 christos if (!get_discrete_bounds (range, &lbound, &ubound)) 633 1.10 christos error (_("failed to find array bounds")); 634 1.10 christos 635 1.10 christos LONGEST dim_size = (ubound - lbound + 1); 636 1.10 christos if (result == 0) 637 1.10 christos result = dim_size; 638 1.10 christos else 639 1.10 christos result *= dim_size; 640 1.9 christos 641 1.10 christos if (dim != -1) 642 1.10 christos break; 643 1.10 christos } 644 1.9 christos 645 1.10 christos /* Peel off another dimension of the array. */ 646 1.10 christos array_type = array_type->target_type (); 647 1.9 christos } 648 1.9 christos 649 1.10 christos return value_from_longest (result_type, result); 650 1.10 christos } 651 1.10 christos 652 1.10 christos /* See f-exp.h. */ 653 1.10 christos 654 1.10 christos struct value * 655 1.10 christos eval_op_f_array_size (struct type *expect_type, 656 1.10 christos struct expression *exp, 657 1.10 christos enum noside noside, 658 1.10 christos enum exp_opcode opcode, 659 1.10 christos struct value *arg1) 660 1.10 christos { 661 1.10 christos gdb_assert (opcode == FORTRAN_ARRAY_SIZE); 662 1.10 christos 663 1.10 christos type *result_type = builtin_f_type (exp->gdbarch)->builtin_integer; 664 1.10 christos return fortran_array_size (arg1, nullptr, result_type); 665 1.9 christos } 666 1.9 christos 667 1.10 christos /* See f-exp.h. */ 668 1.9 christos 669 1.10 christos struct value * 670 1.10 christos eval_op_f_array_size (struct type *expect_type, 671 1.10 christos struct expression *exp, 672 1.10 christos enum noside noside, 673 1.10 christos enum exp_opcode opcode, 674 1.10 christos struct value *arg1, 675 1.10 christos struct value *arg2) 676 1.10 christos { 677 1.10 christos gdb_assert (opcode == FORTRAN_ARRAY_SIZE); 678 1.10 christos 679 1.10 christos type *result_type = builtin_f_type (exp->gdbarch)->builtin_integer; 680 1.10 christos return fortran_array_size (arg1, arg2, result_type); 681 1.9 christos } 682 1.9 christos 683 1.10 christos /* See f-exp.h. */ 684 1.10 christos 685 1.10 christos value *eval_op_f_array_size (type *expect_type, expression *exp, noside noside, 686 1.10 christos exp_opcode opcode, value *arg1, value *arg2, 687 1.10 christos type *kind_arg) 688 1.10 christos { 689 1.10 christos gdb_assert (opcode == FORTRAN_ARRAY_SIZE); 690 1.10 christos gdb_assert (kind_arg->code () == TYPE_CODE_INT); 691 1.9 christos 692 1.10 christos return fortran_array_size (arg1, arg2, kind_arg); 693 1.9 christos } 694 1.9 christos 695 1.10 christos /* Implement UNOP_FORTRAN_SHAPE expression. Both GDBARCH and LANG are 696 1.10 christos extracted from the expression being evaluated. VAL is the value on 697 1.10 christos which 'shape' was used, this can be any type. 698 1.10 christos 699 1.10 christos Return an array of integers. If VAL is not an array then the returned 700 1.10 christos array should have zero elements. If VAL is an array then the returned 701 1.10 christos array should have one element per dimension, with the element 702 1.10 christos containing the extent of that dimension from VAL. */ 703 1.9 christos 704 1.10 christos static struct value * 705 1.10 christos fortran_array_shape (struct gdbarch *gdbarch, const language_defn *lang, 706 1.10 christos struct value *val) 707 1.1 christos { 708 1.11 christos struct type *val_type = check_typedef (val->type ()); 709 1.1 christos 710 1.10 christos /* If we are passed an array that is either not allocated, or not 711 1.10 christos associated, then this is explicitly not allowed according to the 712 1.10 christos Fortran specification. */ 713 1.10 christos if (val_type->code () == TYPE_CODE_ARRAY 714 1.10 christos && (type_not_associated (val_type) || type_not_allocated (val_type))) 715 1.10 christos error (_("The array passed to SHAPE must be allocated or associated")); 716 1.10 christos 717 1.10 christos /* The Fortran specification allows non-array types to be passed to this 718 1.10 christos function, in which case we get back an empty array. 719 1.10 christos 720 1.10 christos Calculate the number of dimensions for the resulting array. */ 721 1.10 christos int ndimensions = 0; 722 1.10 christos if (val_type->code () == TYPE_CODE_ARRAY) 723 1.10 christos ndimensions = calc_f77_array_dims (val_type); 724 1.10 christos 725 1.10 christos /* Allocate a result value of the correct type. */ 726 1.11 christos type_allocator alloc (gdbarch); 727 1.10 christos struct type *range 728 1.11 christos = create_static_range_type (alloc, 729 1.10 christos builtin_type (gdbarch)->builtin_int, 730 1.10 christos 1, ndimensions); 731 1.10 christos struct type *elm_type = builtin_f_type (gdbarch)->builtin_integer; 732 1.11 christos struct type *result_type = create_array_type (alloc, elm_type, range); 733 1.11 christos struct value *result = value::allocate (result_type); 734 1.10 christos LONGEST elm_len = elm_type->length (); 735 1.10 christos 736 1.10 christos /* Walk the array dimensions backwards due to the way the array will be 737 1.10 christos laid out in memory, the first dimension will be the most inner. 738 1.10 christos 739 1.10 christos If VAL was not an array then ndimensions will be 0, in which case we 740 1.10 christos will never go around this loop. */ 741 1.10 christos for (LONGEST dst_offset = elm_len * (ndimensions - 1); 742 1.10 christos dst_offset >= 0; 743 1.10 christos dst_offset -= elm_len) 744 1.9 christos { 745 1.10 christos LONGEST lbound, ubound; 746 1.10 christos 747 1.10 christos if (!get_discrete_bounds (val_type->index_type (), &lbound, &ubound)) 748 1.10 christos error (_("failed to find array bounds")); 749 1.10 christos 750 1.10 christos LONGEST dim_size = (ubound - lbound + 1); 751 1.10 christos 752 1.10 christos /* And copy the value into the result value. */ 753 1.10 christos struct value *v = value_from_longest (elm_type, dim_size); 754 1.11 christos gdb_assert (dst_offset + v->type ()->length () 755 1.11 christos <= result->type ()->length ()); 756 1.11 christos gdb_assert (v->type ()->length () == elm_len); 757 1.11 christos v->contents_copy (result, dst_offset, 0, elm_len); 758 1.10 christos 759 1.10 christos /* Peel another dimension of the array. */ 760 1.10 christos val_type = val_type->target_type (); 761 1.10 christos } 762 1.1 christos 763 1.10 christos return result; 764 1.10 christos } 765 1.9 christos 766 1.10 christos /* See f-exp.h. */ 767 1.9 christos 768 1.10 christos struct value * 769 1.10 christos eval_op_f_array_shape (struct type *expect_type, struct expression *exp, 770 1.10 christos enum noside noside, enum exp_opcode opcode, 771 1.10 christos struct value *arg1) 772 1.10 christos { 773 1.10 christos gdb_assert (opcode == UNOP_FORTRAN_SHAPE); 774 1.10 christos return fortran_array_shape (exp->gdbarch, exp->language_defn, arg1); 775 1.10 christos } 776 1.9 christos 777 1.10 christos /* A helper function for UNOP_ABS. */ 778 1.9 christos 779 1.10 christos struct value * 780 1.10 christos eval_op_f_abs (struct type *expect_type, struct expression *exp, 781 1.10 christos enum noside noside, 782 1.10 christos enum exp_opcode opcode, 783 1.10 christos struct value *arg1) 784 1.10 christos { 785 1.11 christos struct type *type = arg1->type (); 786 1.10 christos switch (type->code ()) 787 1.10 christos { 788 1.10 christos case TYPE_CODE_FLT: 789 1.10 christos { 790 1.10 christos double d 791 1.11 christos = fabs (target_float_to_host_double (arg1->contents ().data (), 792 1.11 christos arg1->type ())); 793 1.10 christos return value_from_host_double (type, d); 794 1.10 christos } 795 1.10 christos case TYPE_CODE_INT: 796 1.10 christos { 797 1.10 christos LONGEST l = value_as_long (arg1); 798 1.10 christos l = llabs (l); 799 1.10 christos return value_from_longest (type, l); 800 1.10 christos } 801 1.9 christos } 802 1.10 christos error (_("ABS of type %s not supported"), TYPE_SAFE_NAME (type)); 803 1.1 christos } 804 1.1 christos 805 1.10 christos /* A helper function for BINOP_MOD. */ 806 1.1 christos 807 1.10 christos struct value * 808 1.10 christos eval_op_f_mod (struct type *expect_type, struct expression *exp, 809 1.10 christos enum noside noside, 810 1.10 christos enum exp_opcode opcode, 811 1.10 christos struct value *arg1, struct value *arg2) 812 1.9 christos { 813 1.11 christos struct type *type = arg1->type (); 814 1.11 christos if (type->code () != arg2->type ()->code ()) 815 1.10 christos error (_("non-matching types for parameters to MOD ()")); 816 1.10 christos switch (type->code ()) 817 1.9 christos { 818 1.10 christos case TYPE_CODE_FLT: 819 1.10 christos { 820 1.10 christos double d1 821 1.11 christos = target_float_to_host_double (arg1->contents ().data (), 822 1.11 christos arg1->type ()); 823 1.10 christos double d2 824 1.11 christos = target_float_to_host_double (arg2->contents ().data (), 825 1.11 christos arg2->type ()); 826 1.10 christos double d3 = fmod (d1, d2); 827 1.10 christos return value_from_host_double (type, d3); 828 1.10 christos } 829 1.10 christos case TYPE_CODE_INT: 830 1.10 christos { 831 1.10 christos LONGEST v1 = value_as_long (arg1); 832 1.10 christos LONGEST v2 = value_as_long (arg2); 833 1.10 christos if (v2 == 0) 834 1.10 christos error (_("calling MOD (N, 0) is undefined")); 835 1.10 christos LONGEST v3 = v1 - (v1 / v2) * v2; 836 1.11 christos return value_from_longest (arg1->type (), v3); 837 1.10 christos } 838 1.10 christos } 839 1.10 christos error (_("MOD of type %s not supported"), TYPE_SAFE_NAME (type)); 840 1.10 christos } 841 1.10 christos 842 1.10 christos /* A helper function for the different FORTRAN_CEILING overloads. Calculates 843 1.10 christos CEILING for ARG1 (a float type) and returns it in the requested kind type 844 1.10 christos RESULT_TYPE. */ 845 1.10 christos 846 1.10 christos static value * 847 1.10 christos fortran_ceil_operation (value *arg1, type *result_type) 848 1.10 christos { 849 1.11 christos if (arg1->type ()->code () != TYPE_CODE_FLT) 850 1.10 christos error (_("argument to CEILING must be of type float")); 851 1.11 christos double val = target_float_to_host_double (arg1->contents ().data (), 852 1.11 christos arg1->type ()); 853 1.10 christos val = ceil (val); 854 1.10 christos return value_from_longest (result_type, val); 855 1.10 christos } 856 1.10 christos 857 1.10 christos /* A helper function for FORTRAN_CEILING. */ 858 1.10 christos 859 1.10 christos struct value * 860 1.10 christos eval_op_f_ceil (struct type *expect_type, struct expression *exp, 861 1.10 christos enum noside noside, 862 1.10 christos enum exp_opcode opcode, 863 1.10 christos struct value *arg1) 864 1.10 christos { 865 1.10 christos gdb_assert (opcode == FORTRAN_CEILING); 866 1.10 christos type *result_type = builtin_f_type (exp->gdbarch)->builtin_integer; 867 1.10 christos return fortran_ceil_operation (arg1, result_type); 868 1.10 christos } 869 1.10 christos 870 1.10 christos /* A helper function for FORTRAN_CEILING. */ 871 1.10 christos 872 1.10 christos value * 873 1.10 christos eval_op_f_ceil (type *expect_type, expression *exp, noside noside, 874 1.10 christos exp_opcode opcode, value *arg1, type *kind_arg) 875 1.10 christos { 876 1.10 christos gdb_assert (opcode == FORTRAN_CEILING); 877 1.10 christos gdb_assert (kind_arg->code () == TYPE_CODE_INT); 878 1.10 christos return fortran_ceil_operation (arg1, kind_arg); 879 1.10 christos } 880 1.10 christos 881 1.10 christos /* A helper function for the different FORTRAN_FLOOR overloads. Calculates 882 1.10 christos FLOOR for ARG1 (a float type) and returns it in the requested kind type 883 1.10 christos RESULT_TYPE. */ 884 1.10 christos 885 1.10 christos static value * 886 1.10 christos fortran_floor_operation (value *arg1, type *result_type) 887 1.10 christos { 888 1.11 christos if (arg1->type ()->code () != TYPE_CODE_FLT) 889 1.10 christos error (_("argument to FLOOR must be of type float")); 890 1.11 christos double val = target_float_to_host_double (arg1->contents ().data (), 891 1.11 christos arg1->type ()); 892 1.10 christos val = floor (val); 893 1.10 christos return value_from_longest (result_type, val); 894 1.10 christos } 895 1.10 christos 896 1.10 christos /* A helper function for FORTRAN_FLOOR. */ 897 1.10 christos 898 1.10 christos struct value * 899 1.10 christos eval_op_f_floor (struct type *expect_type, struct expression *exp, 900 1.10 christos enum noside noside, 901 1.10 christos enum exp_opcode opcode, 902 1.10 christos struct value *arg1) 903 1.10 christos { 904 1.10 christos gdb_assert (opcode == FORTRAN_FLOOR); 905 1.10 christos type *result_type = builtin_f_type (exp->gdbarch)->builtin_integer; 906 1.10 christos return fortran_floor_operation (arg1, result_type); 907 1.10 christos } 908 1.10 christos 909 1.10 christos /* A helper function for FORTRAN_FLOOR. */ 910 1.10 christos 911 1.10 christos struct value * 912 1.10 christos eval_op_f_floor (type *expect_type, expression *exp, noside noside, 913 1.10 christos exp_opcode opcode, value *arg1, type *kind_arg) 914 1.10 christos { 915 1.10 christos gdb_assert (opcode == FORTRAN_FLOOR); 916 1.10 christos gdb_assert (kind_arg->code () == TYPE_CODE_INT); 917 1.10 christos return fortran_floor_operation (arg1, kind_arg); 918 1.10 christos } 919 1.10 christos 920 1.10 christos /* A helper function for BINOP_FORTRAN_MODULO. */ 921 1.9 christos 922 1.10 christos struct value * 923 1.10 christos eval_op_f_modulo (struct type *expect_type, struct expression *exp, 924 1.10 christos enum noside noside, 925 1.10 christos enum exp_opcode opcode, 926 1.10 christos struct value *arg1, struct value *arg2) 927 1.10 christos { 928 1.11 christos struct type *type = arg1->type (); 929 1.11 christos if (type->code () != arg2->type ()->code ()) 930 1.10 christos error (_("non-matching types for parameters to MODULO ()")); 931 1.10 christos /* MODULO(A, P) = A - FLOOR (A / P) * P */ 932 1.10 christos switch (type->code ()) 933 1.10 christos { 934 1.10 christos case TYPE_CODE_INT: 935 1.10 christos { 936 1.10 christos LONGEST a = value_as_long (arg1); 937 1.10 christos LONGEST p = value_as_long (arg2); 938 1.10 christos LONGEST result = a - (a / p) * p; 939 1.10 christos if (result != 0 && (a < 0) != (p < 0)) 940 1.10 christos result += p; 941 1.11 christos return value_from_longest (arg1->type (), result); 942 1.10 christos } 943 1.10 christos case TYPE_CODE_FLT: 944 1.10 christos { 945 1.10 christos double a 946 1.11 christos = target_float_to_host_double (arg1->contents ().data (), 947 1.11 christos arg1->type ()); 948 1.10 christos double p 949 1.11 christos = target_float_to_host_double (arg2->contents ().data (), 950 1.11 christos arg2->type ()); 951 1.10 christos double result = fmod (a, p); 952 1.10 christos if (result != 0 && (a < 0.0) != (p < 0.0)) 953 1.10 christos result += p; 954 1.10 christos return value_from_host_double (type, result); 955 1.10 christos } 956 1.9 christos } 957 1.10 christos error (_("MODULO of type %s not supported"), TYPE_SAFE_NAME (type)); 958 1.10 christos } 959 1.10 christos 960 1.10 christos /* A helper function for FORTRAN_CMPLX. */ 961 1.10 christos 962 1.10 christos value * 963 1.10 christos eval_op_f_cmplx (type *expect_type, expression *exp, noside noside, 964 1.10 christos exp_opcode opcode, value *arg1) 965 1.10 christos { 966 1.10 christos gdb_assert (opcode == FORTRAN_CMPLX); 967 1.10 christos 968 1.10 christos type *result_type = builtin_f_type (exp->gdbarch)->builtin_complex; 969 1.10 christos 970 1.11 christos if (arg1->type ()->code () == TYPE_CODE_COMPLEX) 971 1.10 christos return value_cast (result_type, arg1); 972 1.10 christos else 973 1.10 christos return value_literal_complex (arg1, 974 1.11 christos value::zero (arg1->type (), not_lval), 975 1.10 christos result_type); 976 1.9 christos } 977 1.9 christos 978 1.10 christos /* A helper function for FORTRAN_CMPLX. */ 979 1.9 christos 980 1.10 christos struct value * 981 1.10 christos eval_op_f_cmplx (struct type *expect_type, struct expression *exp, 982 1.10 christos enum noside noside, 983 1.10 christos enum exp_opcode opcode, 984 1.10 christos struct value *arg1, struct value *arg2) 985 1.1 christos { 986 1.11 christos if (arg1->type ()->code () == TYPE_CODE_COMPLEX 987 1.11 christos || arg2->type ()->code () == TYPE_CODE_COMPLEX) 988 1.10 christos error (_("Types of arguments for CMPLX called with more then one argument " 989 1.10 christos "must be REAL or INTEGER")); 990 1.1 christos 991 1.10 christos type *result_type = builtin_f_type (exp->gdbarch)->builtin_complex; 992 1.10 christos return value_literal_complex (arg1, arg2, result_type); 993 1.10 christos } 994 1.1 christos 995 1.10 christos /* A helper function for FORTRAN_CMPLX. */ 996 1.9 christos 997 1.10 christos value * 998 1.10 christos eval_op_f_cmplx (type *expect_type, expression *exp, noside noside, 999 1.10 christos exp_opcode opcode, value *arg1, value *arg2, type *kind_arg) 1000 1.10 christos { 1001 1.10 christos gdb_assert (kind_arg->code () == TYPE_CODE_COMPLEX); 1002 1.11 christos if (arg1->type ()->code () == TYPE_CODE_COMPLEX 1003 1.11 christos || arg2->type ()->code () == TYPE_CODE_COMPLEX) 1004 1.10 christos error (_("Types of arguments for CMPLX called with more then one argument " 1005 1.10 christos "must be REAL or INTEGER")); 1006 1.1 christos 1007 1.10 christos return value_literal_complex (arg1, arg2, kind_arg); 1008 1.1 christos } 1009 1.1 christos 1010 1.10 christos /* A helper function for UNOP_FORTRAN_KIND. */ 1011 1.9 christos 1012 1.10 christos struct value * 1013 1.10 christos eval_op_f_kind (struct type *expect_type, struct expression *exp, 1014 1.10 christos enum noside noside, 1015 1.10 christos enum exp_opcode opcode, 1016 1.10 christos struct value *arg1) 1017 1.10 christos { 1018 1.11 christos struct type *type = arg1->type (); 1019 1.9 christos 1020 1.10 christos switch (type->code ()) 1021 1.10 christos { 1022 1.10 christos case TYPE_CODE_STRUCT: 1023 1.10 christos case TYPE_CODE_UNION: 1024 1.10 christos case TYPE_CODE_MODULE: 1025 1.10 christos case TYPE_CODE_FUNC: 1026 1.10 christos error (_("argument to kind must be an intrinsic type")); 1027 1.9 christos } 1028 1.1 christos 1029 1.10 christos if (!type->target_type ()) 1030 1.10 christos return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1031 1.10 christos type->length ()); 1032 1.10 christos return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1033 1.10 christos type->target_type ()->length ()); 1034 1.1 christos } 1035 1.1 christos 1036 1.10 christos /* A helper function for UNOP_FORTRAN_ALLOCATED. */ 1037 1.10 christos 1038 1.10 christos struct value * 1039 1.10 christos eval_op_f_allocated (struct type *expect_type, struct expression *exp, 1040 1.10 christos enum noside noside, enum exp_opcode op, 1041 1.10 christos struct value *arg1) 1042 1.6 christos { 1043 1.11 christos struct type *type = check_typedef (arg1->type ()); 1044 1.10 christos if (type->code () != TYPE_CODE_ARRAY) 1045 1.10 christos error (_("ALLOCATED can only be applied to arrays")); 1046 1.10 christos struct type *result_type 1047 1.10 christos = builtin_f_type (exp->gdbarch)->builtin_logical; 1048 1.10 christos LONGEST result_value = type_not_allocated (type) ? 0 : 1; 1049 1.10 christos return value_from_longest (result_type, result_value); 1050 1.10 christos } 1051 1.10 christos 1052 1.10 christos /* See f-exp.h. */ 1053 1.6 christos 1054 1.10 christos struct value * 1055 1.10 christos eval_op_f_rank (struct type *expect_type, 1056 1.10 christos struct expression *exp, 1057 1.10 christos enum noside noside, 1058 1.10 christos enum exp_opcode op, 1059 1.10 christos struct value *arg1) 1060 1.9 christos { 1061 1.10 christos gdb_assert (op == UNOP_FORTRAN_RANK); 1062 1.10 christos 1063 1.10 christos struct type *result_type 1064 1.10 christos = builtin_f_type (exp->gdbarch)->builtin_integer; 1065 1.11 christos struct type *type = check_typedef (arg1->type ()); 1066 1.10 christos if (type->code () != TYPE_CODE_ARRAY) 1067 1.10 christos return value_from_longest (result_type, 0); 1068 1.10 christos LONGEST ndim = calc_f77_array_dims (type); 1069 1.10 christos return value_from_longest (result_type, ndim); 1070 1.10 christos } 1071 1.9 christos 1072 1.10 christos /* A helper function for UNOP_FORTRAN_LOC. */ 1073 1.9 christos 1074 1.10 christos struct value * 1075 1.10 christos eval_op_f_loc (struct type *expect_type, struct expression *exp, 1076 1.10 christos enum noside noside, enum exp_opcode op, 1077 1.10 christos struct value *arg1) 1078 1.1 christos { 1079 1.10 christos struct type *result_type; 1080 1.10 christos if (gdbarch_ptr_bit (exp->gdbarch) == 16) 1081 1.10 christos result_type = builtin_f_type (exp->gdbarch)->builtin_integer_s2; 1082 1.10 christos else if (gdbarch_ptr_bit (exp->gdbarch) == 32) 1083 1.10 christos result_type = builtin_f_type (exp->gdbarch)->builtin_integer; 1084 1.10 christos else 1085 1.10 christos result_type = builtin_f_type (exp->gdbarch)->builtin_integer_s8; 1086 1.10 christos 1087 1.11 christos LONGEST result_value = arg1->address (); 1088 1.10 christos return value_from_longest (result_type, result_value); 1089 1.10 christos } 1090 1.9 christos 1091 1.10 christos namespace expr 1092 1.10 christos { 1093 1.9 christos 1094 1.10 christos /* Called from evaluate to perform array indexing, and sub-range 1095 1.10 christos extraction, for Fortran. As well as arrays this function also 1096 1.10 christos handles strings as they can be treated like arrays of characters. 1097 1.10 christos ARRAY is the array or string being accessed. EXP and NOSIDE are as 1098 1.10 christos for evaluate. */ 1099 1.10 christos 1100 1.10 christos value * 1101 1.10 christos fortran_undetermined::value_subarray (value *array, 1102 1.10 christos struct expression *exp, 1103 1.10 christos enum noside noside) 1104 1.9 christos { 1105 1.11 christos type *original_array_type = check_typedef (array->type ()); 1106 1.10 christos bool is_string_p = original_array_type->code () == TYPE_CODE_STRING; 1107 1.10 christos const std::vector<operation_up> &ops = std::get<1> (m_storage); 1108 1.10 christos int nargs = ops.size (); 1109 1.10 christos 1110 1.10 christos /* Perform checks for ARRAY not being available. The somewhat overly 1111 1.10 christos complex logic here is just to keep backward compatibility with the 1112 1.10 christos errors that we used to get before FORTRAN_VALUE_SUBARRAY was 1113 1.10 christos rewritten. Maybe a future task would streamline the error messages we 1114 1.10 christos get here, and update all the expected test results. */ 1115 1.10 christos if (ops[0]->opcode () != OP_RANGE) 1116 1.10 christos { 1117 1.10 christos if (type_not_associated (original_array_type)) 1118 1.10 christos error (_("no such vector element (vector not associated)")); 1119 1.10 christos else if (type_not_allocated (original_array_type)) 1120 1.10 christos error (_("no such vector element (vector not allocated)")); 1121 1.10 christos } 1122 1.10 christos else 1123 1.10 christos { 1124 1.10 christos if (type_not_associated (original_array_type)) 1125 1.10 christos error (_("array not associated")); 1126 1.10 christos else if (type_not_allocated (original_array_type)) 1127 1.10 christos error (_("array not allocated")); 1128 1.10 christos } 1129 1.10 christos 1130 1.10 christos /* First check that the number of dimensions in the type we are slicing 1131 1.10 christos matches the number of arguments we were passed. */ 1132 1.10 christos int ndimensions = calc_f77_array_dims (original_array_type); 1133 1.10 christos if (nargs != ndimensions) 1134 1.10 christos error (_("Wrong number of subscripts")); 1135 1.10 christos 1136 1.10 christos /* This will be initialised below with the type of the elements held in 1137 1.10 christos ARRAY. */ 1138 1.10 christos struct type *inner_element_type; 1139 1.10 christos 1140 1.10 christos /* Extract the types of each array dimension from the original array 1141 1.10 christos type. We need these available so we can fill in the default upper and 1142 1.10 christos lower bounds if the user requested slice doesn't provide that 1143 1.10 christos information. Additionally unpacking the dimensions like this gives us 1144 1.10 christos the inner element type. */ 1145 1.10 christos std::vector<struct type *> dim_types; 1146 1.10 christos { 1147 1.10 christos dim_types.reserve (ndimensions); 1148 1.10 christos struct type *type = original_array_type; 1149 1.10 christos for (int i = 0; i < ndimensions; ++i) 1150 1.10 christos { 1151 1.10 christos dim_types.push_back (type); 1152 1.10 christos type = type->target_type (); 1153 1.10 christos } 1154 1.10 christos /* TYPE is now the inner element type of the array, we start the new 1155 1.10 christos array slice off as this type, then as we process the requested slice 1156 1.10 christos (from the user) we wrap new types around this to build up the final 1157 1.10 christos slice type. */ 1158 1.10 christos inner_element_type = type; 1159 1.10 christos } 1160 1.9 christos 1161 1.10 christos /* As we analyse the new slice type we need to understand if the data 1162 1.10 christos being referenced is contiguous. Do decide this we must track the size 1163 1.10 christos of an element at each dimension of the new slice array. Initially the 1164 1.10 christos elements of the inner most dimension of the array are the same inner 1165 1.10 christos most elements as the original ARRAY. */ 1166 1.10 christos LONGEST slice_element_size = inner_element_type->length (); 1167 1.10 christos 1168 1.10 christos /* Start off assuming all data is contiguous, this will be set to false 1169 1.10 christos if access to any dimension results in non-contiguous data. */ 1170 1.10 christos bool is_all_contiguous = true; 1171 1.10 christos 1172 1.10 christos /* The TOTAL_OFFSET is the distance in bytes from the start of the 1173 1.10 christos original ARRAY to the start of the new slice. This is calculated as 1174 1.10 christos we process the information from the user. */ 1175 1.10 christos LONGEST total_offset = 0; 1176 1.10 christos 1177 1.10 christos /* A structure representing information about each dimension of the 1178 1.10 christos resulting slice. */ 1179 1.10 christos struct slice_dim 1180 1.9 christos { 1181 1.10 christos /* Constructor. */ 1182 1.10 christos slice_dim (LONGEST l, LONGEST h, LONGEST s, struct type *idx) 1183 1.10 christos : low (l), 1184 1.10 christos high (h), 1185 1.10 christos stride (s), 1186 1.10 christos index (idx) 1187 1.10 christos { /* Nothing. */ } 1188 1.10 christos 1189 1.10 christos /* The low bound for this dimension of the slice. */ 1190 1.10 christos LONGEST low; 1191 1.10 christos 1192 1.10 christos /* The high bound for this dimension of the slice. */ 1193 1.10 christos LONGEST high; 1194 1.10 christos 1195 1.10 christos /* The byte stride for this dimension of the slice. */ 1196 1.10 christos LONGEST stride; 1197 1.10 christos 1198 1.10 christos struct type *index; 1199 1.10 christos }; 1200 1.10 christos 1201 1.10 christos /* The dimensions of the resulting slice. */ 1202 1.10 christos std::vector<slice_dim> slice_dims; 1203 1.10 christos 1204 1.10 christos /* Process the incoming arguments. These arguments are in the reverse 1205 1.10 christos order to the array dimensions, that is the first argument refers to 1206 1.10 christos the last array dimension. */ 1207 1.10 christos if (fortran_array_slicing_debug) 1208 1.10 christos debug_printf ("Processing array access:\n"); 1209 1.10 christos for (int i = 0; i < nargs; ++i) 1210 1.10 christos { 1211 1.10 christos /* For each dimension of the array the user will have either provided 1212 1.10 christos a ranged access with optional lower bound, upper bound, and 1213 1.10 christos stride, or the user will have supplied a single index. */ 1214 1.10 christos struct type *dim_type = dim_types[ndimensions - (i + 1)]; 1215 1.10 christos fortran_range_operation *range_op 1216 1.10 christos = dynamic_cast<fortran_range_operation *> (ops[i].get ()); 1217 1.10 christos if (range_op != nullptr) 1218 1.10 christos { 1219 1.10 christos enum range_flag range_flag = range_op->get_flags (); 1220 1.10 christos 1221 1.10 christos LONGEST low, high, stride; 1222 1.10 christos low = high = stride = 0; 1223 1.10 christos 1224 1.10 christos if ((range_flag & RANGE_LOW_BOUND_DEFAULT) == 0) 1225 1.10 christos low = value_as_long (range_op->evaluate0 (exp, noside)); 1226 1.10 christos else 1227 1.10 christos low = f77_get_lowerbound (dim_type); 1228 1.10 christos if ((range_flag & RANGE_HIGH_BOUND_DEFAULT) == 0) 1229 1.10 christos high = value_as_long (range_op->evaluate1 (exp, noside)); 1230 1.10 christos else 1231 1.10 christos high = f77_get_upperbound (dim_type); 1232 1.10 christos if ((range_flag & RANGE_HAS_STRIDE) == RANGE_HAS_STRIDE) 1233 1.10 christos stride = value_as_long (range_op->evaluate2 (exp, noside)); 1234 1.10 christos else 1235 1.10 christos stride = 1; 1236 1.10 christos 1237 1.10 christos if (stride == 0) 1238 1.10 christos error (_("stride must not be 0")); 1239 1.10 christos 1240 1.10 christos /* Get information about this dimension in the original ARRAY. */ 1241 1.10 christos struct type *target_type = dim_type->target_type (); 1242 1.10 christos struct type *index_type = dim_type->index_type (); 1243 1.10 christos LONGEST lb = f77_get_lowerbound (dim_type); 1244 1.10 christos LONGEST ub = f77_get_upperbound (dim_type); 1245 1.10 christos LONGEST sd = index_type->bit_stride (); 1246 1.10 christos if (sd == 0) 1247 1.10 christos sd = target_type->length () * 8; 1248 1.10 christos 1249 1.10 christos if (fortran_array_slicing_debug) 1250 1.10 christos { 1251 1.10 christos debug_printf ("|-> Range access\n"); 1252 1.10 christos std::string str = type_to_string (dim_type); 1253 1.10 christos debug_printf ("| |-> Type: %s\n", str.c_str ()); 1254 1.10 christos debug_printf ("| |-> Array:\n"); 1255 1.10 christos debug_printf ("| | |-> Low bound: %s\n", plongest (lb)); 1256 1.10 christos debug_printf ("| | |-> High bound: %s\n", plongest (ub)); 1257 1.10 christos debug_printf ("| | |-> Bit stride: %s\n", plongest (sd)); 1258 1.10 christos debug_printf ("| | |-> Byte stride: %s\n", plongest (sd / 8)); 1259 1.10 christos debug_printf ("| | |-> Type size: %s\n", 1260 1.10 christos pulongest (dim_type->length ())); 1261 1.10 christos debug_printf ("| | '-> Target type size: %s\n", 1262 1.10 christos pulongest (target_type->length ())); 1263 1.10 christos debug_printf ("| |-> Accessing:\n"); 1264 1.10 christos debug_printf ("| | |-> Low bound: %s\n", 1265 1.10 christos plongest (low)); 1266 1.10 christos debug_printf ("| | |-> High bound: %s\n", 1267 1.10 christos plongest (high)); 1268 1.10 christos debug_printf ("| | '-> Element stride: %s\n", 1269 1.10 christos plongest (stride)); 1270 1.10 christos } 1271 1.9 christos 1272 1.10 christos /* Check the user hasn't asked for something invalid. */ 1273 1.10 christos if (high > ub || low < lb) 1274 1.10 christos error (_("array subscript out of bounds")); 1275 1.10 christos 1276 1.10 christos /* Calculate what this dimension of the new slice array will look 1277 1.10 christos like. OFFSET is the byte offset from the start of the 1278 1.10 christos previous (more outer) dimension to the start of this 1279 1.10 christos dimension. E_COUNT is the number of elements in this 1280 1.10 christos dimension. REMAINDER is the number of elements remaining 1281 1.10 christos between the last included element and the upper bound. For 1282 1.10 christos example an access '1:6:2' will include elements 1, 3, 5 and 1283 1.10 christos have a remainder of 1 (element #6). */ 1284 1.10 christos LONGEST lowest = std::min (low, high); 1285 1.10 christos LONGEST offset = (sd / 8) * (lowest - lb); 1286 1.10 christos LONGEST e_count = std::abs (high - low) + 1; 1287 1.10 christos e_count = (e_count + (std::abs (stride) - 1)) / std::abs (stride); 1288 1.10 christos LONGEST new_low = 1; 1289 1.10 christos LONGEST new_high = new_low + e_count - 1; 1290 1.10 christos LONGEST new_stride = (sd * stride) / 8; 1291 1.10 christos LONGEST last_elem = low + ((e_count - 1) * stride); 1292 1.10 christos LONGEST remainder = high - last_elem; 1293 1.10 christos if (low > high) 1294 1.10 christos { 1295 1.10 christos offset += std::abs (remainder) * target_type->length (); 1296 1.10 christos if (stride > 0) 1297 1.10 christos error (_("incorrect stride and boundary combination")); 1298 1.10 christos } 1299 1.10 christos else if (stride < 0) 1300 1.10 christos error (_("incorrect stride and boundary combination")); 1301 1.10 christos 1302 1.10 christos /* Is the data within this dimension contiguous? It is if the 1303 1.10 christos newly computed stride is the same size as a single element of 1304 1.10 christos this dimension. */ 1305 1.10 christos bool is_dim_contiguous = (new_stride == slice_element_size); 1306 1.10 christos is_all_contiguous &= is_dim_contiguous; 1307 1.10 christos 1308 1.10 christos if (fortran_array_slicing_debug) 1309 1.10 christos { 1310 1.10 christos debug_printf ("| '-> Results:\n"); 1311 1.10 christos debug_printf ("| |-> Offset = %s\n", plongest (offset)); 1312 1.10 christos debug_printf ("| |-> Elements = %s\n", plongest (e_count)); 1313 1.10 christos debug_printf ("| |-> Low bound = %s\n", plongest (new_low)); 1314 1.10 christos debug_printf ("| |-> High bound = %s\n", 1315 1.10 christos plongest (new_high)); 1316 1.10 christos debug_printf ("| |-> Byte stride = %s\n", 1317 1.10 christos plongest (new_stride)); 1318 1.10 christos debug_printf ("| |-> Last element = %s\n", 1319 1.10 christos plongest (last_elem)); 1320 1.10 christos debug_printf ("| |-> Remainder = %s\n", 1321 1.10 christos plongest (remainder)); 1322 1.10 christos debug_printf ("| '-> Contiguous = %s\n", 1323 1.10 christos (is_dim_contiguous ? "Yes" : "No")); 1324 1.10 christos } 1325 1.10 christos 1326 1.10 christos /* Figure out how big (in bytes) an element of this dimension of 1327 1.10 christos the new array slice will be. */ 1328 1.10 christos slice_element_size = std::abs (new_stride * e_count); 1329 1.10 christos 1330 1.10 christos slice_dims.emplace_back (new_low, new_high, new_stride, 1331 1.10 christos index_type); 1332 1.10 christos 1333 1.10 christos /* Update the total offset. */ 1334 1.10 christos total_offset += offset; 1335 1.10 christos } 1336 1.10 christos else 1337 1.10 christos { 1338 1.10 christos /* There is a single index for this dimension. */ 1339 1.10 christos LONGEST index 1340 1.10 christos = value_as_long (ops[i]->evaluate_with_coercion (exp, noside)); 1341 1.10 christos 1342 1.10 christos /* Get information about this dimension in the original ARRAY. */ 1343 1.10 christos struct type *target_type = dim_type->target_type (); 1344 1.10 christos struct type *index_type = dim_type->index_type (); 1345 1.10 christos LONGEST lb = f77_get_lowerbound (dim_type); 1346 1.10 christos LONGEST ub = f77_get_upperbound (dim_type); 1347 1.10 christos LONGEST sd = index_type->bit_stride () / 8; 1348 1.10 christos if (sd == 0) 1349 1.10 christos sd = target_type->length (); 1350 1.10 christos 1351 1.10 christos if (fortran_array_slicing_debug) 1352 1.10 christos { 1353 1.10 christos debug_printf ("|-> Index access\n"); 1354 1.10 christos std::string str = type_to_string (dim_type); 1355 1.10 christos debug_printf ("| |-> Type: %s\n", str.c_str ()); 1356 1.10 christos debug_printf ("| |-> Array:\n"); 1357 1.10 christos debug_printf ("| | |-> Low bound: %s\n", plongest (lb)); 1358 1.10 christos debug_printf ("| | |-> High bound: %s\n", plongest (ub)); 1359 1.10 christos debug_printf ("| | |-> Byte stride: %s\n", plongest (sd)); 1360 1.10 christos debug_printf ("| | |-> Type size: %s\n", 1361 1.10 christos pulongest (dim_type->length ())); 1362 1.10 christos debug_printf ("| | '-> Target type size: %s\n", 1363 1.10 christos pulongest (target_type->length ())); 1364 1.10 christos debug_printf ("| '-> Accessing:\n"); 1365 1.10 christos debug_printf ("| '-> Index: %s\n", 1366 1.10 christos plongest (index)); 1367 1.10 christos } 1368 1.10 christos 1369 1.10 christos /* If the array has actual content then check the index is in 1370 1.10 christos bounds. An array without content (an unbound array) doesn't 1371 1.10 christos have a known upper bound, so don't error check in that 1372 1.10 christos situation. */ 1373 1.10 christos if (index < lb 1374 1.11 christos || (dim_type->index_type ()->bounds ()->high.is_available () 1375 1.10 christos && index > ub) 1376 1.11 christos || (array->lval () != lval_memory 1377 1.10 christos && dim_type->index_type ()->bounds ()->high.kind () == PROP_UNDEFINED)) 1378 1.10 christos { 1379 1.10 christos if (type_not_associated (dim_type)) 1380 1.10 christos error (_("no such vector element (vector not associated)")); 1381 1.10 christos else if (type_not_allocated (dim_type)) 1382 1.10 christos error (_("no such vector element (vector not allocated)")); 1383 1.10 christos else 1384 1.10 christos error (_("no such vector element")); 1385 1.10 christos } 1386 1.10 christos 1387 1.10 christos /* Calculate using the type stride, not the target type size. */ 1388 1.10 christos LONGEST offset = sd * (index - lb); 1389 1.10 christos total_offset += offset; 1390 1.10 christos } 1391 1.10 christos } 1392 1.9 christos 1393 1.10 christos /* Build a type that represents the new array slice in the target memory 1394 1.10 christos of the original ARRAY, this type makes use of strides to correctly 1395 1.10 christos find only those elements that are part of the new slice. */ 1396 1.10 christos struct type *array_slice_type = inner_element_type; 1397 1.10 christos for (const auto &d : slice_dims) 1398 1.10 christos { 1399 1.10 christos /* Create the range. */ 1400 1.10 christos dynamic_prop p_low, p_high, p_stride; 1401 1.10 christos 1402 1.10 christos p_low.set_const_val (d.low); 1403 1.10 christos p_high.set_const_val (d.high); 1404 1.10 christos p_stride.set_const_val (d.stride); 1405 1.10 christos 1406 1.11 christos type_allocator alloc (d.index->target_type ()); 1407 1.10 christos struct type *new_range 1408 1.11 christos = create_range_type_with_stride (alloc, 1409 1.10 christos d.index->target_type (), 1410 1.10 christos &p_low, &p_high, 0, &p_stride, 1411 1.10 christos true); 1412 1.10 christos array_slice_type 1413 1.11 christos = create_array_type (alloc, array_slice_type, new_range); 1414 1.10 christos } 1415 1.9 christos 1416 1.10 christos if (fortran_array_slicing_debug) 1417 1.10 christos { 1418 1.10 christos debug_printf ("'-> Final result:\n"); 1419 1.10 christos debug_printf (" |-> Type: %s\n", 1420 1.10 christos type_to_string (array_slice_type).c_str ()); 1421 1.10 christos debug_printf (" |-> Total offset: %s\n", 1422 1.10 christos plongest (total_offset)); 1423 1.10 christos debug_printf (" |-> Base address: %s\n", 1424 1.11 christos core_addr_to_string (array->address ())); 1425 1.10 christos debug_printf (" '-> Contiguous = %s\n", 1426 1.10 christos (is_all_contiguous ? "Yes" : "No")); 1427 1.10 christos } 1428 1.9 christos 1429 1.10 christos /* Should we repack this array slice? */ 1430 1.10 christos if (!is_all_contiguous && (repack_array_slices || is_string_p)) 1431 1.10 christos { 1432 1.10 christos /* Build a type for the repacked slice. */ 1433 1.10 christos struct type *repacked_array_type = inner_element_type; 1434 1.10 christos for (const auto &d : slice_dims) 1435 1.10 christos { 1436 1.10 christos /* Create the range. */ 1437 1.10 christos dynamic_prop p_low, p_high, p_stride; 1438 1.9 christos 1439 1.10 christos p_low.set_const_val (d.low); 1440 1.10 christos p_high.set_const_val (d.high); 1441 1.10 christos p_stride.set_const_val (repacked_array_type->length ()); 1442 1.10 christos 1443 1.11 christos type_allocator alloc (d.index->target_type ()); 1444 1.10 christos struct type *new_range 1445 1.11 christos = create_range_type_with_stride (alloc, 1446 1.10 christos d.index->target_type (), 1447 1.10 christos &p_low, &p_high, 0, &p_stride, 1448 1.10 christos true); 1449 1.10 christos repacked_array_type 1450 1.11 christos = create_array_type (alloc, repacked_array_type, new_range); 1451 1.10 christos } 1452 1.9 christos 1453 1.10 christos /* Now copy the elements from the original ARRAY into the packed 1454 1.10 christos array value DEST. */ 1455 1.11 christos struct value *dest = value::allocate (repacked_array_type); 1456 1.11 christos if (array->lazy () 1457 1.10 christos || (total_offset + array_slice_type->length () 1458 1.11 christos > check_typedef (array->type ())->length ())) 1459 1.10 christos { 1460 1.10 christos fortran_array_walker<fortran_lazy_array_repacker_impl> p 1461 1.11 christos (array_slice_type, array->address () + total_offset, dest); 1462 1.10 christos p.walk (); 1463 1.10 christos } 1464 1.10 christos else 1465 1.10 christos { 1466 1.10 christos fortran_array_walker<fortran_array_repacker_impl> p 1467 1.11 christos (array_slice_type, array->address () + total_offset, 1468 1.10 christos total_offset, array, dest); 1469 1.10 christos p.walk (); 1470 1.10 christos } 1471 1.10 christos array = dest; 1472 1.10 christos } 1473 1.10 christos else 1474 1.10 christos { 1475 1.11 christos if (array->lval () == lval_memory) 1476 1.10 christos { 1477 1.10 christos /* If the value we're taking a slice from is not yet loaded, or 1478 1.10 christos the requested slice is outside the values content range then 1479 1.10 christos just create a new lazy value pointing at the memory where the 1480 1.10 christos contents we're looking for exist. */ 1481 1.11 christos if (array->lazy () 1482 1.10 christos || (total_offset + array_slice_type->length () 1483 1.11 christos > check_typedef (array->type ())->length ())) 1484 1.10 christos array = value_at_lazy (array_slice_type, 1485 1.11 christos array->address () + total_offset); 1486 1.10 christos else 1487 1.10 christos array = value_from_contents_and_address 1488 1.11 christos (array_slice_type, array->contents ().data () + total_offset, 1489 1.11 christos array->address () + total_offset); 1490 1.10 christos } 1491 1.11 christos else if (!array->lazy ()) 1492 1.10 christos array = value_from_component (array, array_slice_type, total_offset); 1493 1.10 christos else 1494 1.10 christos error (_("cannot subscript arrays that are not in memory")); 1495 1.10 christos } 1496 1.9 christos 1497 1.10 christos return array; 1498 1.10 christos } 1499 1.9 christos 1500 1.10 christos value * 1501 1.10 christos fortran_undetermined::evaluate (struct type *expect_type, 1502 1.10 christos struct expression *exp, 1503 1.10 christos enum noside noside) 1504 1.10 christos { 1505 1.10 christos value *callee = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 1506 1.10 christos if (noside == EVAL_AVOID_SIDE_EFFECTS 1507 1.11 christos && is_dynamic_type (callee->type ())) 1508 1.10 christos callee = std::get<0> (m_storage)->evaluate (nullptr, exp, EVAL_NORMAL); 1509 1.11 christos struct type *type = check_typedef (callee->type ()); 1510 1.10 christos enum type_code code = type->code (); 1511 1.9 christos 1512 1.10 christos if (code == TYPE_CODE_PTR) 1513 1.10 christos { 1514 1.10 christos /* Fortran always passes variable to subroutines as pointer. 1515 1.10 christos So we need to look into its target type to see if it is 1516 1.10 christos array, string or function. If it is, we need to switch 1517 1.10 christos to the target value the original one points to. */ 1518 1.10 christos struct type *target_type = check_typedef (type->target_type ()); 1519 1.10 christos 1520 1.10 christos if (target_type->code () == TYPE_CODE_ARRAY 1521 1.10 christos || target_type->code () == TYPE_CODE_STRING 1522 1.10 christos || target_type->code () == TYPE_CODE_FUNC) 1523 1.10 christos { 1524 1.10 christos callee = value_ind (callee); 1525 1.11 christos type = check_typedef (callee->type ()); 1526 1.10 christos code = type->code (); 1527 1.10 christos } 1528 1.10 christos } 1529 1.9 christos 1530 1.10 christos switch (code) 1531 1.10 christos { 1532 1.10 christos case TYPE_CODE_ARRAY: 1533 1.10 christos case TYPE_CODE_STRING: 1534 1.10 christos return value_subarray (callee, exp, noside); 1535 1.10 christos 1536 1.10 christos case TYPE_CODE_PTR: 1537 1.10 christos case TYPE_CODE_FUNC: 1538 1.10 christos case TYPE_CODE_INTERNAL_FUNCTION: 1539 1.9 christos { 1540 1.10 christos /* It's a function call. Allocate arg vector, including 1541 1.10 christos space for the function to be called in argvec[0] and a 1542 1.10 christos termination NULL. */ 1543 1.10 christos const std::vector<operation_up> &actual (std::get<1> (m_storage)); 1544 1.10 christos std::vector<value *> argvec (actual.size ()); 1545 1.10 christos bool is_internal_func = (code == TYPE_CODE_INTERNAL_FUNCTION); 1546 1.10 christos for (int tem = 0; tem < argvec.size (); tem++) 1547 1.10 christos argvec[tem] = fortran_prepare_argument (exp, actual[tem].get (), 1548 1.10 christos tem, is_internal_func, 1549 1.11 christos callee->type (), 1550 1.10 christos noside); 1551 1.10 christos return evaluate_subexp_do_call (exp, noside, callee, argvec, 1552 1.10 christos nullptr, expect_type); 1553 1.9 christos } 1554 1.9 christos 1555 1.10 christos default: 1556 1.10 christos error (_("Cannot perform substring on this type")); 1557 1.10 christos } 1558 1.10 christos } 1559 1.9 christos 1560 1.10 christos value * 1561 1.10 christos fortran_bound_1arg::evaluate (struct type *expect_type, 1562 1.10 christos struct expression *exp, 1563 1.10 christos enum noside noside) 1564 1.10 christos { 1565 1.10 christos bool lbound_p = std::get<0> (m_storage) == FORTRAN_LBOUND; 1566 1.10 christos value *arg1 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 1567 1.11 christos fortran_require_array (arg1->type (), lbound_p); 1568 1.10 christos return fortran_bounds_all_dims (lbound_p, exp->gdbarch, arg1); 1569 1.10 christos } 1570 1.9 christos 1571 1.10 christos value * 1572 1.10 christos fortran_bound_2arg::evaluate (struct type *expect_type, 1573 1.10 christos struct expression *exp, 1574 1.10 christos enum noside noside) 1575 1.10 christos { 1576 1.10 christos bool lbound_p = std::get<0> (m_storage) == FORTRAN_LBOUND; 1577 1.10 christos value *arg1 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 1578 1.11 christos fortran_require_array (arg1->type (), lbound_p); 1579 1.10 christos 1580 1.10 christos /* User asked for the bounds of a specific dimension of the array. */ 1581 1.10 christos value *arg2 = std::get<2> (m_storage)->evaluate (nullptr, exp, noside); 1582 1.11 christos type *type_arg2 = check_typedef (arg2->type ()); 1583 1.10 christos if (type_arg2->code () != TYPE_CODE_INT) 1584 1.10 christos { 1585 1.10 christos if (lbound_p) 1586 1.10 christos error (_("LBOUND second argument should be an integer")); 1587 1.10 christos else 1588 1.10 christos error (_("UBOUND second argument should be an integer")); 1589 1.10 christos } 1590 1.9 christos 1591 1.10 christos type *result_type = builtin_f_type (exp->gdbarch)->builtin_integer; 1592 1.10 christos return fortran_bounds_for_dimension (lbound_p, arg1, arg2, result_type); 1593 1.10 christos } 1594 1.9 christos 1595 1.10 christos value * 1596 1.10 christos fortran_bound_3arg::evaluate (type *expect_type, 1597 1.10 christos expression *exp, 1598 1.10 christos noside noside) 1599 1.10 christos { 1600 1.10 christos const bool lbound_p = std::get<0> (m_storage) == FORTRAN_LBOUND; 1601 1.10 christos value *arg1 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 1602 1.11 christos fortran_require_array (arg1->type (), lbound_p); 1603 1.10 christos 1604 1.10 christos /* User asked for the bounds of a specific dimension of the array. */ 1605 1.10 christos value *arg2 = std::get<2> (m_storage)->evaluate (nullptr, exp, noside); 1606 1.11 christos type *type_arg2 = check_typedef (arg2->type ()); 1607 1.10 christos if (type_arg2->code () != TYPE_CODE_INT) 1608 1.10 christos { 1609 1.10 christos if (lbound_p) 1610 1.10 christos error (_("LBOUND second argument should be an integer")); 1611 1.10 christos else 1612 1.10 christos error (_("UBOUND second argument should be an integer")); 1613 1.10 christos } 1614 1.9 christos 1615 1.10 christos type *kind_arg = std::get<3> (m_storage); 1616 1.10 christos gdb_assert (kind_arg->code () == TYPE_CODE_INT); 1617 1.9 christos 1618 1.10 christos return fortran_bounds_for_dimension (lbound_p, arg1, arg2, kind_arg); 1619 1.10 christos } 1620 1.9 christos 1621 1.10 christos /* Implement STRUCTOP_STRUCT for Fortran. See operation::evaluate in 1622 1.10 christos expression.h for argument descriptions. */ 1623 1.9 christos 1624 1.10 christos value * 1625 1.10 christos fortran_structop_operation::evaluate (struct type *expect_type, 1626 1.10 christos struct expression *exp, 1627 1.10 christos enum noside noside) 1628 1.10 christos { 1629 1.10 christos value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 1630 1.10 christos const char *str = std::get<1> (m_storage).c_str (); 1631 1.10 christos if (noside == EVAL_AVOID_SIDE_EFFECTS) 1632 1.10 christos { 1633 1.11 christos struct type *type = lookup_struct_elt_type (arg1->type (), str, 1); 1634 1.9 christos 1635 1.10 christos if (type != nullptr && is_dynamic_type (type)) 1636 1.10 christos arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, EVAL_NORMAL); 1637 1.10 christos } 1638 1.9 christos 1639 1.10 christos value *elt = value_struct_elt (&arg1, {}, str, NULL, "structure"); 1640 1.9 christos 1641 1.10 christos if (noside == EVAL_AVOID_SIDE_EFFECTS) 1642 1.10 christos { 1643 1.11 christos struct type *elt_type = elt->type (); 1644 1.10 christos if (is_dynamic_type (elt_type)) 1645 1.10 christos { 1646 1.11 christos const gdb_byte *valaddr = elt->contents_for_printing ().data (); 1647 1.11 christos CORE_ADDR address = elt->address (); 1648 1.10 christos gdb::array_view<const gdb_byte> view 1649 1.10 christos = gdb::make_array_view (valaddr, elt_type->length ()); 1650 1.10 christos elt_type = resolve_dynamic_type (elt_type, view, address); 1651 1.10 christos } 1652 1.11 christos elt = value::zero (elt_type, elt->lval ()); 1653 1.10 christos } 1654 1.9 christos 1655 1.10 christos return elt; 1656 1.10 christos } 1657 1.9 christos 1658 1.10 christos } /* namespace expr */ 1659 1.9 christos 1660 1.10 christos /* See language.h. */ 1661 1.9 christos 1662 1.10 christos void 1663 1.10 christos f_language::print_array_index (struct type *index_type, LONGEST index, 1664 1.10 christos struct ui_file *stream, 1665 1.10 christos const value_print_options *options) const 1666 1.10 christos { 1667 1.10 christos struct value *index_value = value_from_longest (index_type, index); 1668 1.9 christos 1669 1.10 christos gdb_printf (stream, "("); 1670 1.10 christos value_print (index_value, stream, options); 1671 1.10 christos gdb_printf (stream, ") = "); 1672 1.10 christos } 1673 1.9 christos 1674 1.10 christos /* See language.h. */ 1675 1.9 christos 1676 1.10 christos void 1677 1.10 christos f_language::language_arch_info (struct gdbarch *gdbarch, 1678 1.10 christos struct language_arch_info *lai) const 1679 1.10 christos { 1680 1.10 christos const struct builtin_f_type *builtin = builtin_f_type (gdbarch); 1681 1.9 christos 1682 1.10 christos /* Helper function to allow shorter lines below. */ 1683 1.10 christos auto add = [&] (struct type * t) 1684 1.9 christos { 1685 1.10 christos lai->add_primitive_type (t); 1686 1.10 christos }; 1687 1.10 christos 1688 1.10 christos add (builtin->builtin_character); 1689 1.10 christos add (builtin->builtin_logical); 1690 1.10 christos add (builtin->builtin_logical_s1); 1691 1.10 christos add (builtin->builtin_logical_s2); 1692 1.10 christos add (builtin->builtin_logical_s8); 1693 1.10 christos add (builtin->builtin_real); 1694 1.10 christos add (builtin->builtin_real_s8); 1695 1.10 christos add (builtin->builtin_real_s16); 1696 1.10 christos add (builtin->builtin_complex); 1697 1.10 christos add (builtin->builtin_complex_s8); 1698 1.10 christos add (builtin->builtin_void); 1699 1.10 christos 1700 1.10 christos lai->set_string_char_type (builtin->builtin_character); 1701 1.10 christos lai->set_bool_type (builtin->builtin_logical, "logical"); 1702 1.10 christos } 1703 1.10 christos 1704 1.10 christos /* See language.h. */ 1705 1.9 christos 1706 1.10 christos unsigned int 1707 1.10 christos f_language::search_name_hash (const char *name) const 1708 1.10 christos { 1709 1.10 christos return cp_search_name_hash (name); 1710 1.10 christos } 1711 1.9 christos 1712 1.10 christos /* See language.h. */ 1713 1.9 christos 1714 1.10 christos struct block_symbol 1715 1.12 christos f_language::lookup_symbol_local (const char *scope, 1716 1.12 christos const char *name, 1717 1.12 christos const struct block *block, 1718 1.12 christos const domain_search_flags domain) const 1719 1.12 christos { 1720 1.12 christos return cp_lookup_symbol_imports (scope, name, block, domain); 1721 1.12 christos } 1722 1.12 christos 1723 1.12 christos /* See language.h. */ 1724 1.12 christos 1725 1.12 christos struct block_symbol 1726 1.10 christos f_language::lookup_symbol_nonlocal (const char *name, 1727 1.10 christos const struct block *block, 1728 1.11 christos const domain_search_flags domain) const 1729 1.10 christos { 1730 1.10 christos return cp_lookup_symbol_nonlocal (this, name, block, domain); 1731 1.10 christos } 1732 1.9 christos 1733 1.10 christos /* See language.h. */ 1734 1.9 christos 1735 1.10 christos symbol_name_matcher_ftype * 1736 1.10 christos f_language::get_symbol_name_matcher_inner 1737 1.10 christos (const lookup_name_info &lookup_name) const 1738 1.10 christos { 1739 1.10 christos return cp_get_symbol_name_matcher (lookup_name); 1740 1.10 christos } 1741 1.1 christos 1742 1.9 christos /* Single instance of the Fortran language class. */ 1743 1.9 christos 1744 1.9 christos static f_language f_language_defn; 1745 1.9 christos 1746 1.10 christos static struct builtin_f_type * 1747 1.1 christos build_fortran_types (struct gdbarch *gdbarch) 1748 1.1 christos { 1749 1.10 christos struct builtin_f_type *builtin_f_type = new struct builtin_f_type; 1750 1.1 christos 1751 1.11 christos builtin_f_type->builtin_void = builtin_type (gdbarch)->builtin_void; 1752 1.11 christos 1753 1.11 christos type_allocator alloc (gdbarch); 1754 1.1 christos 1755 1.1 christos builtin_f_type->builtin_character 1756 1.11 christos = alloc.new_type (TYPE_CODE_CHAR, TARGET_CHAR_BIT, "character"); 1757 1.1 christos 1758 1.1 christos builtin_f_type->builtin_logical_s1 1759 1.11 christos = init_boolean_type (alloc, TARGET_CHAR_BIT, 1, "logical*1"); 1760 1.1 christos 1761 1.10 christos builtin_f_type->builtin_logical_s2 1762 1.11 christos = init_boolean_type (alloc, gdbarch_short_bit (gdbarch), 1, "logical*2"); 1763 1.1 christos 1764 1.10 christos builtin_f_type->builtin_logical 1765 1.11 christos = init_boolean_type (alloc, gdbarch_int_bit (gdbarch), 1, "logical*4"); 1766 1.1 christos 1767 1.1 christos builtin_f_type->builtin_logical_s8 1768 1.11 christos = init_boolean_type (alloc, gdbarch_long_long_bit (gdbarch), 1, 1769 1.1 christos "logical*8"); 1770 1.1 christos 1771 1.10 christos builtin_f_type->builtin_integer_s1 1772 1.11 christos = init_integer_type (alloc, TARGET_CHAR_BIT, 0, "integer*1"); 1773 1.10 christos 1774 1.10 christos builtin_f_type->builtin_integer_s2 1775 1.11 christos = init_integer_type (alloc, gdbarch_short_bit (gdbarch), 0, "integer*2"); 1776 1.10 christos 1777 1.1 christos builtin_f_type->builtin_integer 1778 1.11 christos = init_integer_type (alloc, gdbarch_int_bit (gdbarch), 0, "integer*4"); 1779 1.1 christos 1780 1.10 christos builtin_f_type->builtin_integer_s8 1781 1.11 christos = init_integer_type (alloc, gdbarch_long_long_bit (gdbarch), 0, 1782 1.10 christos "integer*8"); 1783 1.1 christos 1784 1.1 christos builtin_f_type->builtin_real 1785 1.11 christos = init_float_type (alloc, gdbarch_float_bit (gdbarch), 1786 1.10 christos "real*4", gdbarch_float_format (gdbarch)); 1787 1.10 christos 1788 1.1 christos builtin_f_type->builtin_real_s8 1789 1.11 christos = init_float_type (alloc, gdbarch_double_bit (gdbarch), 1790 1.7 christos "real*8", gdbarch_double_format (gdbarch)); 1791 1.10 christos 1792 1.9 christos auto fmt = gdbarch_floatformat_for_type (gdbarch, "real(kind=16)", 128); 1793 1.9 christos if (fmt != nullptr) 1794 1.9 christos builtin_f_type->builtin_real_s16 1795 1.11 christos = init_float_type (alloc, 128, "real*16", fmt); 1796 1.9 christos else if (gdbarch_long_double_bit (gdbarch) == 128) 1797 1.9 christos builtin_f_type->builtin_real_s16 1798 1.11 christos = init_float_type (alloc, gdbarch_long_double_bit (gdbarch), 1799 1.9 christos "real*16", gdbarch_long_double_format (gdbarch)); 1800 1.9 christos else 1801 1.9 christos builtin_f_type->builtin_real_s16 1802 1.11 christos = alloc.new_type (TYPE_CODE_ERROR, 128, "real*16"); 1803 1.1 christos 1804 1.10 christos builtin_f_type->builtin_complex 1805 1.10 christos = init_complex_type ("complex*4", builtin_f_type->builtin_real); 1806 1.10 christos 1807 1.1 christos builtin_f_type->builtin_complex_s8 1808 1.10 christos = init_complex_type ("complex*8", builtin_f_type->builtin_real_s8); 1809 1.9 christos 1810 1.9 christos if (builtin_f_type->builtin_real_s16->code () == TYPE_CODE_ERROR) 1811 1.10 christos builtin_f_type->builtin_complex_s16 1812 1.11 christos = alloc.new_type (TYPE_CODE_ERROR, 256, "complex*16"); 1813 1.9 christos else 1814 1.10 christos builtin_f_type->builtin_complex_s16 1815 1.10 christos = init_complex_type ("complex*16", builtin_f_type->builtin_real_s16); 1816 1.1 christos 1817 1.1 christos return builtin_f_type; 1818 1.1 christos } 1819 1.1 christos 1820 1.10 christos static const registry<gdbarch>::key<struct builtin_f_type> f_type_data; 1821 1.1 christos 1822 1.1 christos const struct builtin_f_type * 1823 1.1 christos builtin_f_type (struct gdbarch *gdbarch) 1824 1.1 christos { 1825 1.10 christos struct builtin_f_type *result = f_type_data.get (gdbarch); 1826 1.10 christos if (result == nullptr) 1827 1.10 christos { 1828 1.10 christos result = build_fortran_types (gdbarch); 1829 1.10 christos f_type_data.set (gdbarch, result); 1830 1.10 christos } 1831 1.10 christos 1832 1.10 christos return result; 1833 1.1 christos } 1834 1.1 christos 1835 1.10 christos /* Command-list for the "set/show fortran" prefix command. */ 1836 1.10 christos static struct cmd_list_element *set_fortran_list; 1837 1.10 christos static struct cmd_list_element *show_fortran_list; 1838 1.10 christos 1839 1.9 christos void _initialize_f_language (); 1840 1.1 christos void 1841 1.9 christos _initialize_f_language () 1842 1.1 christos { 1843 1.10 christos add_setshow_prefix_cmd 1844 1.10 christos ("fortran", no_class, 1845 1.10 christos _("Prefix command for changing Fortran-specific settings."), 1846 1.10 christos _("Generic command for showing Fortran-specific settings."), 1847 1.10 christos &set_fortran_list, &show_fortran_list, 1848 1.10 christos &setlist, &showlist); 1849 1.10 christos 1850 1.10 christos add_setshow_boolean_cmd ("repack-array-slices", class_vars, 1851 1.10 christos &repack_array_slices, _("\ 1852 1.10 christos Enable or disable repacking of non-contiguous array slices."), _("\ 1853 1.10 christos Show whether non-contiguous array slices are repacked."), _("\ 1854 1.10 christos When the user requests a slice of a Fortran array then we can either return\n\ 1855 1.10 christos a descriptor that describes the array in place (using the original array data\n\ 1856 1.10 christos in its existing location) or the original data can be repacked (copied) to a\n\ 1857 1.10 christos new location.\n\ 1858 1.10 christos \n\ 1859 1.10 christos When the content of the array slice is contiguous within the original array\n\ 1860 1.10 christos then the result will never be repacked, but when the data for the new array\n\ 1861 1.10 christos is non-contiguous within the original array repacking will only be performed\n\ 1862 1.10 christos when this setting is on."), 1863 1.10 christos NULL, 1864 1.10 christos show_repack_array_slices, 1865 1.10 christos &set_fortran_list, &show_fortran_list); 1866 1.10 christos 1867 1.10 christos /* Debug Fortran's array slicing logic. */ 1868 1.10 christos add_setshow_boolean_cmd ("fortran-array-slicing", class_maintenance, 1869 1.10 christos &fortran_array_slicing_debug, _("\ 1870 1.10 christos Set debugging of Fortran array slicing."), _("\ 1871 1.10 christos Show debugging of Fortran array slicing."), _("\ 1872 1.10 christos When on, debugging of Fortran array slicing is enabled."), 1873 1.10 christos NULL, 1874 1.10 christos show_fortran_array_slicing_debug, 1875 1.10 christos &setdebuglist, &showdebuglist); 1876 1.1 christos } 1877 1.9 christos 1878 1.10 christos /* Ensures that function argument VALUE is in the appropriate form to 1879 1.10 christos pass to a Fortran function. Returns a possibly new value that should 1880 1.10 christos be used instead of VALUE. 1881 1.10 christos 1882 1.10 christos When IS_ARTIFICIAL is true this indicates an artificial argument, 1883 1.10 christos e.g. hidden string lengths which the GNU Fortran argument passing 1884 1.10 christos convention specifies as being passed by value. 1885 1.10 christos 1886 1.10 christos When IS_ARTIFICIAL is false, the argument is passed by pointer. If the 1887 1.10 christos value is already in target memory then return a value that is a pointer 1888 1.10 christos to VALUE. If VALUE is not in memory (e.g. an integer literal), allocate 1889 1.10 christos space in the target, copy VALUE in, and return a pointer to the in 1890 1.10 christos memory copy. */ 1891 1.9 christos 1892 1.10 christos static struct value * 1893 1.9 christos fortran_argument_convert (struct value *value, bool is_artificial) 1894 1.9 christos { 1895 1.9 christos if (!is_artificial) 1896 1.9 christos { 1897 1.9 christos /* If the value is not in the inferior e.g. registers values, 1898 1.9 christos convenience variables and user input. */ 1899 1.11 christos if (value->lval () != lval_memory) 1900 1.9 christos { 1901 1.11 christos struct type *type = value->type (); 1902 1.10 christos const int length = type->length (); 1903 1.9 christos const CORE_ADDR addr 1904 1.9 christos = value_as_long (value_allocate_space_in_inferior (length)); 1905 1.11 christos write_memory (addr, value->contents ().data (), length); 1906 1.10 christos struct value *val = value_from_contents_and_address 1907 1.11 christos (type, value->contents ().data (), addr); 1908 1.9 christos return value_addr (val); 1909 1.9 christos } 1910 1.9 christos else 1911 1.9 christos return value_addr (value); /* Program variables, e.g. arrays. */ 1912 1.9 christos } 1913 1.9 christos return value; 1914 1.9 christos } 1915 1.9 christos 1916 1.10 christos /* Prepare (and return) an argument value ready for an inferior function 1917 1.10 christos call to a Fortran function. EXP and POS are the expressions describing 1918 1.10 christos the argument to prepare. ARG_NUM is the argument number being 1919 1.10 christos prepared, with 0 being the first argument and so on. FUNC_TYPE is the 1920 1.10 christos type of the function being called. 1921 1.10 christos 1922 1.10 christos IS_INTERNAL_CALL_P is true if this is a call to a function of type 1923 1.10 christos TYPE_CODE_INTERNAL_FUNCTION, otherwise this parameter is false. 1924 1.10 christos 1925 1.10 christos NOSIDE has its usual meaning for expression parsing (see eval.c). 1926 1.10 christos 1927 1.10 christos Arguments in Fortran are normally passed by address, we coerce the 1928 1.10 christos arguments here rather than in value_arg_coerce as otherwise the call to 1929 1.10 christos malloc (to place the non-lvalue parameters in target memory) is hit by 1930 1.10 christos this Fortran specific logic. This results in malloc being called with a 1931 1.10 christos pointer to an integer followed by an attempt to malloc the arguments to 1932 1.10 christos malloc in target memory. Infinite recursion ensues. */ 1933 1.10 christos 1934 1.10 christos static value * 1935 1.10 christos fortran_prepare_argument (struct expression *exp, 1936 1.10 christos expr::operation *subexp, 1937 1.10 christos int arg_num, bool is_internal_call_p, 1938 1.10 christos struct type *func_type, enum noside noside) 1939 1.10 christos { 1940 1.10 christos if (is_internal_call_p) 1941 1.10 christos return subexp->evaluate_with_coercion (exp, noside); 1942 1.10 christos 1943 1.10 christos bool is_artificial = ((arg_num >= func_type->num_fields ()) 1944 1.10 christos ? true 1945 1.11 christos : func_type->field (arg_num).is_artificial ()); 1946 1.10 christos 1947 1.10 christos /* If this is an artificial argument, then either, this is an argument 1948 1.10 christos beyond the end of the known arguments, or possibly, there are no known 1949 1.10 christos arguments (maybe missing debug info). 1950 1.10 christos 1951 1.10 christos For these artificial arguments, if the user has prefixed it with '&' 1952 1.10 christos (for address-of), then lets always allow this to succeed, even if the 1953 1.10 christos argument is not actually in inferior memory. This will allow the user 1954 1.10 christos to pass arguments to a Fortran function even when there's no debug 1955 1.10 christos information. 1956 1.10 christos 1957 1.10 christos As we already pass the address of non-artificial arguments, all we 1958 1.10 christos need to do if skip the UNOP_ADDR operator in the expression and mark 1959 1.10 christos the argument as non-artificial. */ 1960 1.10 christos if (is_artificial) 1961 1.10 christos { 1962 1.10 christos expr::unop_addr_operation *addrop 1963 1.10 christos = dynamic_cast<expr::unop_addr_operation *> (subexp); 1964 1.10 christos if (addrop != nullptr) 1965 1.10 christos { 1966 1.10 christos subexp = addrop->get_expression ().get (); 1967 1.10 christos is_artificial = false; 1968 1.10 christos } 1969 1.10 christos } 1970 1.10 christos 1971 1.10 christos struct value *arg_val = subexp->evaluate_with_coercion (exp, noside); 1972 1.10 christos return fortran_argument_convert (arg_val, is_artificial); 1973 1.10 christos } 1974 1.10 christos 1975 1.9 christos /* See f-lang.h. */ 1976 1.9 christos 1977 1.9 christos struct type * 1978 1.9 christos fortran_preserve_arg_pointer (struct value *arg, struct type *type) 1979 1.9 christos { 1980 1.11 christos if (arg->type ()->code () == TYPE_CODE_PTR) 1981 1.11 christos return arg->type (); 1982 1.9 christos return type; 1983 1.9 christos } 1984 1.10 christos 1985 1.10 christos /* See f-lang.h. */ 1986 1.10 christos 1987 1.10 christos CORE_ADDR 1988 1.10 christos fortran_adjust_dynamic_array_base_address_hack (struct type *type, 1989 1.10 christos CORE_ADDR address) 1990 1.10 christos { 1991 1.10 christos gdb_assert (type->code () == TYPE_CODE_ARRAY); 1992 1.10 christos 1993 1.10 christos /* We can't adjust the base address for arrays that have no content. */ 1994 1.10 christos if (type_not_allocated (type) || type_not_associated (type)) 1995 1.10 christos return address; 1996 1.10 christos 1997 1.10 christos int ndimensions = calc_f77_array_dims (type); 1998 1.10 christos LONGEST total_offset = 0; 1999 1.10 christos 2000 1.10 christos /* Walk through each of the dimensions of this array type and figure out 2001 1.10 christos if any of the dimensions are "backwards", that is the base address 2002 1.10 christos for this dimension points to the element at the highest memory 2003 1.10 christos address and the stride is negative. */ 2004 1.10 christos struct type *tmp_type = type; 2005 1.10 christos for (int i = 0 ; i < ndimensions; ++i) 2006 1.10 christos { 2007 1.10 christos /* Grab the range for this dimension and extract the lower and upper 2008 1.10 christos bounds. */ 2009 1.10 christos tmp_type = check_typedef (tmp_type); 2010 1.10 christos struct type *range_type = tmp_type->index_type (); 2011 1.10 christos LONGEST lowerbound, upperbound, stride; 2012 1.10 christos if (!get_discrete_bounds (range_type, &lowerbound, &upperbound)) 2013 1.10 christos error ("failed to get range bounds"); 2014 1.10 christos 2015 1.10 christos /* Figure out the stride for this dimension. */ 2016 1.10 christos struct type *elt_type = check_typedef (tmp_type->target_type ()); 2017 1.10 christos stride = tmp_type->index_type ()->bounds ()->bit_stride (); 2018 1.10 christos if (stride == 0) 2019 1.10 christos stride = type_length_units (elt_type); 2020 1.10 christos else 2021 1.10 christos { 2022 1.10 christos int unit_size 2023 1.10 christos = gdbarch_addressable_memory_unit_size (elt_type->arch ()); 2024 1.10 christos stride /= (unit_size * 8); 2025 1.10 christos } 2026 1.10 christos 2027 1.10 christos /* If this dimension is "backward" then figure out the offset 2028 1.10 christos adjustment required to point to the element at the lowest memory 2029 1.10 christos address, and add this to the total offset. */ 2030 1.10 christos LONGEST offset = 0; 2031 1.10 christos if (stride < 0 && lowerbound < upperbound) 2032 1.10 christos offset = (upperbound - lowerbound) * stride; 2033 1.10 christos total_offset += offset; 2034 1.10 christos tmp_type = tmp_type->target_type (); 2035 1.10 christos } 2036 1.10 christos 2037 1.10 christos /* Adjust the address of this object and return it. */ 2038 1.10 christos address += total_offset; 2039 1.10 christos return address; 2040 1.10 christos } 2041