Use thread_info and inferior pointers more throughout
[deliverable/binutils-gdb.git] / gdb / compile / compile-object-load.c
CommitLineData
bb2ec1b3
TT
1/* Load module for 'compile' command.
2
e2882c85 3 Copyright (C) 2014-2018 Free Software Foundation, Inc.
bb2ec1b3
TT
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"
00431a78 31#include "gdbthread.h"
bb2ec1b3 32#include "compile.h"
36de76f9 33#include "block.h"
bb2ec1b3 34#include "arch-utils.h"
325fac50 35#include <algorithm>
bb2ec1b3 36
7f361056
JK
37/* Track inferior memory reserved by inferior mmap. */
38
39struct 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
48static void
49munmap_list_add (struct munmap_list **headp, CORE_ADDR addr, CORE_ADDR size)
50{
8d749320 51 struct munmap_list *head_new = XNEW (struct munmap_list);
7f361056
JK
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
64void
65munmap_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
81static void
82munmap_listp_free_cleanup (void *headp_voidp)
83{
9a3c8263 84 struct munmap_list **headp = (struct munmap_list **) headp_voidp;
7f361056
JK
85
86 munmap_list_free (*headp);
87}
88
bb2ec1b3
TT
89/* Helper data for setup_sections. */
90
91struct 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;
7f361056
JK
105
106 /* List of inferior mmap ranges where setup_sections should add its
107 next range. */
108 struct munmap_list **munmap_list_headp;
bb2ec1b3
TT
109};
110
111/* Place all ABFD sections next to each other obeying all constraints. */
112
113static void
114setup_sections (bfd *abfd, asection *sect, void *data_voidp)
115{
9a3c8263 116 struct setup_sections_data *data = (struct setup_sections_data *) data_voidp;
bb2ec1b3
TT
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
bb2b33b9 129 /* Make the memory always readable. */
bb2ec1b3
TT
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)
a4063588 137 fprintf_unfiltered (gdb_stdlog,
bb2ec1b3
TT
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);
7f361056 158 munmap_list_add (data->munmap_list_headp, addr, data->last_size);
bb2ec1b3 159 if (compile_debug)
a4063588 160 fprintf_unfiltered (gdb_stdlog,
bb2ec1b3
TT
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);
325fac50 191 data->last_max_alignment = std::max (data->last_max_alignment, alignment);
bb2ec1b3
TT
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
1a72702b 203static void
bb2ec1b3
TT
204link_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)
1a72702b 211 return;
8e8347b8 212 warning (_("Compiled module \"%s\": multiple symbol definitions: %s"),
bb2ec1b3 213 bfd_get_filename (abfd), h->root.string);
bb2ec1b3
TT
214}
215
216/* Helper for link_callbacks callbacks vector. */
217
1a72702b 218static void
bb2ec1b3
TT
219link_callbacks_warning (struct bfd_link_info *link_info, const char *xwarning,
220 const char *symbol, bfd *abfd, asection *section,
221 bfd_vma address)
222{
8e8347b8 223 warning (_("Compiled module \"%s\" section \"%s\": warning: %s"),
bb2ec1b3
TT
224 bfd_get_filename (abfd), bfd_get_section_name (abfd, section),
225 xwarning);
bb2ec1b3
TT
226}
227
228/* Helper for link_callbacks callbacks vector. */
229
1a72702b 230static void
bb2ec1b3
TT
231link_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));
bb2ec1b3
TT
238}
239
240/* Helper for link_callbacks callbacks vector. */
241
1a72702b 242static void
bb2ec1b3
TT
243link_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{
bb2ec1b3
TT
249}
250
251/* Helper for link_callbacks callbacks vector. */
252
1a72702b 253static void
bb2ec1b3
TT
254link_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);
bb2ec1b3
TT
262}
263
264/* Helper for link_callbacks callbacks vector. */
265
1a72702b 266static void
bb2ec1b3
TT
267link_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);
bb2ec1b3
TT
275}
276
277/* Helper for link_callbacks callbacks vector. */
278
77b64a49
PA
279static void link_callbacks_einfo (const char *fmt, ...)
280 ATTRIBUTE_PRINTF (1, 2);
281
bb2ec1b3
TT
282static void
283link_callbacks_einfo (const char *fmt, ...)
284{
bb2ec1b3 285 va_list ap;
bb2ec1b3
TT
286
287 va_start (ap, fmt);
20dcd8ca 288 std::string str = string_vprintf (fmt, ap);
bb2ec1b3 289 va_end (ap);
bb2ec1b3 290
20dcd8ca 291 warning (_("Compile module: warning: %s"), str.c_str ());
bb2ec1b3
TT
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
298static 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
317struct link_hash_table_cleanup_data
318{
319 bfd *abfd;
320 bfd *link_next;
321};
322
323/* Cleanup callback for struct bfd_link_info. */
324
325static void
326link_hash_table_free (void *d)
327{
9a3c8263
SM
328 struct link_hash_table_cleanup_data *data
329 = (struct link_hash_table_cleanup_data *) d;
bb2ec1b3
TT
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
338static void
339copy_sections (bfd *abfd, asection *sect, void *data)
340{
9a3c8263 341 asymbol **symbol_table = (asymbol **) data;
bb2ec1b3
TT
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
224c3ddb 379 sect_data = (bfd_byte *) xmalloc (bfd_get_section_size (sect));
bb2ec1b3
TT
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
36de76f9
JK
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
417static struct type *
418get_out_value_type (struct symbol *func_sym, struct objfile *objfile,
419 enum compile_i_scope_types scope)
420{
d976bace
JK
421 struct symbol *gdb_ptr_type_sym;
422 /* Initialize it just to avoid a GCC false warning. */
423 struct symbol *gdb_val_sym = NULL;
4d18dfad 424 struct type *gdb_ptr_type, *gdb_type_from_ptr, *gdb_type, *retval;
d976bace
JK
425 /* Initialize it just to avoid a GCC false warning. */
426 const struct block *block = NULL;
36de76f9
JK
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 {
d976bace 437 struct symbol *function = NULL;
36de76f9
JK
438 const struct block *function_block;
439
440 block = BLOCKVECTOR_BLOCK (bv, block_loop);
441 if (BLOCK_FUNCTION (block) != NULL)
442 continue;
de63c46b
PA
443 gdb_val_sym = block_lookup_symbol (block,
444 COMPILE_I_EXPR_VAL,
445 symbol_name_match_type::SEARCH_NAME,
446 VAR_DOMAIN);
36de76f9
JK
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);
f168693b 470 gdb_type = check_typedef (gdb_type);
36de76f9
JK
471
472 gdb_ptr_type_sym = block_lookup_symbol (block, COMPILE_I_EXPR_PTR_TYPE,
de63c46b 473 symbol_name_match_type::SEARCH_NAME,
36de76f9
JK
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);
f168693b 478 gdb_ptr_type = check_typedef (gdb_ptr_type);
36de76f9
JK
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
4d18dfad 497 retval = gdb_type_from_ptr;
36de76f9
JK
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;
4d18dfad 519 return retval;
36de76f9
JK
520}
521
83d3415e
JK
522/* Fetch the type of first parameter of FUNC_SYM.
523 Return NULL if FUNC_SYM has no parameters. Throw an error otherwise. */
bb2ec1b3
TT
524
525static struct type *
83d3415e 526get_regs_type (struct symbol *func_sym, struct objfile *objfile)
bb2ec1b3 527{
83d3415e
JK
528 struct type *func_type = SYMBOL_TYPE (func_sym);
529 struct type *regsp_type, *regs_type;
bb2ec1b3
TT
530
531 /* No register parameter present. */
532 if (TYPE_NFIELDS (func_type) == 0)
533 return NULL;
534
bb2ec1b3
TT
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
555static void
556store_regs (struct type *regs_type, CORE_ADDR regs_base)
557{
00431a78 558 thread_info *thread = inferior_thread ();
bb2ec1b3 559 struct gdbarch *gdbarch = target_gdbarch ();
00431a78 560 struct regcache *regcache = get_thread_regcache (thread);
bb2ec1b3
TT
561 int fieldno;
562
563 for (fieldno = 0; fieldno < TYPE_NFIELDS (regs_type); fieldno++)
564 {
565 const char *reg_name = TYPE_FIELD_NAME (regs_type, fieldno);
566 ULONGEST reg_bitpos = TYPE_FIELD_BITPOS (regs_type, fieldno);
567 ULONGEST reg_bitsize = TYPE_FIELD_BITSIZE (regs_type, fieldno);
568 ULONGEST reg_offset;
569 struct type *reg_type = check_typedef (TYPE_FIELD_TYPE (regs_type,
570 fieldno));
571 ULONGEST reg_size = TYPE_LENGTH (reg_type);
572 int regnum;
573 struct value *regval;
574 CORE_ADDR inferior_addr;
575
576 if (strcmp (reg_name, COMPILE_I_SIMPLE_REGISTER_DUMMY) == 0)
577 continue;
578
579 if ((reg_bitpos % 8) != 0 || reg_bitsize != 0)
580 error (_("Invalid register \"%s\" position %s bits or size %s bits"),
581 reg_name, pulongest (reg_bitpos), pulongest (reg_bitsize));
582 reg_offset = reg_bitpos / 8;
583
584 if (TYPE_CODE (reg_type) != TYPE_CODE_INT
585 && TYPE_CODE (reg_type) != TYPE_CODE_PTR)
586 error (_("Invalid register \"%s\" type code %d"), reg_name,
587 TYPE_CODE (reg_type));
588
589 regnum = compile_register_name_demangle (gdbarch, reg_name);
590
591 regval = value_from_register (reg_type, regnum, get_current_frame ());
592 if (value_optimized_out (regval))
593 error (_("Register \"%s\" is optimized out."), reg_name);
594 if (!value_entirely_available (regval))
595 error (_("Register \"%s\" is not available."), reg_name);
596
597 inferior_addr = regs_base + reg_offset;
598 if (0 != target_write_memory (inferior_addr, value_contents (regval),
599 reg_size))
600 error (_("Cannot write register \"%s\" to inferior memory at %s."),
601 reg_name, paddress (gdbarch, inferior_addr));
602 }
603}
604
aaee65ae
PA
605/* Load the object file specified in FILE_NAMES into inferior memory.
606 Throw an error otherwise. Caller must fully dispose the return
607 value by calling compile_object_run. Returns NULL only for
608 COMPILE_I_PRINT_ADDRESS_SCOPE when COMPILE_I_PRINT_VALUE_SCOPE
609 should have been used instead. */
bb2ec1b3
TT
610
611struct compile_module *
aaee65ae 612compile_object_load (const compile_file_names &file_names,
5c65b58a 613 enum compile_i_scope_types scope, void *scope_data)
bb2ec1b3 614{
ed2b3126 615 struct cleanup *cleanups;
bb2ec1b3 616 struct setup_sections_data setup_sections_data;
798a7429 617 CORE_ADDR regs_addr, out_value_addr = 0;
83d3415e
JK
618 struct symbol *func_sym;
619 struct type *func_type;
bb2ec1b3
TT
620 struct bound_minimal_symbol bmsym;
621 long storage_needed;
622 asymbol **symbol_table, **symp;
623 long number_of_symbols, missing_symbols;
bb2ec1b3 624 struct compile_module *retval;
36de76f9 625 struct type *regs_type, *out_value_type = NULL;
ee0c3293 626 char **matching;
bb2ec1b3 627 struct objfile *objfile;
83d3415e
JK
628 int expect_parameters;
629 struct type *expect_return_type;
7f361056 630 struct munmap_list *munmap_list_head = NULL;
bb2ec1b3 631
ee0c3293
TT
632 gdb::unique_xmalloc_ptr<char> filename
633 (tilde_expand (file_names.object_file ()));
bb2ec1b3 634
ee0c3293 635 gdb_bfd_ref_ptr abfd (gdb_bfd_open (filename.get (), gnutarget, -1));
bb2ec1b3
TT
636 if (abfd == NULL)
637 error (_("\"%s\": could not open as compiled module: %s"),
ee0c3293 638 filename.get (), bfd_errmsg (bfd_get_error ()));
bb2ec1b3 639
192b62ce 640 if (!bfd_check_format_matches (abfd.get (), bfd_object, &matching))
bb2ec1b3 641 error (_("\"%s\": not in loadable format: %s"),
ee0c3293 642 filename.get (), gdb_bfd_errmsg (bfd_get_error (), matching));
bb2ec1b3 643
192b62ce 644 if ((bfd_get_file_flags (abfd.get ()) & (EXEC_P | DYNAMIC)) != 0)
ee0c3293 645 error (_("\"%s\": not in object format."), filename.get ());
bb2ec1b3
TT
646
647 setup_sections_data.last_size = 0;
648 setup_sections_data.last_section_first = abfd->sections;
649 setup_sections_data.last_prot = -1;
650 setup_sections_data.last_max_alignment = 1;
7f361056 651 setup_sections_data.munmap_list_headp = &munmap_list_head;
ee0c3293 652 cleanups = make_cleanup (munmap_listp_free_cleanup, &munmap_list_head);
192b62ce
TT
653 bfd_map_over_sections (abfd.get (), setup_sections, &setup_sections_data);
654 setup_sections (abfd.get (), NULL, &setup_sections_data);
bb2ec1b3 655
192b62ce 656 storage_needed = bfd_get_symtab_upper_bound (abfd.get ());
bb2ec1b3
TT
657 if (storage_needed < 0)
658 error (_("Cannot read symbols of compiled module \"%s\": %s"),
ee0c3293 659 filename.get (), bfd_errmsg (bfd_get_error ()));
bb2ec1b3
TT
660
661 /* SYMFILE_VERBOSE is not passed even if FROM_TTY, user is not interested in
662 "Reading symbols from ..." message for automatically generated file. */
ed2b3126
TT
663 std::unique_ptr<struct objfile> objfile_holder
664 (symbol_file_add_from_bfd (abfd.get (), filename.get (),
665 0, NULL, 0, NULL));
666 objfile = objfile_holder.get ();
bb2ec1b3 667
83d3415e
JK
668 func_sym = lookup_global_symbol_from_objfile (objfile,
669 GCC_FE_WRAPPER_FUNCTION,
d12307c1 670 VAR_DOMAIN).symbol;
83d3415e
JK
671 if (func_sym == NULL)
672 error (_("Cannot find function \"%s\" in compiled module \"%s\"."),
673 GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile));
674 func_type = SYMBOL_TYPE (func_sym);
675 if (TYPE_CODE (func_type) != TYPE_CODE_FUNC)
676 error (_("Invalid type code %d of function \"%s\" in compiled "
677 "module \"%s\"."),
678 TYPE_CODE (func_type), GCC_FE_WRAPPER_FUNCTION,
679 objfile_name (objfile));
680
681 switch (scope)
682 {
683 case COMPILE_I_SIMPLE_SCOPE:
684 expect_parameters = 1;
685 expect_return_type = builtin_type (target_gdbarch ())->builtin_void;
686 break;
687 case COMPILE_I_RAW_SCOPE:
688 expect_parameters = 0;
689 expect_return_type = builtin_type (target_gdbarch ())->builtin_void;
690 break;
36de76f9
JK
691 case COMPILE_I_PRINT_ADDRESS_SCOPE:
692 case COMPILE_I_PRINT_VALUE_SCOPE:
693 expect_parameters = 2;
694 expect_return_type = builtin_type (target_gdbarch ())->builtin_void;
695 break;
83d3415e
JK
696 default:
697 internal_error (__FILE__, __LINE__, _("invalid scope %d"), scope);
698 }
699 if (TYPE_NFIELDS (func_type) != expect_parameters)
700 error (_("Invalid %d parameters of function \"%s\" in compiled "
701 "module \"%s\"."),
702 TYPE_NFIELDS (func_type), GCC_FE_WRAPPER_FUNCTION,
703 objfile_name (objfile));
704 if (!types_deeply_equal (expect_return_type, TYPE_TARGET_TYPE (func_type)))
705 error (_("Invalid return type of function \"%s\" in compiled "
706 "module \"%s\"."),
707 GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile));
bb2ec1b3
TT
708
709 /* The memory may be later needed
710 by bfd_generic_get_relocated_section_contents
711 called from default_symfile_relocate. */
224c3ddb
SM
712 symbol_table = (asymbol **) obstack_alloc (&objfile->objfile_obstack,
713 storage_needed);
192b62ce 714 number_of_symbols = bfd_canonicalize_symtab (abfd.get (), symbol_table);
bb2ec1b3
TT
715 if (number_of_symbols < 0)
716 error (_("Cannot parse symbols of compiled module \"%s\": %s"),
ee0c3293 717 filename.get (), bfd_errmsg (bfd_get_error ()));
bb2ec1b3
TT
718
719 missing_symbols = 0;
720 for (symp = symbol_table; symp < symbol_table + number_of_symbols; symp++)
721 {
722 asymbol *sym = *symp;
723
724 if (sym->flags != 0)
725 continue;
bb2ec1b3
TT
726 sym->flags = BSF_GLOBAL;
727 sym->section = bfd_abs_section_ptr;
728 if (strcmp (sym->name, "_GLOBAL_OFFSET_TABLE_") == 0)
729 {
b0fd6b30
JK
730 if (compile_debug)
731 fprintf_unfiltered (gdb_stdlog,
732 "ELF symbol \"%s\" relocated to zero\n",
733 sym->name);
734
735 /* It seems to be a GCC bug, with -mcmodel=large there should be no
736 need for _GLOBAL_OFFSET_TABLE_. Together with -fPIE the data
737 remain PC-relative even with _GLOBAL_OFFSET_TABLE_ as zero. */
bb2ec1b3
TT
738 sym->value = 0;
739 continue;
740 }
741 bmsym = lookup_minimal_symbol (sym->name, NULL, NULL);
742 switch (bmsym.minsym == NULL
743 ? mst_unknown : MSYMBOL_TYPE (bmsym.minsym))
744 {
745 case mst_text:
746 sym->value = BMSYMBOL_VALUE_ADDRESS (bmsym);
b0fd6b30
JK
747 if (compile_debug)
748 fprintf_unfiltered (gdb_stdlog,
749 "ELF mst_text symbol \"%s\" relocated to %s\n",
750 sym->name,
751 paddress (target_gdbarch (), sym->value));
bb2ec1b3 752 break;
e26efa40
JK
753 case mst_text_gnu_ifunc:
754 sym->value = gnu_ifunc_resolve_addr (target_gdbarch (),
755 BMSYMBOL_VALUE_ADDRESS (bmsym));
b0fd6b30
JK
756 if (compile_debug)
757 fprintf_unfiltered (gdb_stdlog,
758 "ELF mst_text_gnu_ifunc symbol \"%s\" "
759 "relocated to %s\n",
760 sym->name,
761 paddress (target_gdbarch (), sym->value));
e26efa40 762 break;
bb2ec1b3
TT
763 default:
764 warning (_("Could not find symbol \"%s\" "
765 "for compiled module \"%s\"."),
ee0c3293 766 sym->name, filename.get ());
bb2ec1b3
TT
767 missing_symbols++;
768 }
769 }
770 if (missing_symbols)
771 error (_("%ld symbols were missing, cannot continue."), missing_symbols);
772
192b62ce 773 bfd_map_over_sections (abfd.get (), copy_sections, symbol_table);
bb2ec1b3 774
83d3415e 775 regs_type = get_regs_type (func_sym, objfile);
bb2ec1b3
TT
776 if (regs_type == NULL)
777 regs_addr = 0;
778 else
779 {
780 /* Use read-only non-executable memory protection. */
781 regs_addr = gdbarch_infcall_mmap (target_gdbarch (),
782 TYPE_LENGTH (regs_type),
783 GDB_MMAP_PROT_READ);
784 gdb_assert (regs_addr != 0);
7f361056 785 munmap_list_add (&munmap_list_head, regs_addr, TYPE_LENGTH (regs_type));
b6de3f96 786 if (compile_debug)
a4063588 787 fprintf_unfiltered (gdb_stdlog,
b6de3f96
JK
788 "allocated %s bytes at %s for registers\n",
789 paddress (target_gdbarch (),
790 TYPE_LENGTH (regs_type)),
791 paddress (target_gdbarch (), regs_addr));
bb2ec1b3
TT
792 store_regs (regs_type, regs_addr);
793 }
794
36de76f9
JK
795 if (scope == COMPILE_I_PRINT_ADDRESS_SCOPE
796 || scope == COMPILE_I_PRINT_VALUE_SCOPE)
797 {
798 out_value_type = get_out_value_type (func_sym, objfile, scope);
799 if (out_value_type == NULL)
800 {
801 do_cleanups (cleanups);
802 return NULL;
803 }
804 check_typedef (out_value_type);
805 out_value_addr = gdbarch_infcall_mmap (target_gdbarch (),
806 TYPE_LENGTH (out_value_type),
807 (GDB_MMAP_PROT_READ
808 | GDB_MMAP_PROT_WRITE));
809 gdb_assert (out_value_addr != 0);
7f361056
JK
810 munmap_list_add (&munmap_list_head, out_value_addr,
811 TYPE_LENGTH (out_value_type));
36de76f9 812 if (compile_debug)
a4063588 813 fprintf_unfiltered (gdb_stdlog,
36de76f9
JK
814 "allocated %s bytes at %s for printed value\n",
815 paddress (target_gdbarch (),
816 TYPE_LENGTH (out_value_type)),
817 paddress (target_gdbarch (), out_value_addr));
818 }
819
8d749320 820 retval = XNEW (struct compile_module);
ed2b3126 821 retval->objfile = objfile_holder.release ();
aaee65ae 822 retval->source_file = xstrdup (file_names.source_file ());
83d3415e 823 retval->func_sym = func_sym;
bb2ec1b3 824 retval->regs_addr = regs_addr;
5c65b58a
JK
825 retval->scope = scope;
826 retval->scope_data = scope_data;
36de76f9
JK
827 retval->out_value_type = out_value_type;
828 retval->out_value_addr = out_value_addr;
7f361056
JK
829
830 /* CLEANUPS will free MUNMAP_LIST_HEAD. */
831 retval->munmap_list_head = munmap_list_head;
832 munmap_list_head = NULL;
833
834 do_cleanups (cleanups);
835
bb2ec1b3
TT
836 return retval;
837}
This page took 0.30252 seconds and 4 git commands to generate.