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