]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/compile/compile-object-load.c
a83f95dda93e82a1090942a09e6af27de5a7841b
[thirdparty/binutils-gdb.git] / gdb / compile / compile-object-load.c
1 /* Load module for 'compile' command.
2
3 Copyright (C) 2014-2018 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include "compile-object-load.h"
22 #include "compile-internal.h"
23 #include "command.h"
24 #include "objfiles.h"
25 #include "gdbcore.h"
26 #include "readline/tilde.h"
27 #include "bfdlink.h"
28 #include "gdbcmd.h"
29 #include "regcache.h"
30 #include "inferior.h"
31 #include "gdbthread.h"
32 #include "compile.h"
33 #include "block.h"
34 #include "arch-utils.h"
35 #include <algorithm>
36
37 /* Track inferior memory reserved by inferior mmap. */
38
39 struct munmap_list
40 {
41 struct munmap_list *next;
42 CORE_ADDR addr, size;
43 };
44
45 /* Add inferior mmap memory range ADDR..ADDR+SIZE (exclusive) to list
46 HEADP. *HEADP needs to be initialized to NULL. */
47
48 static void
49 munmap_list_add (struct munmap_list **headp, CORE_ADDR addr, CORE_ADDR size)
50 {
51 struct munmap_list *head_new = XNEW (struct munmap_list);
52
53 head_new->next = *headp;
54 *headp = head_new;
55 head_new->addr = addr;
56 head_new->size = size;
57 }
58
59 /* Free list of inferior mmap memory ranges HEAD. HEAD is the first
60 element of the list, it can be NULL. After calling this function
61 HEAD pointer is invalid and the possible list needs to be
62 reinitialized by caller to NULL. */
63
64 void
65 munmap_list_free (struct munmap_list *head)
66 {
67 while (head)
68 {
69 struct munmap_list *todo = head;
70
71 head = todo->next;
72 gdbarch_infcall_munmap (target_gdbarch (), todo->addr, todo->size);
73 xfree (todo);
74 }
75 }
76
77 /* Stub for munmap_list_free suitable for make_cleanup. Contrary to
78 munmap_list_free this function's parameter is a pointer to the first
79 list element pointer. */
80
81 static void
82 munmap_listp_free_cleanup (void *headp_voidp)
83 {
84 struct munmap_list **headp = (struct munmap_list **) headp_voidp;
85
86 munmap_list_free (*headp);
87 }
88
89 /* Helper data for setup_sections. */
90
91 struct setup_sections_data
92 {
93 /* Size of all recent sections with matching LAST_PROT. */
94 CORE_ADDR last_size;
95
96 /* First section matching LAST_PROT. */
97 asection *last_section_first;
98
99 /* Memory protection like the prot parameter of gdbarch_infcall_mmap. */
100 unsigned last_prot;
101
102 /* Maximum of alignments of all sections matching LAST_PROT.
103 This value is always at least 1. This value is always a power of 2. */
104 CORE_ADDR last_max_alignment;
105
106 /* List of inferior mmap ranges where setup_sections should add its
107 next range. */
108 struct munmap_list **munmap_list_headp;
109 };
110
111 /* Place all ABFD sections next to each other obeying all constraints. */
112
113 static void
114 setup_sections (bfd *abfd, asection *sect, void *data_voidp)
115 {
116 struct setup_sections_data *data = (struct setup_sections_data *) data_voidp;
117 CORE_ADDR alignment;
118 unsigned prot;
119
120 if (sect != NULL)
121 {
122 /* It is required by later bfd_get_relocated_section_contents. */
123 if (sect->output_section == NULL)
124 sect->output_section = sect;
125
126 if ((bfd_get_section_flags (abfd, sect) & SEC_ALLOC) == 0)
127 return;
128
129 /* Make the memory always readable. */
130 prot = GDB_MMAP_PROT_READ;
131 if ((bfd_get_section_flags (abfd, sect) & SEC_READONLY) == 0)
132 prot |= GDB_MMAP_PROT_WRITE;
133 if ((bfd_get_section_flags (abfd, sect) & SEC_CODE) != 0)
134 prot |= GDB_MMAP_PROT_EXEC;
135
136 if (compile_debug)
137 fprintf_unfiltered (gdb_stdlog,
138 "module \"%s\" section \"%s\" size %s prot %u\n",
139 bfd_get_filename (abfd),
140 bfd_get_section_name (abfd, sect),
141 paddress (target_gdbarch (),
142 bfd_get_section_size (sect)),
143 prot);
144 }
145 else
146 prot = -1;
147
148 if (sect == NULL
149 || (data->last_prot != prot && bfd_get_section_size (sect) != 0))
150 {
151 CORE_ADDR addr;
152 asection *sect_iter;
153
154 if (data->last_size != 0)
155 {
156 addr = gdbarch_infcall_mmap (target_gdbarch (), data->last_size,
157 data->last_prot);
158 munmap_list_add (data->munmap_list_headp, addr, data->last_size);
159 if (compile_debug)
160 fprintf_unfiltered (gdb_stdlog,
161 "allocated %s bytes at %s prot %u\n",
162 paddress (target_gdbarch (), data->last_size),
163 paddress (target_gdbarch (), addr),
164 data->last_prot);
165 }
166 else
167 addr = 0;
168
169 if ((addr & (data->last_max_alignment - 1)) != 0)
170 error (_("Inferior compiled module address %s "
171 "is not aligned to BFD required %s."),
172 paddress (target_gdbarch (), addr),
173 paddress (target_gdbarch (), data->last_max_alignment));
174
175 for (sect_iter = data->last_section_first; sect_iter != sect;
176 sect_iter = sect_iter->next)
177 if ((bfd_get_section_flags (abfd, sect_iter) & SEC_ALLOC) != 0)
178 bfd_set_section_vma (abfd, sect_iter,
179 addr + bfd_get_section_vma (abfd, sect_iter));
180
181 data->last_size = 0;
182 data->last_section_first = sect;
183 data->last_prot = prot;
184 data->last_max_alignment = 1;
185 }
186
187 if (sect == NULL)
188 return;
189
190 alignment = ((CORE_ADDR) 1) << bfd_get_section_alignment (abfd, sect);
191 data->last_max_alignment = std::max (data->last_max_alignment, alignment);
192
193 data->last_size = (data->last_size + alignment - 1) & -alignment;
194
195 bfd_set_section_vma (abfd, sect, data->last_size);
196
197 data->last_size += bfd_get_section_size (sect);
198 data->last_size = (data->last_size + alignment - 1) & -alignment;
199 }
200
201 /* Helper for link_callbacks callbacks vector. */
202
203 static void
204 link_callbacks_multiple_definition (struct bfd_link_info *link_info,
205 struct bfd_link_hash_entry *h, bfd *nbfd,
206 asection *nsec, bfd_vma nval)
207 {
208 bfd *abfd = link_info->input_bfds;
209
210 if (link_info->allow_multiple_definition)
211 return;
212 warning (_("Compiled module \"%s\": multiple symbol definitions: %s"),
213 bfd_get_filename (abfd), h->root.string);
214 }
215
216 /* Helper for link_callbacks callbacks vector. */
217
218 static void
219 link_callbacks_warning (struct bfd_link_info *link_info, const char *xwarning,
220 const char *symbol, bfd *abfd, asection *section,
221 bfd_vma address)
222 {
223 warning (_("Compiled module \"%s\" section \"%s\": warning: %s"),
224 bfd_get_filename (abfd), bfd_get_section_name (abfd, section),
225 xwarning);
226 }
227
228 /* Helper for link_callbacks callbacks vector. */
229
230 static void
231 link_callbacks_undefined_symbol (struct bfd_link_info *link_info,
232 const char *name, bfd *abfd, asection *section,
233 bfd_vma address, bfd_boolean is_fatal)
234 {
235 warning (_("Cannot resolve relocation to \"%s\" "
236 "from compiled module \"%s\" section \"%s\"."),
237 name, bfd_get_filename (abfd), bfd_get_section_name (abfd, section));
238 }
239
240 /* Helper for link_callbacks callbacks vector. */
241
242 static void
243 link_callbacks_reloc_overflow (struct bfd_link_info *link_info,
244 struct bfd_link_hash_entry *entry,
245 const char *name, const char *reloc_name,
246 bfd_vma addend, bfd *abfd, asection *section,
247 bfd_vma address)
248 {
249 }
250
251 /* Helper for link_callbacks callbacks vector. */
252
253 static void
254 link_callbacks_reloc_dangerous (struct bfd_link_info *link_info,
255 const char *message, bfd *abfd,
256 asection *section, bfd_vma address)
257 {
258 warning (_("Compiled module \"%s\" section \"%s\": dangerous "
259 "relocation: %s\n"),
260 bfd_get_filename (abfd), bfd_get_section_name (abfd, section),
261 message);
262 }
263
264 /* Helper for link_callbacks callbacks vector. */
265
266 static void
267 link_callbacks_unattached_reloc (struct bfd_link_info *link_info,
268 const char *name, bfd *abfd, asection *section,
269 bfd_vma address)
270 {
271 warning (_("Compiled module \"%s\" section \"%s\": unattached "
272 "relocation: %s\n"),
273 bfd_get_filename (abfd), bfd_get_section_name (abfd, section),
274 name);
275 }
276
277 /* Helper for link_callbacks callbacks vector. */
278
279 static void link_callbacks_einfo (const char *fmt, ...)
280 ATTRIBUTE_PRINTF (1, 2);
281
282 static void
283 link_callbacks_einfo (const char *fmt, ...)
284 {
285 va_list ap;
286
287 va_start (ap, fmt);
288 std::string str = string_vprintf (fmt, ap);
289 va_end (ap);
290
291 warning (_("Compile module: warning: %s"), str.c_str ());
292 }
293
294 /* Helper for bfd_get_relocated_section_contents.
295 Only these symbols are set by bfd_simple_get_relocated_section_contents
296 but bfd/ seems to use even the NULL ones without checking them first. */
297
298 static const struct bfd_link_callbacks link_callbacks =
299 {
300 NULL, /* add_archive_element */
301 link_callbacks_multiple_definition, /* multiple_definition */
302 NULL, /* multiple_common */
303 NULL, /* add_to_set */
304 NULL, /* constructor */
305 link_callbacks_warning, /* warning */
306 link_callbacks_undefined_symbol, /* undefined_symbol */
307 link_callbacks_reloc_overflow, /* reloc_overflow */
308 link_callbacks_reloc_dangerous, /* reloc_dangerous */
309 link_callbacks_unattached_reloc, /* unattached_reloc */
310 NULL, /* notice */
311 link_callbacks_einfo, /* einfo */
312 NULL, /* info */
313 NULL, /* minfo */
314 NULL, /* override_segment_assignment */
315 };
316
317 struct link_hash_table_cleanup_data
318 {
319 bfd *abfd;
320 bfd *link_next;
321 };
322
323 /* Cleanup callback for struct bfd_link_info. */
324
325 static void
326 link_hash_table_free (void *d)
327 {
328 struct link_hash_table_cleanup_data *data
329 = (struct link_hash_table_cleanup_data *) d;
330
331 if (data->abfd->is_linker_output)
332 (*data->abfd->link.hash->hash_table_free) (data->abfd);
333 data->abfd->link.next = data->link_next;
334 }
335
336 /* Relocate and store into inferior memory each section SECT of ABFD. */
337
338 static void
339 copy_sections (bfd *abfd, asection *sect, void *data)
340 {
341 asymbol **symbol_table = (asymbol **) data;
342 bfd_byte *sect_data, *sect_data_got;
343 struct cleanup *cleanups;
344 struct bfd_link_info link_info;
345 struct bfd_link_order link_order;
346 CORE_ADDR inferior_addr;
347 struct link_hash_table_cleanup_data cleanup_data;
348
349 if ((bfd_get_section_flags (abfd, sect) & (SEC_ALLOC | SEC_LOAD))
350 != (SEC_ALLOC | SEC_LOAD))
351 return;
352
353 if (bfd_get_section_size (sect) == 0)
354 return;
355
356 /* Mostly a copy of bfd_simple_get_relocated_section_contents which GDB
357 cannot use as it does not report relocations to undefined symbols. */
358 memset (&link_info, 0, sizeof (link_info));
359 link_info.output_bfd = abfd;
360 link_info.input_bfds = abfd;
361 link_info.input_bfds_tail = &abfd->link.next;
362
363 cleanup_data.abfd = abfd;
364 cleanup_data.link_next = abfd->link.next;
365
366 abfd->link.next = NULL;
367 link_info.hash = bfd_link_hash_table_create (abfd);
368
369 cleanups = make_cleanup (link_hash_table_free, &cleanup_data);
370 link_info.callbacks = &link_callbacks;
371
372 memset (&link_order, 0, sizeof (link_order));
373 link_order.next = NULL;
374 link_order.type = bfd_indirect_link_order;
375 link_order.offset = 0;
376 link_order.size = bfd_get_section_size (sect);
377 link_order.u.indirect.section = sect;
378
379 sect_data = (bfd_byte *) xmalloc (bfd_get_section_size (sect));
380 make_cleanup (xfree, sect_data);
381
382 sect_data_got = bfd_get_relocated_section_contents (abfd, &link_info,
383 &link_order, sect_data,
384 FALSE, symbol_table);
385
386 if (sect_data_got == NULL)
387 error (_("Cannot map compiled module \"%s\" section \"%s\": %s"),
388 bfd_get_filename (abfd), bfd_get_section_name (abfd, sect),
389 bfd_errmsg (bfd_get_error ()));
390 gdb_assert (sect_data_got == sect_data);
391
392 inferior_addr = bfd_get_section_vma (abfd, sect);
393 if (0 != target_write_memory (inferior_addr, sect_data,
394 bfd_get_section_size (sect)))
395 error (_("Cannot write compiled module \"%s\" section \"%s\" "
396 "to inferior memory range %s-%s."),
397 bfd_get_filename (abfd), bfd_get_section_name (abfd, sect),
398 paddress (target_gdbarch (), inferior_addr),
399 paddress (target_gdbarch (),
400 inferior_addr + bfd_get_section_size (sect)));
401
402 do_cleanups (cleanups);
403 }
404
405 /* Fetch the type of COMPILE_I_EXPR_PTR_TYPE and COMPILE_I_EXPR_VAL
406 symbols in OBJFILE so we can calculate how much memory to allocate
407 for the out parameter. This avoids needing a malloc in the generated
408 code. Throw an error if anything fails.
409 GDB first tries to compile the code with COMPILE_I_PRINT_ADDRESS_SCOPE.
410 If it finds user tries to print an array type this function returns
411 NULL. Caller will then regenerate the code with
412 COMPILE_I_PRINT_VALUE_SCOPE, recompiles it again and finally runs it.
413 This is because __auto_type array-to-pointer type conversion of
414 COMPILE_I_EXPR_VAL which gets detected by COMPILE_I_EXPR_PTR_TYPE
415 preserving the array type. */
416
417 static struct type *
418 get_out_value_type (struct symbol *func_sym, struct objfile *objfile,
419 enum compile_i_scope_types scope)
420 {
421 struct symbol *gdb_ptr_type_sym;
422 /* Initialize it just to avoid a GCC false warning. */
423 struct symbol *gdb_val_sym = NULL;
424 struct type *gdb_ptr_type, *gdb_type_from_ptr, *gdb_type, *retval;
425 /* Initialize it just to avoid a GCC false warning. */
426 const struct block *block = NULL;
427 const struct blockvector *bv;
428 int nblocks = 0;
429 int block_loop = 0;
430
431 bv = SYMTAB_BLOCKVECTOR (func_sym->owner.symtab);
432 nblocks = BLOCKVECTOR_NBLOCKS (bv);
433
434 gdb_ptr_type_sym = NULL;
435 for (block_loop = 0; block_loop < nblocks; block_loop++)
436 {
437 struct symbol *function = NULL;
438 const struct block *function_block;
439
440 block = BLOCKVECTOR_BLOCK (bv, block_loop);
441 if (BLOCK_FUNCTION (block) != NULL)
442 continue;
443 gdb_val_sym = block_lookup_symbol (block,
444 COMPILE_I_EXPR_VAL,
445 symbol_name_match_type::SEARCH_NAME,
446 VAR_DOMAIN);
447 if (gdb_val_sym == NULL)
448 continue;
449
450 function_block = block;
451 while (function_block != BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)
452 && function_block != BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK))
453 {
454 function_block = BLOCK_SUPERBLOCK (function_block);
455 function = BLOCK_FUNCTION (function_block);
456 if (function != NULL)
457 break;
458 }
459 if (function != NULL
460 && (BLOCK_SUPERBLOCK (function_block)
461 == BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK))
462 && (strcmp (SYMBOL_LINKAGE_NAME (function), GCC_FE_WRAPPER_FUNCTION)
463 == 0))
464 break;
465 }
466 if (block_loop == nblocks)
467 error (_("No \"%s\" symbol found"), COMPILE_I_EXPR_PTR_TYPE);
468
469 gdb_type = SYMBOL_TYPE (gdb_val_sym);
470 gdb_type = check_typedef (gdb_type);
471
472 gdb_ptr_type_sym = block_lookup_symbol (block, COMPILE_I_EXPR_PTR_TYPE,
473 symbol_name_match_type::SEARCH_NAME,
474 VAR_DOMAIN);
475 if (gdb_ptr_type_sym == NULL)
476 error (_("No \"%s\" symbol found"), COMPILE_I_EXPR_PTR_TYPE);
477 gdb_ptr_type = SYMBOL_TYPE (gdb_ptr_type_sym);
478 gdb_ptr_type = check_typedef (gdb_ptr_type);
479 if (TYPE_CODE (gdb_ptr_type) != TYPE_CODE_PTR)
480 error (_("Type of \"%s\" is not a pointer"), COMPILE_I_EXPR_PTR_TYPE);
481 gdb_type_from_ptr = TYPE_TARGET_TYPE (gdb_ptr_type);
482
483 if (types_deeply_equal (gdb_type, gdb_type_from_ptr))
484 {
485 if (scope != COMPILE_I_PRINT_ADDRESS_SCOPE)
486 error (_("Expected address scope in compiled module \"%s\"."),
487 objfile_name (objfile));
488 return gdb_type;
489 }
490
491 if (TYPE_CODE (gdb_type) != TYPE_CODE_PTR)
492 error (_("Invalid type code %d of symbol \"%s\" "
493 "in compiled module \"%s\"."),
494 TYPE_CODE (gdb_type_from_ptr), COMPILE_I_EXPR_VAL,
495 objfile_name (objfile));
496
497 retval = gdb_type_from_ptr;
498 switch (TYPE_CODE (gdb_type_from_ptr))
499 {
500 case TYPE_CODE_ARRAY:
501 gdb_type_from_ptr = TYPE_TARGET_TYPE (gdb_type_from_ptr);
502 break;
503 case TYPE_CODE_FUNC:
504 break;
505 default:
506 error (_("Invalid type code %d of symbol \"%s\" "
507 "in compiled module \"%s\"."),
508 TYPE_CODE (gdb_type_from_ptr), COMPILE_I_EXPR_PTR_TYPE,
509 objfile_name (objfile));
510 }
511 if (!types_deeply_equal (gdb_type_from_ptr,
512 TYPE_TARGET_TYPE (gdb_type)))
513 error (_("Referenced types do not match for symbols \"%s\" and \"%s\" "
514 "in compiled module \"%s\"."),
515 COMPILE_I_EXPR_PTR_TYPE, COMPILE_I_EXPR_VAL,
516 objfile_name (objfile));
517 if (scope == COMPILE_I_PRINT_ADDRESS_SCOPE)
518 return NULL;
519 return retval;
520 }
521
522 /* Fetch the type of first parameter of FUNC_SYM.
523 Return NULL if FUNC_SYM has no parameters. Throw an error otherwise. */
524
525 static struct type *
526 get_regs_type (struct symbol *func_sym, struct objfile *objfile)
527 {
528 struct type *func_type = SYMBOL_TYPE (func_sym);
529 struct type *regsp_type, *regs_type;
530
531 /* No register parameter present. */
532 if (TYPE_NFIELDS (func_type) == 0)
533 return NULL;
534
535 regsp_type = check_typedef (TYPE_FIELD_TYPE (func_type, 0));
536 if (TYPE_CODE (regsp_type) != TYPE_CODE_PTR)
537 error (_("Invalid type code %d of first parameter of function \"%s\" "
538 "in compiled module \"%s\"."),
539 TYPE_CODE (regsp_type), GCC_FE_WRAPPER_FUNCTION,
540 objfile_name (objfile));
541
542 regs_type = check_typedef (TYPE_TARGET_TYPE (regsp_type));
543 if (TYPE_CODE (regs_type) != TYPE_CODE_STRUCT)
544 error (_("Invalid type code %d of dereferenced first parameter "
545 "of function \"%s\" in compiled module \"%s\"."),
546 TYPE_CODE (regs_type), GCC_FE_WRAPPER_FUNCTION,
547 objfile_name (objfile));
548
549 return regs_type;
550 }
551
552 /* Store all inferior registers required by REGS_TYPE to inferior memory
553 starting at inferior address REGS_BASE. */
554
555 static void
556 store_regs (struct type *regs_type, CORE_ADDR regs_base)
557 {
558 struct gdbarch *gdbarch = target_gdbarch ();
559 int fieldno;
560
561 for (fieldno = 0; fieldno < TYPE_NFIELDS (regs_type); fieldno++)
562 {
563 const char *reg_name = TYPE_FIELD_NAME (regs_type, fieldno);
564 ULONGEST reg_bitpos = TYPE_FIELD_BITPOS (regs_type, fieldno);
565 ULONGEST reg_bitsize = TYPE_FIELD_BITSIZE (regs_type, fieldno);
566 ULONGEST reg_offset;
567 struct type *reg_type = check_typedef (TYPE_FIELD_TYPE (regs_type,
568 fieldno));
569 ULONGEST reg_size = TYPE_LENGTH (reg_type);
570 int regnum;
571 struct value *regval;
572 CORE_ADDR inferior_addr;
573
574 if (strcmp (reg_name, COMPILE_I_SIMPLE_REGISTER_DUMMY) == 0)
575 continue;
576
577 if ((reg_bitpos % 8) != 0 || reg_bitsize != 0)
578 error (_("Invalid register \"%s\" position %s bits or size %s bits"),
579 reg_name, pulongest (reg_bitpos), pulongest (reg_bitsize));
580 reg_offset = reg_bitpos / 8;
581
582 if (TYPE_CODE (reg_type) != TYPE_CODE_INT
583 && TYPE_CODE (reg_type) != TYPE_CODE_PTR)
584 error (_("Invalid register \"%s\" type code %d"), reg_name,
585 TYPE_CODE (reg_type));
586
587 regnum = compile_register_name_demangle (gdbarch, reg_name);
588
589 regval = value_from_register (reg_type, regnum, get_current_frame ());
590 if (value_optimized_out (regval))
591 error (_("Register \"%s\" is optimized out."), reg_name);
592 if (!value_entirely_available (regval))
593 error (_("Register \"%s\" is not available."), reg_name);
594
595 inferior_addr = regs_base + reg_offset;
596 if (0 != target_write_memory (inferior_addr, value_contents (regval),
597 reg_size))
598 error (_("Cannot write register \"%s\" to inferior memory at %s."),
599 reg_name, paddress (gdbarch, inferior_addr));
600 }
601 }
602
603 /* Load the object file specified in FILE_NAMES into inferior memory.
604 Throw an error otherwise. Caller must fully dispose the return
605 value by calling compile_object_run. Returns NULL only for
606 COMPILE_I_PRINT_ADDRESS_SCOPE when COMPILE_I_PRINT_VALUE_SCOPE
607 should have been used instead. */
608
609 struct compile_module *
610 compile_object_load (const compile_file_names &file_names,
611 enum compile_i_scope_types scope, void *scope_data)
612 {
613 struct cleanup *cleanups;
614 struct setup_sections_data setup_sections_data;
615 CORE_ADDR regs_addr, out_value_addr = 0;
616 struct symbol *func_sym;
617 struct type *func_type;
618 struct bound_minimal_symbol bmsym;
619 long storage_needed;
620 asymbol **symbol_table, **symp;
621 long number_of_symbols, missing_symbols;
622 struct compile_module *retval;
623 struct type *regs_type, *out_value_type = NULL;
624 char **matching;
625 struct objfile *objfile;
626 int expect_parameters;
627 struct type *expect_return_type;
628 struct munmap_list *munmap_list_head = NULL;
629
630 gdb::unique_xmalloc_ptr<char> filename
631 (tilde_expand (file_names.object_file ()));
632
633 gdb_bfd_ref_ptr abfd (gdb_bfd_open (filename.get (), gnutarget, -1));
634 if (abfd == NULL)
635 error (_("\"%s\": could not open as compiled module: %s"),
636 filename.get (), bfd_errmsg (bfd_get_error ()));
637
638 if (!bfd_check_format_matches (abfd.get (), bfd_object, &matching))
639 error (_("\"%s\": not in loadable format: %s"),
640 filename.get (), gdb_bfd_errmsg (bfd_get_error (), matching));
641
642 if ((bfd_get_file_flags (abfd.get ()) & (EXEC_P | DYNAMIC)) != 0)
643 error (_("\"%s\": not in object format."), filename.get ());
644
645 setup_sections_data.last_size = 0;
646 setup_sections_data.last_section_first = abfd->sections;
647 setup_sections_data.last_prot = -1;
648 setup_sections_data.last_max_alignment = 1;
649 setup_sections_data.munmap_list_headp = &munmap_list_head;
650 cleanups = make_cleanup (munmap_listp_free_cleanup, &munmap_list_head);
651 bfd_map_over_sections (abfd.get (), setup_sections, &setup_sections_data);
652 setup_sections (abfd.get (), NULL, &setup_sections_data);
653
654 storage_needed = bfd_get_symtab_upper_bound (abfd.get ());
655 if (storage_needed < 0)
656 error (_("Cannot read symbols of compiled module \"%s\": %s"),
657 filename.get (), bfd_errmsg (bfd_get_error ()));
658
659 /* SYMFILE_VERBOSE is not passed even if FROM_TTY, user is not interested in
660 "Reading symbols from ..." message for automatically generated file. */
661 std::unique_ptr<struct objfile> objfile_holder
662 (symbol_file_add_from_bfd (abfd.get (), filename.get (),
663 0, NULL, 0, NULL));
664 objfile = objfile_holder.get ();
665
666 func_sym = lookup_global_symbol_from_objfile (objfile,
667 GCC_FE_WRAPPER_FUNCTION,
668 VAR_DOMAIN).symbol;
669 if (func_sym == NULL)
670 error (_("Cannot find function \"%s\" in compiled module \"%s\"."),
671 GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile));
672 func_type = SYMBOL_TYPE (func_sym);
673 if (TYPE_CODE (func_type) != TYPE_CODE_FUNC)
674 error (_("Invalid type code %d of function \"%s\" in compiled "
675 "module \"%s\"."),
676 TYPE_CODE (func_type), GCC_FE_WRAPPER_FUNCTION,
677 objfile_name (objfile));
678
679 switch (scope)
680 {
681 case COMPILE_I_SIMPLE_SCOPE:
682 expect_parameters = 1;
683 expect_return_type = builtin_type (target_gdbarch ())->builtin_void;
684 break;
685 case COMPILE_I_RAW_SCOPE:
686 expect_parameters = 0;
687 expect_return_type = builtin_type (target_gdbarch ())->builtin_void;
688 break;
689 case COMPILE_I_PRINT_ADDRESS_SCOPE:
690 case COMPILE_I_PRINT_VALUE_SCOPE:
691 expect_parameters = 2;
692 expect_return_type = builtin_type (target_gdbarch ())->builtin_void;
693 break;
694 default:
695 internal_error (__FILE__, __LINE__, _("invalid scope %d"), scope);
696 }
697 if (TYPE_NFIELDS (func_type) != expect_parameters)
698 error (_("Invalid %d parameters of function \"%s\" in compiled "
699 "module \"%s\"."),
700 TYPE_NFIELDS (func_type), GCC_FE_WRAPPER_FUNCTION,
701 objfile_name (objfile));
702 if (!types_deeply_equal (expect_return_type, TYPE_TARGET_TYPE (func_type)))
703 error (_("Invalid return type of function \"%s\" in compiled "
704 "module \"%s\"."),
705 GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile));
706
707 /* The memory may be later needed
708 by bfd_generic_get_relocated_section_contents
709 called from default_symfile_relocate. */
710 symbol_table = (asymbol **) obstack_alloc (&objfile->objfile_obstack,
711 storage_needed);
712 number_of_symbols = bfd_canonicalize_symtab (abfd.get (), symbol_table);
713 if (number_of_symbols < 0)
714 error (_("Cannot parse symbols of compiled module \"%s\": %s"),
715 filename.get (), bfd_errmsg (bfd_get_error ()));
716
717 missing_symbols = 0;
718 for (symp = symbol_table; symp < symbol_table + number_of_symbols; symp++)
719 {
720 asymbol *sym = *symp;
721
722 if (sym->flags != 0)
723 continue;
724 sym->flags = BSF_GLOBAL;
725 sym->section = bfd_abs_section_ptr;
726 if (strcmp (sym->name, "_GLOBAL_OFFSET_TABLE_") == 0)
727 {
728 if (compile_debug)
729 fprintf_unfiltered (gdb_stdlog,
730 "ELF symbol \"%s\" relocated to zero\n",
731 sym->name);
732
733 /* It seems to be a GCC bug, with -mcmodel=large there should be no
734 need for _GLOBAL_OFFSET_TABLE_. Together with -fPIE the data
735 remain PC-relative even with _GLOBAL_OFFSET_TABLE_ as zero. */
736 sym->value = 0;
737 continue;
738 }
739 bmsym = lookup_minimal_symbol (sym->name, NULL, NULL);
740 switch (bmsym.minsym == NULL
741 ? mst_unknown : MSYMBOL_TYPE (bmsym.minsym))
742 {
743 case mst_text:
744 sym->value = BMSYMBOL_VALUE_ADDRESS (bmsym);
745 if (compile_debug)
746 fprintf_unfiltered (gdb_stdlog,
747 "ELF mst_text symbol \"%s\" relocated to %s\n",
748 sym->name,
749 paddress (target_gdbarch (), sym->value));
750 break;
751 case mst_text_gnu_ifunc:
752 sym->value = gnu_ifunc_resolve_addr (target_gdbarch (),
753 BMSYMBOL_VALUE_ADDRESS (bmsym));
754 if (compile_debug)
755 fprintf_unfiltered (gdb_stdlog,
756 "ELF mst_text_gnu_ifunc symbol \"%s\" "
757 "relocated to %s\n",
758 sym->name,
759 paddress (target_gdbarch (), sym->value));
760 break;
761 default:
762 warning (_("Could not find symbol \"%s\" "
763 "for compiled module \"%s\"."),
764 sym->name, filename.get ());
765 missing_symbols++;
766 }
767 }
768 if (missing_symbols)
769 error (_("%ld symbols were missing, cannot continue."), missing_symbols);
770
771 bfd_map_over_sections (abfd.get (), copy_sections, symbol_table);
772
773 regs_type = get_regs_type (func_sym, objfile);
774 if (regs_type == NULL)
775 regs_addr = 0;
776 else
777 {
778 /* Use read-only non-executable memory protection. */
779 regs_addr = gdbarch_infcall_mmap (target_gdbarch (),
780 TYPE_LENGTH (regs_type),
781 GDB_MMAP_PROT_READ);
782 gdb_assert (regs_addr != 0);
783 munmap_list_add (&munmap_list_head, regs_addr, TYPE_LENGTH (regs_type));
784 if (compile_debug)
785 fprintf_unfiltered (gdb_stdlog,
786 "allocated %s bytes at %s for registers\n",
787 paddress (target_gdbarch (),
788 TYPE_LENGTH (regs_type)),
789 paddress (target_gdbarch (), regs_addr));
790 store_regs (regs_type, regs_addr);
791 }
792
793 if (scope == COMPILE_I_PRINT_ADDRESS_SCOPE
794 || scope == COMPILE_I_PRINT_VALUE_SCOPE)
795 {
796 out_value_type = get_out_value_type (func_sym, objfile, scope);
797 if (out_value_type == NULL)
798 {
799 do_cleanups (cleanups);
800 return NULL;
801 }
802 check_typedef (out_value_type);
803 out_value_addr = gdbarch_infcall_mmap (target_gdbarch (),
804 TYPE_LENGTH (out_value_type),
805 (GDB_MMAP_PROT_READ
806 | GDB_MMAP_PROT_WRITE));
807 gdb_assert (out_value_addr != 0);
808 munmap_list_add (&munmap_list_head, out_value_addr,
809 TYPE_LENGTH (out_value_type));
810 if (compile_debug)
811 fprintf_unfiltered (gdb_stdlog,
812 "allocated %s bytes at %s for printed value\n",
813 paddress (target_gdbarch (),
814 TYPE_LENGTH (out_value_type)),
815 paddress (target_gdbarch (), out_value_addr));
816 }
817
818 retval = XNEW (struct compile_module);
819 retval->objfile = objfile_holder.release ();
820 retval->source_file = xstrdup (file_names.source_file ());
821 retval->func_sym = func_sym;
822 retval->regs_addr = regs_addr;
823 retval->scope = scope;
824 retval->scope_data = scope_data;
825 retval->out_value_type = out_value_type;
826 retval->out_value_addr = out_value_addr;
827
828 /* CLEANUPS will free MUNMAP_LIST_HEAD. */
829 retval->munmap_list_head = munmap_list_head;
830 munmap_list_head = NULL;
831
832 do_cleanups (cleanups);
833
834 return retval;
835 }