Only support interworking and pic for ELF or COFF targets
[deliverable/binutils-gdb.git] / gdb / hppa-tdep.c
CommitLineData
c906108c
SS
1/* Target-dependent code for the HP PA architecture, for GDB.
2 Copyright 1986, 87, 89, 90, 91, 92, 93, 94, 95, 96, 1999
3 Free Software Foundation, Inc.
4
5 Contributed by the Center for Software Science at the
6 University of Utah (pa-gdb-bugs@cs.utah.edu).
7
c5aa993b 8 This file is part of GDB.
c906108c 9
c5aa993b
JM
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
c906108c 14
c5aa993b
JM
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
c906108c 19
c5aa993b
JM
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
c906108c
SS
24
25#include "defs.h"
26#include "frame.h"
27#include "bfd.h"
28#include "inferior.h"
29#include "value.h"
30
31/* For argument passing to the inferior */
32#include "symtab.h"
33
34#ifdef USG
35#include <sys/types.h>
36#endif
37
38#include <dl.h>
39#include <sys/param.h>
40#include <signal.h>
41
42#include <sys/ptrace.h>
43#include <machine/save_state.h>
44
45#ifdef COFF_ENCAPSULATE
46#include "a.out.encap.h"
47#else
48#endif
49
c5aa993b 50/*#include <sys/user.h> After a.out.h */
c906108c
SS
51#include <sys/file.h>
52#include "gdb_stat.h"
53#include "wait.h"
54
55#include "gdbcore.h"
56#include "gdbcmd.h"
57#include "target.h"
58#include "symfile.h"
59#include "objfiles.h"
60
c906108c
SS
61/* To support detection of the pseudo-initial frame
62 that threads have. */
63#define THREAD_INITIAL_FRAME_SYMBOL "__pthread_exit"
64#define THREAD_INITIAL_FRAME_SYM_LEN sizeof(THREAD_INITIAL_FRAME_SYMBOL)
c5aa993b 65
c906108c
SS
66static int extract_5_load PARAMS ((unsigned int));
67
68static unsigned extract_5R_store PARAMS ((unsigned int));
69
70static unsigned extract_5r_store PARAMS ((unsigned int));
71
72static void find_dummy_frame_regs PARAMS ((struct frame_info *,
73 struct frame_saved_regs *));
74
75static int find_proc_framesize PARAMS ((CORE_ADDR));
76
77static int find_return_regnum PARAMS ((CORE_ADDR));
78
79struct unwind_table_entry *find_unwind_entry PARAMS ((CORE_ADDR));
80
81static int extract_17 PARAMS ((unsigned int));
82
83static unsigned deposit_21 PARAMS ((unsigned int, unsigned int));
84
85static int extract_21 PARAMS ((unsigned));
86
87static unsigned deposit_14 PARAMS ((int, unsigned int));
88
89static int extract_14 PARAMS ((unsigned));
90
91static void unwind_command PARAMS ((char *, int));
92
93static int low_sign_extend PARAMS ((unsigned int, unsigned int));
94
95static int sign_extend PARAMS ((unsigned int, unsigned int));
96
97static int restore_pc_queue PARAMS ((struct frame_saved_regs *));
98
99static int hppa_alignof PARAMS ((struct type *));
100
101/* To support multi-threading and stepping. */
102int hppa_prepare_to_proceed PARAMS (());
103
104static int prologue_inst_adjust_sp PARAMS ((unsigned long));
105
106static int is_branch PARAMS ((unsigned long));
107
108static int inst_saves_gr PARAMS ((unsigned long));
109
110static int inst_saves_fr PARAMS ((unsigned long));
111
112static int pc_in_interrupt_handler PARAMS ((CORE_ADDR));
113
114static int pc_in_linker_stub PARAMS ((CORE_ADDR));
115
116static int compare_unwind_entries PARAMS ((const void *, const void *));
117
118static void read_unwind_info PARAMS ((struct objfile *));
119
120static void internalize_unwinds PARAMS ((struct objfile *,
121 struct unwind_table_entry *,
122 asection *, unsigned int,
123 unsigned int, CORE_ADDR));
124static void pa_print_registers PARAMS ((char *, int, int));
125static void pa_strcat_registers PARAMS ((char *, int, int, GDB_FILE *));
126static void pa_register_look_aside PARAMS ((char *, int, long *));
127static void pa_print_fp_reg PARAMS ((int));
128static void pa_strcat_fp_reg PARAMS ((int, GDB_FILE *, enum precision_type));
53a5351d 129static void record_text_segment_lowaddr PARAMS ((bfd *, asection *, void *));
c906108c 130
c5aa993b
JM
131typedef struct
132 {
133 struct minimal_symbol *msym;
134 CORE_ADDR solib_handle;
a0b3c4fd 135 CORE_ADDR return_val;
c5aa993b
JM
136 }
137args_for_find_stub;
c906108c 138
a0b3c4fd 139static int cover_find_stub_with_shl_get (PTR);
c906108c 140
c5aa993b 141static int is_pa_2 = 0; /* False */
c906108c 142
c5aa993b 143/* This is declared in symtab.c; set to 1 in hp-symtab-read.c */
c906108c
SS
144extern int hp_som_som_object_present;
145
146/* In breakpoint.c */
147extern int exception_catchpoints_are_fragile;
148
149/* This is defined in valops.c. */
150extern value_ptr
c5aa993b 151 find_function_in_inferior PARAMS ((char *));
c906108c
SS
152
153/* Should call_function allocate stack space for a struct return? */
154int
155hppa_use_struct_convention (gcc_p, type)
156 int gcc_p;
157 struct type *type;
158{
104c1213 159 return (TYPE_LENGTH (type) > 2 * REGISTER_SIZE);
c906108c 160}
c906108c 161\f
c5aa993b 162
c906108c
SS
163/* Routines to extract various sized constants out of hppa
164 instructions. */
165
166/* This assumes that no garbage lies outside of the lower bits of
167 value. */
168
169static int
170sign_extend (val, bits)
171 unsigned val, bits;
172{
c5aa993b 173 return (int) (val >> (bits - 1) ? (-1 << bits) | val : val);
c906108c
SS
174}
175
176/* For many immediate values the sign bit is the low bit! */
177
178static int
179low_sign_extend (val, bits)
180 unsigned val, bits;
181{
c5aa993b 182 return (int) ((val & 0x1 ? (-1 << (bits - 1)) : 0) | val >> 1);
c906108c
SS
183}
184
185/* extract the immediate field from a ld{bhw}s instruction */
186
c906108c
SS
187static int
188extract_5_load (word)
189 unsigned word;
190{
191 return low_sign_extend (word >> 16 & MASK_5, 5);
192}
193
c906108c
SS
194/* extract the immediate field from a break instruction */
195
196static unsigned
197extract_5r_store (word)
198 unsigned word;
199{
200 return (word & MASK_5);
201}
202
203/* extract the immediate field from a {sr}sm instruction */
204
205static unsigned
206extract_5R_store (word)
207 unsigned word;
208{
209 return (word >> 16 & MASK_5);
210}
211
c906108c
SS
212/* extract a 14 bit immediate field */
213
214static int
215extract_14 (word)
216 unsigned word;
217{
218 return low_sign_extend (word & MASK_14, 14);
219}
220
221/* deposit a 14 bit constant in a word */
222
223static unsigned
224deposit_14 (opnd, word)
225 int opnd;
226 unsigned word;
227{
228 unsigned sign = (opnd < 0 ? 1 : 0);
229
c5aa993b 230 return word | ((unsigned) opnd << 1 & MASK_14) | sign;
c906108c
SS
231}
232
233/* extract a 21 bit constant */
234
235static int
236extract_21 (word)
237 unsigned word;
238{
239 int val;
240
241 word &= MASK_21;
242 word <<= 11;
243 val = GET_FIELD (word, 20, 20);
244 val <<= 11;
245 val |= GET_FIELD (word, 9, 19);
246 val <<= 2;
247 val |= GET_FIELD (word, 5, 6);
248 val <<= 5;
249 val |= GET_FIELD (word, 0, 4);
250 val <<= 2;
251 val |= GET_FIELD (word, 7, 8);
252 return sign_extend (val, 21) << 11;
253}
254
255/* deposit a 21 bit constant in a word. Although 21 bit constants are
256 usually the top 21 bits of a 32 bit constant, we assume that only
257 the low 21 bits of opnd are relevant */
258
259static unsigned
260deposit_21 (opnd, word)
261 unsigned opnd, word;
262{
263 unsigned val = 0;
264
265 val |= GET_FIELD (opnd, 11 + 14, 11 + 18);
266 val <<= 2;
267 val |= GET_FIELD (opnd, 11 + 12, 11 + 13);
268 val <<= 2;
269 val |= GET_FIELD (opnd, 11 + 19, 11 + 20);
270 val <<= 11;
271 val |= GET_FIELD (opnd, 11 + 1, 11 + 11);
272 val <<= 1;
273 val |= GET_FIELD (opnd, 11 + 0, 11 + 0);
274 return word | val;
275}
276
c906108c
SS
277/* extract a 17 bit constant from branch instructions, returning the
278 19 bit signed value. */
279
280static int
281extract_17 (word)
282 unsigned word;
283{
284 return sign_extend (GET_FIELD (word, 19, 28) |
285 GET_FIELD (word, 29, 29) << 10 |
286 GET_FIELD (word, 11, 15) << 11 |
287 (word & 0x1) << 16, 17) << 2;
288}
289\f
290
291/* Compare the start address for two unwind entries returning 1 if
292 the first address is larger than the second, -1 if the second is
293 larger than the first, and zero if they are equal. */
294
295static int
296compare_unwind_entries (arg1, arg2)
297 const void *arg1;
298 const void *arg2;
299{
300 const struct unwind_table_entry *a = arg1;
301 const struct unwind_table_entry *b = arg2;
302
303 if (a->region_start > b->region_start)
304 return 1;
305 else if (a->region_start < b->region_start)
306 return -1;
307 else
308 return 0;
309}
310
53a5351d
JM
311static CORE_ADDR low_text_segment_address;
312
313static void
314record_text_segment_lowaddr (abfd, section, ignored)
315 bfd *abfd ATTRIBUTE_UNUSED;
316 asection *section;
317 PTR ignored ATTRIBUTE_UNUSED;
318{
319 if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
320 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
321 && section->vma < low_text_segment_address)
322 low_text_segment_address = section->vma;
323}
324
c906108c
SS
325static void
326internalize_unwinds (objfile, table, section, entries, size, text_offset)
327 struct objfile *objfile;
328 struct unwind_table_entry *table;
329 asection *section;
330 unsigned int entries, size;
331 CORE_ADDR text_offset;
332{
333 /* We will read the unwind entries into temporary memory, then
334 fill in the actual unwind table. */
335 if (size > 0)
336 {
337 unsigned long tmp;
338 unsigned i;
339 char *buf = alloca (size);
340
53a5351d
JM
341 low_text_segment_address = -1;
342
343 /* If addresses are 64 bits wide, then unwinds are supposed to
344 be segment relative offsets instead of absolute addresses. */
345 if (TARGET_PTR_BIT == 64)
346 {
347 bfd_map_over_sections (objfile->obfd,
348 record_text_segment_lowaddr, (PTR) NULL);
349
350 /* ?!? Mask off some low bits. Should this instead subtract
351 out the lowest section's filepos or something like that?
352 This looks very hokey to me. */
353 low_text_segment_address &= ~0xfff;
354 text_offset += low_text_segment_address;
355 }
356
c906108c
SS
357 bfd_get_section_contents (objfile->obfd, section, buf, 0, size);
358
359 /* Now internalize the information being careful to handle host/target
c5aa993b 360 endian issues. */
c906108c
SS
361 for (i = 0; i < entries; i++)
362 {
363 table[i].region_start = bfd_get_32 (objfile->obfd,
c5aa993b 364 (bfd_byte *) buf);
c906108c
SS
365 table[i].region_start += text_offset;
366 buf += 4;
c5aa993b 367 table[i].region_end = bfd_get_32 (objfile->obfd, (bfd_byte *) buf);
c906108c
SS
368 table[i].region_end += text_offset;
369 buf += 4;
c5aa993b 370 tmp = bfd_get_32 (objfile->obfd, (bfd_byte *) buf);
c906108c
SS
371 buf += 4;
372 table[i].Cannot_unwind = (tmp >> 31) & 0x1;
373 table[i].Millicode = (tmp >> 30) & 0x1;
374 table[i].Millicode_save_sr0 = (tmp >> 29) & 0x1;
375 table[i].Region_description = (tmp >> 27) & 0x3;
376 table[i].reserved1 = (tmp >> 26) & 0x1;
377 table[i].Entry_SR = (tmp >> 25) & 0x1;
378 table[i].Entry_FR = (tmp >> 21) & 0xf;
379 table[i].Entry_GR = (tmp >> 16) & 0x1f;
380 table[i].Args_stored = (tmp >> 15) & 0x1;
381 table[i].Variable_Frame = (tmp >> 14) & 0x1;
382 table[i].Separate_Package_Body = (tmp >> 13) & 0x1;
383 table[i].Frame_Extension_Millicode = (tmp >> 12) & 0x1;
384 table[i].Stack_Overflow_Check = (tmp >> 11) & 0x1;
385 table[i].Two_Instruction_SP_Increment = (tmp >> 10) & 0x1;
386 table[i].Ada_Region = (tmp >> 9) & 0x1;
387 table[i].cxx_info = (tmp >> 8) & 0x1;
388 table[i].cxx_try_catch = (tmp >> 7) & 0x1;
389 table[i].sched_entry_seq = (tmp >> 6) & 0x1;
390 table[i].reserved2 = (tmp >> 5) & 0x1;
391 table[i].Save_SP = (tmp >> 4) & 0x1;
392 table[i].Save_RP = (tmp >> 3) & 0x1;
393 table[i].Save_MRP_in_frame = (tmp >> 2) & 0x1;
394 table[i].extn_ptr_defined = (tmp >> 1) & 0x1;
395 table[i].Cleanup_defined = tmp & 0x1;
c5aa993b 396 tmp = bfd_get_32 (objfile->obfd, (bfd_byte *) buf);
c906108c
SS
397 buf += 4;
398 table[i].MPE_XL_interrupt_marker = (tmp >> 31) & 0x1;
399 table[i].HP_UX_interrupt_marker = (tmp >> 30) & 0x1;
400 table[i].Large_frame = (tmp >> 29) & 0x1;
401 table[i].Pseudo_SP_Set = (tmp >> 28) & 0x1;
402 table[i].reserved4 = (tmp >> 27) & 0x1;
403 table[i].Total_frame_size = tmp & 0x7ffffff;
404
c5aa993b 405 /* Stub unwinds are handled elsewhere. */
c906108c
SS
406 table[i].stub_unwind.stub_type = 0;
407 table[i].stub_unwind.padding = 0;
408 }
409 }
410}
411
412/* Read in the backtrace information stored in the `$UNWIND_START$' section of
413 the object file. This info is used mainly by find_unwind_entry() to find
414 out the stack frame size and frame pointer used by procedures. We put
415 everything on the psymbol obstack in the objfile so that it automatically
416 gets freed when the objfile is destroyed. */
417
418static void
419read_unwind_info (objfile)
420 struct objfile *objfile;
421{
422 asection *unwind_sec, *elf_unwind_sec, *stub_unwind_sec;
423 unsigned unwind_size, elf_unwind_size, stub_unwind_size, total_size;
424 unsigned index, unwind_entries, elf_unwind_entries;
425 unsigned stub_entries, total_entries;
426 CORE_ADDR text_offset;
427 struct obj_unwind_info *ui;
428 obj_private_data_t *obj_private;
429
430 text_offset = ANOFFSET (objfile->section_offsets, 0);
c5aa993b
JM
431 ui = (struct obj_unwind_info *) obstack_alloc (&objfile->psymbol_obstack,
432 sizeof (struct obj_unwind_info));
c906108c
SS
433
434 ui->table = NULL;
435 ui->cache = NULL;
436 ui->last = -1;
437
438 /* Get hooks to all unwind sections. Note there is no linker-stub unwind
439 section in ELF at the moment. */
440 unwind_sec = bfd_get_section_by_name (objfile->obfd, "$UNWIND_START$");
441 elf_unwind_sec = bfd_get_section_by_name (objfile->obfd, ".PARISC.unwind");
442 stub_unwind_sec = bfd_get_section_by_name (objfile->obfd, "$UNWIND_END$");
443
444 /* Get sizes and unwind counts for all sections. */
445 if (unwind_sec)
446 {
447 unwind_size = bfd_section_size (objfile->obfd, unwind_sec);
448 unwind_entries = unwind_size / UNWIND_ENTRY_SIZE;
449 }
450 else
451 {
452 unwind_size = 0;
453 unwind_entries = 0;
454 }
455
456 if (elf_unwind_sec)
457 {
104c1213
JM
458 elf_unwind_size = bfd_section_size (objfile->obfd, elf_unwind_sec);
459 elf_unwind_entries = elf_unwind_size / UNWIND_ENTRY_SIZE;
c906108c
SS
460 }
461 else
462 {
463 elf_unwind_size = 0;
464 elf_unwind_entries = 0;
465 }
466
467 if (stub_unwind_sec)
468 {
469 stub_unwind_size = bfd_section_size (objfile->obfd, stub_unwind_sec);
470 stub_entries = stub_unwind_size / STUB_UNWIND_ENTRY_SIZE;
471 }
472 else
473 {
474 stub_unwind_size = 0;
475 stub_entries = 0;
476 }
477
478 /* Compute total number of unwind entries and their total size. */
479 total_entries = unwind_entries + elf_unwind_entries + stub_entries;
480 total_size = total_entries * sizeof (struct unwind_table_entry);
481
482 /* Allocate memory for the unwind table. */
483 ui->table = (struct unwind_table_entry *)
484 obstack_alloc (&objfile->psymbol_obstack, total_size);
c5aa993b 485 ui->last = total_entries - 1;
c906108c
SS
486
487 /* Internalize the standard unwind entries. */
488 index = 0;
489 internalize_unwinds (objfile, &ui->table[index], unwind_sec,
490 unwind_entries, unwind_size, text_offset);
491 index += unwind_entries;
492 internalize_unwinds (objfile, &ui->table[index], elf_unwind_sec,
493 elf_unwind_entries, elf_unwind_size, text_offset);
494 index += elf_unwind_entries;
495
496 /* Now internalize the stub unwind entries. */
497 if (stub_unwind_size > 0)
498 {
499 unsigned int i;
500 char *buf = alloca (stub_unwind_size);
501
502 /* Read in the stub unwind entries. */
503 bfd_get_section_contents (objfile->obfd, stub_unwind_sec, buf,
504 0, stub_unwind_size);
505
506 /* Now convert them into regular unwind entries. */
507 for (i = 0; i < stub_entries; i++, index++)
508 {
509 /* Clear out the next unwind entry. */
510 memset (&ui->table[index], 0, sizeof (struct unwind_table_entry));
511
512 /* Convert offset & size into region_start and region_end.
513 Stuff away the stub type into "reserved" fields. */
514 ui->table[index].region_start = bfd_get_32 (objfile->obfd,
515 (bfd_byte *) buf);
516 ui->table[index].region_start += text_offset;
517 buf += 4;
518 ui->table[index].stub_unwind.stub_type = bfd_get_8 (objfile->obfd,
c5aa993b 519 (bfd_byte *) buf);
c906108c
SS
520 buf += 2;
521 ui->table[index].region_end
c5aa993b
JM
522 = ui->table[index].region_start + 4 *
523 (bfd_get_16 (objfile->obfd, (bfd_byte *) buf) - 1);
c906108c
SS
524 buf += 2;
525 }
526
527 }
528
529 /* Unwind table needs to be kept sorted. */
530 qsort (ui->table, total_entries, sizeof (struct unwind_table_entry),
531 compare_unwind_entries);
532
533 /* Keep a pointer to the unwind information. */
c5aa993b 534 if (objfile->obj_private == NULL)
c906108c
SS
535 {
536 obj_private = (obj_private_data_t *)
c5aa993b
JM
537 obstack_alloc (&objfile->psymbol_obstack,
538 sizeof (obj_private_data_t));
c906108c 539 obj_private->unwind_info = NULL;
c5aa993b 540 obj_private->so_info = NULL;
53a5351d 541 obj_private->dp = 0;
c5aa993b 542
c906108c
SS
543 objfile->obj_private = (PTR) obj_private;
544 }
c5aa993b 545 obj_private = (obj_private_data_t *) objfile->obj_private;
c906108c
SS
546 obj_private->unwind_info = ui;
547}
548
549/* Lookup the unwind (stack backtrace) info for the given PC. We search all
550 of the objfiles seeking the unwind table entry for this PC. Each objfile
551 contains a sorted list of struct unwind_table_entry. Since we do a binary
552 search of the unwind tables, we depend upon them to be sorted. */
553
554struct unwind_table_entry *
c5aa993b 555find_unwind_entry (pc)
c906108c
SS
556 CORE_ADDR pc;
557{
558 int first, middle, last;
559 struct objfile *objfile;
560
561 /* A function at address 0? Not in HP-UX! */
562 if (pc == (CORE_ADDR) 0)
563 return NULL;
564
565 ALL_OBJFILES (objfile)
c5aa993b
JM
566 {
567 struct obj_unwind_info *ui;
568 ui = NULL;
569 if (objfile->obj_private)
570 ui = ((obj_private_data_t *) (objfile->obj_private))->unwind_info;
c906108c 571
c5aa993b
JM
572 if (!ui)
573 {
574 read_unwind_info (objfile);
575 if (objfile->obj_private == NULL)
104c1213 576 error ("Internal error reading unwind information.");
c5aa993b
JM
577 ui = ((obj_private_data_t *) (objfile->obj_private))->unwind_info;
578 }
c906108c 579
c5aa993b 580 /* First, check the cache */
c906108c 581
c5aa993b
JM
582 if (ui->cache
583 && pc >= ui->cache->region_start
584 && pc <= ui->cache->region_end)
585 return ui->cache;
c906108c 586
c5aa993b 587 /* Not in the cache, do a binary search */
c906108c 588
c5aa993b
JM
589 first = 0;
590 last = ui->last;
c906108c 591
c5aa993b
JM
592 while (first <= last)
593 {
594 middle = (first + last) / 2;
595 if (pc >= ui->table[middle].region_start
596 && pc <= ui->table[middle].region_end)
597 {
598 ui->cache = &ui->table[middle];
599 return &ui->table[middle];
600 }
c906108c 601
c5aa993b
JM
602 if (pc < ui->table[middle].region_start)
603 last = middle - 1;
604 else
605 first = middle + 1;
606 }
607 } /* ALL_OBJFILES() */
c906108c
SS
608 return NULL;
609}
610
611/* Return the adjustment necessary to make for addresses on the stack
612 as presented by hpread.c.
613
614 This is necessary because of the stack direction on the PA and the
615 bizarre way in which someone (?) decided they wanted to handle
616 frame pointerless code in GDB. */
617int
618hpread_adjust_stack_address (func_addr)
619 CORE_ADDR func_addr;
620{
621 struct unwind_table_entry *u;
622
623 u = find_unwind_entry (func_addr);
624 if (!u)
625 return 0;
626 else
627 return u->Total_frame_size << 3;
628}
629
630/* Called to determine if PC is in an interrupt handler of some
631 kind. */
632
633static int
634pc_in_interrupt_handler (pc)
635 CORE_ADDR pc;
636{
637 struct unwind_table_entry *u;
638 struct minimal_symbol *msym_us;
639
640 u = find_unwind_entry (pc);
641 if (!u)
642 return 0;
643
644 /* Oh joys. HPUX sets the interrupt bit for _sigreturn even though
645 its frame isn't a pure interrupt frame. Deal with this. */
646 msym_us = lookup_minimal_symbol_by_pc (pc);
647
648 return u->HP_UX_interrupt_marker && !IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us));
649}
650
651/* Called when no unwind descriptor was found for PC. Returns 1 if it
104c1213
JM
652 appears that PC is in a linker stub.
653
654 ?!? Need to handle stubs which appear in PA64 code. */
c906108c
SS
655
656static int
657pc_in_linker_stub (pc)
658 CORE_ADDR pc;
659{
660 int found_magic_instruction = 0;
661 int i;
662 char buf[4];
663
664 /* If unable to read memory, assume pc is not in a linker stub. */
665 if (target_read_memory (pc, buf, 4) != 0)
666 return 0;
667
668 /* We are looking for something like
669
670 ; $$dyncall jams RP into this special spot in the frame (RP')
671 ; before calling the "call stub"
672 ldw -18(sp),rp
673
674 ldsid (rp),r1 ; Get space associated with RP into r1
675 mtsp r1,sp ; Move it into space register 0
676 be,n 0(sr0),rp) ; back to your regularly scheduled program */
677
678 /* Maximum known linker stub size is 4 instructions. Search forward
679 from the given PC, then backward. */
680 for (i = 0; i < 4; i++)
681 {
682 /* If we hit something with an unwind, stop searching this direction. */
683
684 if (find_unwind_entry (pc + i * 4) != 0)
685 break;
686
687 /* Check for ldsid (rp),r1 which is the magic instruction for a
c5aa993b 688 return from a cross-space function call. */
c906108c
SS
689 if (read_memory_integer (pc + i * 4, 4) == 0x004010a1)
690 {
691 found_magic_instruction = 1;
692 break;
693 }
694 /* Add code to handle long call/branch and argument relocation stubs
c5aa993b 695 here. */
c906108c
SS
696 }
697
698 if (found_magic_instruction != 0)
699 return 1;
700
701 /* Now look backward. */
702 for (i = 0; i < 4; i++)
703 {
704 /* If we hit something with an unwind, stop searching this direction. */
705
706 if (find_unwind_entry (pc - i * 4) != 0)
707 break;
708
709 /* Check for ldsid (rp),r1 which is the magic instruction for a
c5aa993b 710 return from a cross-space function call. */
c906108c
SS
711 if (read_memory_integer (pc - i * 4, 4) == 0x004010a1)
712 {
713 found_magic_instruction = 1;
714 break;
715 }
716 /* Add code to handle long call/branch and argument relocation stubs
c5aa993b 717 here. */
c906108c
SS
718 }
719 return found_magic_instruction;
720}
721
722static int
c5aa993b 723find_return_regnum (pc)
c906108c
SS
724 CORE_ADDR pc;
725{
726 struct unwind_table_entry *u;
727
728 u = find_unwind_entry (pc);
729
730 if (!u)
731 return RP_REGNUM;
732
733 if (u->Millicode)
734 return 31;
735
736 return RP_REGNUM;
737}
738
739/* Return size of frame, or -1 if we should use a frame pointer. */
740static int
741find_proc_framesize (pc)
742 CORE_ADDR pc;
743{
744 struct unwind_table_entry *u;
745 struct minimal_symbol *msym_us;
746
747 /* This may indicate a bug in our callers... */
c5aa993b 748 if (pc == (CORE_ADDR) 0)
c906108c 749 return -1;
c5aa993b 750
c906108c
SS
751 u = find_unwind_entry (pc);
752
753 if (!u)
754 {
755 if (pc_in_linker_stub (pc))
756 /* Linker stubs have a zero size frame. */
757 return 0;
758 else
759 return -1;
760 }
761
762 msym_us = lookup_minimal_symbol_by_pc (pc);
763
764 /* If Save_SP is set, and we're not in an interrupt or signal caller,
765 then we have a frame pointer. Use it. */
766 if (u->Save_SP && !pc_in_interrupt_handler (pc)
767 && !IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us)))
768 return -1;
769
770 return u->Total_frame_size << 3;
771}
772
773/* Return offset from sp at which rp is saved, or 0 if not saved. */
774static int rp_saved PARAMS ((CORE_ADDR));
775
776static int
777rp_saved (pc)
778 CORE_ADDR pc;
779{
780 struct unwind_table_entry *u;
781
782 /* A function at, and thus a return PC from, address 0? Not in HP-UX! */
783 if (pc == (CORE_ADDR) 0)
784 return 0;
785
786 u = find_unwind_entry (pc);
787
788 if (!u)
789 {
790 if (pc_in_linker_stub (pc))
791 /* This is the so-called RP'. */
792 return -24;
793 else
794 return 0;
795 }
796
797 if (u->Save_RP)
53a5351d 798 return (TARGET_PTR_BIT == 64 ? -16 : -20);
c906108c
SS
799 else if (u->stub_unwind.stub_type != 0)
800 {
801 switch (u->stub_unwind.stub_type)
802 {
803 case EXPORT:
804 case IMPORT:
805 return -24;
806 case PARAMETER_RELOCATION:
807 return -8;
808 default:
809 return 0;
810 }
811 }
812 else
813 return 0;
814}
815\f
816int
817frameless_function_invocation (frame)
818 struct frame_info *frame;
819{
820 struct unwind_table_entry *u;
821
822 u = find_unwind_entry (frame->pc);
823
824 if (u == 0)
825 return 0;
826
827 return (u->Total_frame_size == 0 && u->stub_unwind.stub_type == 0);
828}
829
830CORE_ADDR
831saved_pc_after_call (frame)
832 struct frame_info *frame;
833{
834 int ret_regnum;
835 CORE_ADDR pc;
836 struct unwind_table_entry *u;
837
838 ret_regnum = find_return_regnum (get_frame_pc (frame));
839 pc = read_register (ret_regnum) & ~0x3;
c5aa993b 840
c906108c
SS
841 /* If PC is in a linker stub, then we need to dig the address
842 the stub will return to out of the stack. */
843 u = find_unwind_entry (pc);
844 if (u && u->stub_unwind.stub_type != 0)
845 return FRAME_SAVED_PC (frame);
846 else
847 return pc;
848}
849\f
850CORE_ADDR
851hppa_frame_saved_pc (frame)
852 struct frame_info *frame;
853{
854 CORE_ADDR pc = get_frame_pc (frame);
855 struct unwind_table_entry *u;
856 CORE_ADDR old_pc;
c5aa993b
JM
857 int spun_around_loop = 0;
858 int rp_offset = 0;
c906108c
SS
859
860 /* BSD, HPUX & OSF1 all lay out the hardware state in the same manner
861 at the base of the frame in an interrupt handler. Registers within
862 are saved in the exact same order as GDB numbers registers. How
863 convienent. */
864 if (pc_in_interrupt_handler (pc))
53a5351d
JM
865 return read_memory_integer (frame->frame + PC_REGNUM * 4,
866 TARGET_PTR_BIT / 8) & ~0x3;
c906108c 867
104c1213
JM
868 if ((frame->pc >= frame->frame
869 && frame->pc <= (frame->frame
870 /* A call dummy is sized in words, but it is
871 actually a series of instructions. Account
872 for that scaling factor. */
873 + ((REGISTER_SIZE / INSTRUCTION_SIZE)
874 * CALL_DUMMY_LENGTH)
875 /* Similarly we have to account for 64bit
876 wide register saves. */
877 + (32 * REGISTER_SIZE)
878 /* We always consider FP regs 8 bytes long. */
879 + (NUM_REGS - FP0_REGNUM) * 8
880 /* Similarly we have to account for 64bit
881 wide register saves. */
882 + (6 * REGISTER_SIZE))))
883 {
884 return read_memory_integer ((frame->frame
885 + (TARGET_PTR_BIT == 64 ? -16 : -20)),
886 TARGET_PTR_BIT / 8) & ~0x3;
887 }
888
c906108c
SS
889#ifdef FRAME_SAVED_PC_IN_SIGTRAMP
890 /* Deal with signal handler caller frames too. */
891 if (frame->signal_handler_caller)
892 {
893 CORE_ADDR rp;
894 FRAME_SAVED_PC_IN_SIGTRAMP (frame, &rp);
895 return rp & ~0x3;
896 }
897#endif
898
899 if (frameless_function_invocation (frame))
900 {
901 int ret_regnum;
902
903 ret_regnum = find_return_regnum (pc);
904
905 /* If the next frame is an interrupt frame or a signal
c5aa993b
JM
906 handler caller, then we need to look in the saved
907 register area to get the return pointer (the values
908 in the registers may not correspond to anything useful). */
909 if (frame->next
c906108c
SS
910 && (frame->next->signal_handler_caller
911 || pc_in_interrupt_handler (frame->next->pc)))
912 {
913 struct frame_saved_regs saved_regs;
914
915 get_frame_saved_regs (frame->next, &saved_regs);
53a5351d
JM
916 if (read_memory_integer (saved_regs.regs[FLAGS_REGNUM],
917 TARGET_PTR_BIT / 8) & 0x2)
c906108c 918 {
53a5351d
JM
919 pc = read_memory_integer (saved_regs.regs[31],
920 TARGET_PTR_BIT / 8) & ~0x3;
c906108c
SS
921
922 /* Syscalls are really two frames. The syscall stub itself
c5aa993b
JM
923 with a return pointer in %rp and the kernel call with
924 a return pointer in %r31. We return the %rp variant
925 if %r31 is the same as frame->pc. */
c906108c 926 if (pc == frame->pc)
53a5351d
JM
927 pc = read_memory_integer (saved_regs.regs[RP_REGNUM],
928 TARGET_PTR_BIT / 8) & ~0x3;
c906108c
SS
929 }
930 else
53a5351d
JM
931 pc = read_memory_integer (saved_regs.regs[RP_REGNUM],
932 TARGET_PTR_BIT / 8) & ~0x3;
c906108c
SS
933 }
934 else
935 pc = read_register (ret_regnum) & ~0x3;
936 }
937 else
938 {
939 spun_around_loop = 0;
c5aa993b 940 old_pc = pc;
c906108c 941
c5aa993b 942 restart:
c906108c
SS
943 rp_offset = rp_saved (pc);
944
945 /* Similar to code in frameless function case. If the next
c5aa993b
JM
946 frame is a signal or interrupt handler, then dig the right
947 information out of the saved register info. */
c906108c
SS
948 if (rp_offset == 0
949 && frame->next
950 && (frame->next->signal_handler_caller
951 || pc_in_interrupt_handler (frame->next->pc)))
952 {
953 struct frame_saved_regs saved_regs;
954
955 get_frame_saved_regs (frame->next, &saved_regs);
53a5351d
JM
956 if (read_memory_integer (saved_regs.regs[FLAGS_REGNUM],
957 TARGET_PTR_BIT / 8) & 0x2)
c906108c 958 {
53a5351d
JM
959 pc = read_memory_integer (saved_regs.regs[31],
960 TARGET_PTR_BIT / 8) & ~0x3;
c906108c
SS
961
962 /* Syscalls are really two frames. The syscall stub itself
c5aa993b
JM
963 with a return pointer in %rp and the kernel call with
964 a return pointer in %r31. We return the %rp variant
965 if %r31 is the same as frame->pc. */
c906108c 966 if (pc == frame->pc)
53a5351d
JM
967 pc = read_memory_integer (saved_regs.regs[RP_REGNUM],
968 TARGET_PTR_BIT / 8) & ~0x3;
c906108c
SS
969 }
970 else
53a5351d
JM
971 pc = read_memory_integer (saved_regs.regs[RP_REGNUM],
972 TARGET_PTR_BIT / 8) & ~0x3;
c906108c
SS
973 }
974 else if (rp_offset == 0)
c5aa993b
JM
975 {
976 old_pc = pc;
977 pc = read_register (RP_REGNUM) & ~0x3;
978 }
c906108c 979 else
c5aa993b
JM
980 {
981 old_pc = pc;
53a5351d
JM
982 pc = read_memory_integer (frame->frame + rp_offset,
983 TARGET_PTR_BIT / 8) & ~0x3;
c5aa993b 984 }
c906108c
SS
985 }
986
987 /* If PC is inside a linker stub, then dig out the address the stub
988 will return to.
989
990 Don't do this for long branch stubs. Why? For some unknown reason
991 _start is marked as a long branch stub in hpux10. */
992 u = find_unwind_entry (pc);
993 if (u && u->stub_unwind.stub_type != 0
994 && u->stub_unwind.stub_type != LONG_BRANCH)
995 {
996 unsigned int insn;
997
998 /* If this is a dynamic executable, and we're in a signal handler,
c5aa993b
JM
999 then the call chain will eventually point us into the stub for
1000 _sigreturn. Unlike most cases, we'll be pointed to the branch
1001 to the real sigreturn rather than the code after the real branch!.
c906108c 1002
c5aa993b
JM
1003 Else, try to dig the address the stub will return to in the normal
1004 fashion. */
c906108c
SS
1005 insn = read_memory_integer (pc, 4);
1006 if ((insn & 0xfc00e000) == 0xe8000000)
1007 return (pc + extract_17 (insn) + 8) & ~0x3;
1008 else
1009 {
c5aa993b
JM
1010 if (old_pc == pc)
1011 spun_around_loop++;
1012
1013 if (spun_around_loop > 1)
1014 {
1015 /* We're just about to go around the loop again with
1016 no more hope of success. Die. */
1017 error ("Unable to find return pc for this frame");
1018 }
1019 else
1020 goto restart;
c906108c
SS
1021 }
1022 }
1023
1024 return pc;
1025}
1026\f
1027/* We need to correct the PC and the FP for the outermost frame when we are
1028 in a system call. */
1029
1030void
1031init_extra_frame_info (fromleaf, frame)
1032 int fromleaf;
1033 struct frame_info *frame;
1034{
1035 int flags;
1036 int framesize;
1037
1038 if (frame->next && !fromleaf)
1039 return;
1040
1041 /* If the next frame represents a frameless function invocation
1042 then we have to do some adjustments that are normally done by
1043 FRAME_CHAIN. (FRAME_CHAIN is not called in this case.) */
1044 if (fromleaf)
1045 {
1046 /* Find the framesize of *this* frame without peeking at the PC
c5aa993b 1047 in the current frame structure (it isn't set yet). */
c906108c
SS
1048 framesize = find_proc_framesize (FRAME_SAVED_PC (get_next_frame (frame)));
1049
1050 /* Now adjust our base frame accordingly. If we have a frame pointer
c5aa993b
JM
1051 use it, else subtract the size of this frame from the current
1052 frame. (we always want frame->frame to point at the lowest address
1053 in the frame). */
c906108c
SS
1054 if (framesize == -1)
1055 frame->frame = TARGET_READ_FP ();
1056 else
1057 frame->frame -= framesize;
1058 return;
1059 }
1060
1061 flags = read_register (FLAGS_REGNUM);
c5aa993b 1062 if (flags & 2) /* In system call? */
c906108c
SS
1063 frame->pc = read_register (31) & ~0x3;
1064
1065 /* The outermost frame is always derived from PC-framesize
1066
1067 One might think frameless innermost frames should have
1068 a frame->frame that is the same as the parent's frame->frame.
1069 That is wrong; frame->frame in that case should be the *high*
1070 address of the parent's frame. It's complicated as hell to
1071 explain, but the parent *always* creates some stack space for
1072 the child. So the child actually does have a frame of some
1073 sorts, and its base is the high address in its parent's frame. */
c5aa993b 1074 framesize = find_proc_framesize (frame->pc);
c906108c
SS
1075 if (framesize == -1)
1076 frame->frame = TARGET_READ_FP ();
1077 else
1078 frame->frame = read_register (SP_REGNUM) - framesize;
1079}
1080\f
1081/* Given a GDB frame, determine the address of the calling function's frame.
1082 This will be used to create a new GDB frame struct, and then
1083 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
1084
1085 This may involve searching through prologues for several functions
1086 at boundaries where GCC calls HP C code, or where code which has
1087 a frame pointer calls code without a frame pointer. */
1088
1089CORE_ADDR
1090frame_chain (frame)
1091 struct frame_info *frame;
1092{
1093 int my_framesize, caller_framesize;
1094 struct unwind_table_entry *u;
1095 CORE_ADDR frame_base;
1096 struct frame_info *tmp_frame;
1097
c5aa993b 1098 CORE_ADDR caller_pc;
c906108c
SS
1099
1100 struct minimal_symbol *min_frame_symbol;
c5aa993b
JM
1101 struct symbol *frame_symbol;
1102 char *frame_symbol_name;
c906108c
SS
1103
1104 /* If this is a threaded application, and we see the
1105 routine "__pthread_exit", treat it as the stack root
1106 for this thread. */
c5aa993b
JM
1107 min_frame_symbol = lookup_minimal_symbol_by_pc (frame->pc);
1108 frame_symbol = find_pc_function (frame->pc);
c906108c 1109
c5aa993b 1110 if ((min_frame_symbol != 0) /* && (frame_symbol == 0) */ )
c906108c 1111 {
c5aa993b
JM
1112 /* The test above for "no user function name" would defend
1113 against the slim likelihood that a user might define a
1114 routine named "__pthread_exit" and then try to debug it.
1115
1116 If it weren't commented out, and you tried to debug the
1117 pthread library itself, you'd get errors.
1118
1119 So for today, we don't make that check. */
1120 frame_symbol_name = SYMBOL_NAME (min_frame_symbol);
1121 if (frame_symbol_name != 0)
1122 {
1123 if (0 == strncmp (frame_symbol_name,
1124 THREAD_INITIAL_FRAME_SYMBOL,
1125 THREAD_INITIAL_FRAME_SYM_LEN))
1126 {
1127 /* Pretend we've reached the bottom of the stack. */
1128 return (CORE_ADDR) 0;
1129 }
1130 }
1131 } /* End of hacky code for threads. */
1132
c906108c
SS
1133 /* Handle HPUX, BSD, and OSF1 style interrupt frames first. These
1134 are easy; at *sp we have a full save state strucutre which we can
1135 pull the old stack pointer from. Also see frame_saved_pc for
1136 code to dig a saved PC out of the save state structure. */
1137 if (pc_in_interrupt_handler (frame->pc))
53a5351d
JM
1138 frame_base = read_memory_integer (frame->frame + SP_REGNUM * 4,
1139 TARGET_PTR_BIT / 8);
c906108c
SS
1140#ifdef FRAME_BASE_BEFORE_SIGTRAMP
1141 else if (frame->signal_handler_caller)
1142 {
1143 FRAME_BASE_BEFORE_SIGTRAMP (frame, &frame_base);
1144 }
1145#endif
1146 else
1147 frame_base = frame->frame;
1148
1149 /* Get frame sizes for the current frame and the frame of the
1150 caller. */
1151 my_framesize = find_proc_framesize (frame->pc);
c5aa993b 1152 caller_pc = FRAME_SAVED_PC (frame);
c906108c
SS
1153
1154 /* If we can't determine the caller's PC, then it's not likely we can
1155 really determine anything meaningful about its frame. We'll consider
1156 this to be stack bottom. */
1157 if (caller_pc == (CORE_ADDR) 0)
1158 return (CORE_ADDR) 0;
1159
c5aa993b 1160 caller_framesize = find_proc_framesize (FRAME_SAVED_PC (frame));
c906108c
SS
1161
1162 /* If caller does not have a frame pointer, then its frame
1163 can be found at current_frame - caller_framesize. */
1164 if (caller_framesize != -1)
1165 {
1166 return frame_base - caller_framesize;
1167 }
1168 /* Both caller and callee have frame pointers and are GCC compiled
1169 (SAVE_SP bit in unwind descriptor is on for both functions.
1170 The previous frame pointer is found at the top of the current frame. */
1171 if (caller_framesize == -1 && my_framesize == -1)
1172 {
53a5351d 1173 return read_memory_integer (frame_base, TARGET_PTR_BIT / 8);
c906108c
SS
1174 }
1175 /* Caller has a frame pointer, but callee does not. This is a little
1176 more difficult as GCC and HP C lay out locals and callee register save
1177 areas very differently.
1178
1179 The previous frame pointer could be in a register, or in one of
1180 several areas on the stack.
1181
1182 Walk from the current frame to the innermost frame examining
1183 unwind descriptors to determine if %r3 ever gets saved into the
1184 stack. If so return whatever value got saved into the stack.
1185 If it was never saved in the stack, then the value in %r3 is still
1186 valid, so use it.
1187
1188 We use information from unwind descriptors to determine if %r3
1189 is saved into the stack (Entry_GR field has this information). */
1190
1191 tmp_frame = frame;
1192 while (tmp_frame)
1193 {
1194 u = find_unwind_entry (tmp_frame->pc);
1195
1196 if (!u)
1197 {
1198 /* We could find this information by examining prologues. I don't
1199 think anyone has actually written any tools (not even "strip")
1200 which leave them out of an executable, so maybe this is a moot
1201 point. */
c5aa993b
JM
1202 /* ??rehrauer: Actually, it's quite possible to stepi your way into
1203 code that doesn't have unwind entries. For example, stepping into
1204 the dynamic linker will give you a PC that has none. Thus, I've
1205 disabled this warning. */
c906108c
SS
1206#if 0
1207 warning ("Unable to find unwind for PC 0x%x -- Help!", tmp_frame->pc);
1208#endif
1209 return (CORE_ADDR) 0;
1210 }
1211
1212 /* Entry_GR specifies the number of callee-saved general registers
c5aa993b 1213 saved in the stack. It starts at %r3, so %r3 would be 1. */
c906108c
SS
1214 if (u->Entry_GR >= 1 || u->Save_SP
1215 || tmp_frame->signal_handler_caller
1216 || pc_in_interrupt_handler (tmp_frame->pc))
1217 break;
1218 else
1219 tmp_frame = tmp_frame->next;
1220 }
1221
1222 if (tmp_frame)
1223 {
1224 /* We may have walked down the chain into a function with a frame
c5aa993b 1225 pointer. */
c906108c
SS
1226 if (u->Save_SP
1227 && !tmp_frame->signal_handler_caller
1228 && !pc_in_interrupt_handler (tmp_frame->pc))
1229 {
53a5351d 1230 return read_memory_integer (tmp_frame->frame, TARGET_PTR_BIT / 8);
c906108c
SS
1231 }
1232 /* %r3 was saved somewhere in the stack. Dig it out. */
c5aa993b 1233 else
c906108c
SS
1234 {
1235 struct frame_saved_regs saved_regs;
1236
1237 /* Sick.
1238
1239 For optimization purposes many kernels don't have the
1240 callee saved registers into the save_state structure upon
1241 entry into the kernel for a syscall; the optimization
1242 is usually turned off if the process is being traced so
1243 that the debugger can get full register state for the
1244 process.
c5aa993b 1245
c906108c
SS
1246 This scheme works well except for two cases:
1247
c5aa993b
JM
1248 * Attaching to a process when the process is in the
1249 kernel performing a system call (debugger can't get
1250 full register state for the inferior process since
1251 the process wasn't being traced when it entered the
1252 system call).
c906108c 1253
c5aa993b
JM
1254 * Register state is not complete if the system call
1255 causes the process to core dump.
c906108c
SS
1256
1257
1258 The following heinous code is an attempt to deal with
1259 the lack of register state in a core dump. It will
1260 fail miserably if the function which performs the
1261 system call has a variable sized stack frame. */
1262
1263 get_frame_saved_regs (tmp_frame, &saved_regs);
1264
1265 /* Abominable hack. */
1266 if (current_target.to_has_execution == 0
1267 && ((saved_regs.regs[FLAGS_REGNUM]
53a5351d
JM
1268 && (read_memory_integer (saved_regs.regs[FLAGS_REGNUM],
1269 TARGET_PTR_BIT / 8)
c906108c
SS
1270 & 0x2))
1271 || (saved_regs.regs[FLAGS_REGNUM] == 0
1272 && read_register (FLAGS_REGNUM) & 0x2)))
1273 {
1274 u = find_unwind_entry (FRAME_SAVED_PC (frame));
1275 if (!u)
1276 {
53a5351d
JM
1277 return read_memory_integer (saved_regs.regs[FP_REGNUM],
1278 TARGET_PTR_BIT / 8);
c906108c
SS
1279 }
1280 else
1281 {
1282 return frame_base - (u->Total_frame_size << 3);
1283 }
1284 }
c5aa993b 1285
53a5351d
JM
1286 return read_memory_integer (saved_regs.regs[FP_REGNUM],
1287 TARGET_PTR_BIT / 8);
c906108c
SS
1288 }
1289 }
1290 else
1291 {
1292 struct frame_saved_regs saved_regs;
1293
1294 /* Get the innermost frame. */
1295 tmp_frame = frame;
1296 while (tmp_frame->next != NULL)
1297 tmp_frame = tmp_frame->next;
1298
1299 get_frame_saved_regs (tmp_frame, &saved_regs);
1300 /* Abominable hack. See above. */
1301 if (current_target.to_has_execution == 0
1302 && ((saved_regs.regs[FLAGS_REGNUM]
53a5351d
JM
1303 && (read_memory_integer (saved_regs.regs[FLAGS_REGNUM],
1304 TARGET_PTR_BIT / 8)
c906108c
SS
1305 & 0x2))
1306 || (saved_regs.regs[FLAGS_REGNUM] == 0
c5aa993b 1307 && read_register (FLAGS_REGNUM) & 0x2)))
c906108c
SS
1308 {
1309 u = find_unwind_entry (FRAME_SAVED_PC (frame));
1310 if (!u)
1311 {
53a5351d
JM
1312 return read_memory_integer (saved_regs.regs[FP_REGNUM],
1313 TARGET_PTR_BIT / 8);
c906108c 1314 }
c5aa993b
JM
1315 else
1316 {
1317 return frame_base - (u->Total_frame_size << 3);
1318 }
c906108c 1319 }
c5aa993b 1320
c906108c 1321 /* The value in %r3 was never saved into the stack (thus %r3 still
c5aa993b 1322 holds the value of the previous frame pointer). */
c906108c
SS
1323 return TARGET_READ_FP ();
1324 }
1325}
c906108c 1326\f
c5aa993b 1327
c906108c
SS
1328/* To see if a frame chain is valid, see if the caller looks like it
1329 was compiled with gcc. */
1330
1331int
1332hppa_frame_chain_valid (chain, thisframe)
1333 CORE_ADDR chain;
1334 struct frame_info *thisframe;
1335{
1336 struct minimal_symbol *msym_us;
1337 struct minimal_symbol *msym_start;
1338 struct unwind_table_entry *u, *next_u = NULL;
1339 struct frame_info *next;
1340
1341 if (!chain)
1342 return 0;
1343
1344 u = find_unwind_entry (thisframe->pc);
1345
1346 if (u == NULL)
1347 return 1;
1348
1349 /* We can't just check that the same of msym_us is "_start", because
1350 someone idiotically decided that they were going to make a Ltext_end
1351 symbol with the same address. This Ltext_end symbol is totally
1352 indistinguishable (as nearly as I can tell) from the symbol for a function
1353 which is (legitimately, since it is in the user's namespace)
1354 named Ltext_end, so we can't just ignore it. */
1355 msym_us = lookup_minimal_symbol_by_pc (FRAME_SAVED_PC (thisframe));
1356 msym_start = lookup_minimal_symbol ("_start", NULL, NULL);
1357 if (msym_us
1358 && msym_start
1359 && SYMBOL_VALUE_ADDRESS (msym_us) == SYMBOL_VALUE_ADDRESS (msym_start))
1360 return 0;
1361
1362 /* Grrrr. Some new idiot decided that they don't want _start for the
1363 PRO configurations; $START$ calls main directly.... Deal with it. */
1364 msym_start = lookup_minimal_symbol ("$START$", NULL, NULL);
1365 if (msym_us
1366 && msym_start
1367 && SYMBOL_VALUE_ADDRESS (msym_us) == SYMBOL_VALUE_ADDRESS (msym_start))
1368 return 0;
1369
1370 next = get_next_frame (thisframe);
1371 if (next)
1372 next_u = find_unwind_entry (next->pc);
1373
1374 /* If this frame does not save SP, has no stack, isn't a stub,
1375 and doesn't "call" an interrupt routine or signal handler caller,
1376 then its not valid. */
1377 if (u->Save_SP || u->Total_frame_size || u->stub_unwind.stub_type != 0
1378 || (thisframe->next && thisframe->next->signal_handler_caller)
1379 || (next_u && next_u->HP_UX_interrupt_marker))
1380 return 1;
1381
1382 if (pc_in_linker_stub (thisframe->pc))
1383 return 1;
1384
1385 return 0;
1386}
1387
1388/*
1389 These functions deal with saving and restoring register state
1390 around a function call in the inferior. They keep the stack
1391 double-word aligned; eventually, on an hp700, the stack will have
1392 to be aligned to a 64-byte boundary. */
1393
1394void
1395push_dummy_frame (inf_status)
1396 struct inferior_status *inf_status;
1397{
1398 CORE_ADDR sp, pc, pcspace;
1399 register int regnum;
53a5351d 1400 CORE_ADDR int_buffer;
c906108c
SS
1401 double freg_buffer;
1402
1403 /* Oh, what a hack. If we're trying to perform an inferior call
1404 while the inferior is asleep, we have to make sure to clear
1405 the "in system call" bit in the flag register (the call will
1406 start after the syscall returns, so we're no longer in the system
1407 call!) This state is kept in "inf_status", change it there.
1408
1409 We also need a number of horrid hacks to deal with lossage in the
1410 PC queue registers (apparently they're not valid when the in syscall
1411 bit is set). */
1412 pc = target_read_pc (inferior_pid);
1413 int_buffer = read_register (FLAGS_REGNUM);
1414 if (int_buffer & 0x2)
1415 {
1416 unsigned int sid;
1417 int_buffer &= ~0x2;
7a292a7a
SS
1418 write_inferior_status_register (inf_status, 0, int_buffer);
1419 write_inferior_status_register (inf_status, PCOQ_HEAD_REGNUM, pc + 0);
1420 write_inferior_status_register (inf_status, PCOQ_TAIL_REGNUM, pc + 4);
c906108c
SS
1421 sid = (pc >> 30) & 0x3;
1422 if (sid == 0)
1423 pcspace = read_register (SR4_REGNUM);
1424 else
1425 pcspace = read_register (SR4_REGNUM + 4 + sid);
7a292a7a
SS
1426 write_inferior_status_register (inf_status, PCSQ_HEAD_REGNUM, pcspace);
1427 write_inferior_status_register (inf_status, PCSQ_TAIL_REGNUM, pcspace);
c906108c
SS
1428 }
1429 else
1430 pcspace = read_register (PCSQ_HEAD_REGNUM);
1431
1432 /* Space for "arguments"; the RP goes in here. */
1433 sp = read_register (SP_REGNUM) + 48;
1434 int_buffer = read_register (RP_REGNUM) | 0x3;
53a5351d
JM
1435
1436 /* The 32bit and 64bit ABIs save the return pointer into different
1437 stack slots. */
1438 if (REGISTER_SIZE == 8)
1439 write_memory (sp - 16, (char *) &int_buffer, REGISTER_SIZE);
1440 else
1441 write_memory (sp - 20, (char *) &int_buffer, REGISTER_SIZE);
c906108c
SS
1442
1443 int_buffer = TARGET_READ_FP ();
53a5351d 1444 write_memory (sp, (char *) &int_buffer, REGISTER_SIZE);
c906108c
SS
1445
1446 write_register (FP_REGNUM, sp);
1447
53a5351d 1448 sp += 2 * REGISTER_SIZE;
c906108c
SS
1449
1450 for (regnum = 1; regnum < 32; regnum++)
1451 if (regnum != RP_REGNUM && regnum != FP_REGNUM)
1452 sp = push_word (sp, read_register (regnum));
1453
53a5351d
JM
1454 /* This is not necessary for the 64bit ABI. In fact it is dangerous. */
1455 if (REGISTER_SIZE != 8)
1456 sp += 4;
c906108c
SS
1457
1458 for (regnum = FP0_REGNUM; regnum < NUM_REGS; regnum++)
1459 {
c5aa993b
JM
1460 read_register_bytes (REGISTER_BYTE (regnum), (char *) &freg_buffer, 8);
1461 sp = push_bytes (sp, (char *) &freg_buffer, 8);
c906108c
SS
1462 }
1463 sp = push_word (sp, read_register (IPSW_REGNUM));
1464 sp = push_word (sp, read_register (SAR_REGNUM));
1465 sp = push_word (sp, pc);
1466 sp = push_word (sp, pcspace);
1467 sp = push_word (sp, pc + 4);
1468 sp = push_word (sp, pcspace);
1469 write_register (SP_REGNUM, sp);
1470}
1471
1472static void
1473find_dummy_frame_regs (frame, frame_saved_regs)
1474 struct frame_info *frame;
1475 struct frame_saved_regs *frame_saved_regs;
1476{
1477 CORE_ADDR fp = frame->frame;
1478 int i;
1479
53a5351d
JM
1480 /* The 32bit and 64bit ABIs save RP into different locations. */
1481 if (REGISTER_SIZE == 8)
1482 frame_saved_regs->regs[RP_REGNUM] = (fp - 16) & ~0x3;
1483 else
1484 frame_saved_regs->regs[RP_REGNUM] = (fp - 20) & ~0x3;
1485
c906108c 1486 frame_saved_regs->regs[FP_REGNUM] = fp;
c906108c 1487
53a5351d
JM
1488 frame_saved_regs->regs[1] = fp + (2 * REGISTER_SIZE);
1489
1490 for (fp += 3 * REGISTER_SIZE, i = 3; i < 32; i++)
c906108c
SS
1491 {
1492 if (i != FP_REGNUM)
1493 {
1494 frame_saved_regs->regs[i] = fp;
53a5351d 1495 fp += REGISTER_SIZE;
c906108c
SS
1496 }
1497 }
1498
53a5351d
JM
1499 /* This is not necessary or desirable for the 64bit ABI. */
1500 if (REGISTER_SIZE != 8)
1501 fp += 4;
1502
c906108c
SS
1503 for (i = FP0_REGNUM; i < NUM_REGS; i++, fp += 8)
1504 frame_saved_regs->regs[i] = fp;
1505
1506 frame_saved_regs->regs[IPSW_REGNUM] = fp;
53a5351d
JM
1507 frame_saved_regs->regs[SAR_REGNUM] = fp + REGISTER_SIZE;
1508 frame_saved_regs->regs[PCOQ_HEAD_REGNUM] = fp + 2 * REGISTER_SIZE;
1509 frame_saved_regs->regs[PCSQ_HEAD_REGNUM] = fp + 3 * REGISTER_SIZE;
1510 frame_saved_regs->regs[PCOQ_TAIL_REGNUM] = fp + 4 * REGISTER_SIZE;
1511 frame_saved_regs->regs[PCSQ_TAIL_REGNUM] = fp + 5 * REGISTER_SIZE;
c906108c
SS
1512}
1513
1514void
1515hppa_pop_frame ()
1516{
1517 register struct frame_info *frame = get_current_frame ();
1518 register CORE_ADDR fp, npc, target_pc;
1519 register int regnum;
1520 struct frame_saved_regs fsr;
1521 double freg_buffer;
1522
1523 fp = FRAME_FP (frame);
1524 get_frame_saved_regs (frame, &fsr);
1525
1526#ifndef NO_PC_SPACE_QUEUE_RESTORE
c5aa993b 1527 if (fsr.regs[IPSW_REGNUM]) /* Restoring a call dummy frame */
c906108c
SS
1528 restore_pc_queue (&fsr);
1529#endif
1530
1531 for (regnum = 31; regnum > 0; regnum--)
1532 if (fsr.regs[regnum])
53a5351d
JM
1533 write_register (regnum, read_memory_integer (fsr.regs[regnum],
1534 REGISTER_SIZE));
c906108c 1535
c5aa993b 1536 for (regnum = NUM_REGS - 1; regnum >= FP0_REGNUM; regnum--)
c906108c
SS
1537 if (fsr.regs[regnum])
1538 {
c5aa993b
JM
1539 read_memory (fsr.regs[regnum], (char *) &freg_buffer, 8);
1540 write_register_bytes (REGISTER_BYTE (regnum), (char *) &freg_buffer, 8);
c906108c
SS
1541 }
1542
1543 if (fsr.regs[IPSW_REGNUM])
1544 write_register (IPSW_REGNUM,
53a5351d
JM
1545 read_memory_integer (fsr.regs[IPSW_REGNUM],
1546 REGISTER_SIZE));
c906108c
SS
1547
1548 if (fsr.regs[SAR_REGNUM])
1549 write_register (SAR_REGNUM,
53a5351d
JM
1550 read_memory_integer (fsr.regs[SAR_REGNUM],
1551 REGISTER_SIZE));
c906108c
SS
1552
1553 /* If the PC was explicitly saved, then just restore it. */
1554 if (fsr.regs[PCOQ_TAIL_REGNUM])
1555 {
53a5351d
JM
1556 npc = read_memory_integer (fsr.regs[PCOQ_TAIL_REGNUM],
1557 REGISTER_SIZE);
c906108c
SS
1558 write_register (PCOQ_TAIL_REGNUM, npc);
1559 }
1560 /* Else use the value in %rp to set the new PC. */
c5aa993b 1561 else
c906108c
SS
1562 {
1563 npc = read_register (RP_REGNUM);
1564 write_pc (npc);
1565 }
1566
53a5351d 1567 write_register (FP_REGNUM, read_memory_integer (fp, REGISTER_SIZE));
c906108c 1568
c5aa993b 1569 if (fsr.regs[IPSW_REGNUM]) /* call dummy */
c906108c
SS
1570 write_register (SP_REGNUM, fp - 48);
1571 else
1572 write_register (SP_REGNUM, fp);
1573
1574 /* The PC we just restored may be inside a return trampoline. If so
1575 we want to restart the inferior and run it through the trampoline.
1576
1577 Do this by setting a momentary breakpoint at the location the
1578 trampoline returns to.
1579
1580 Don't skip through the trampoline if we're popping a dummy frame. */
1581 target_pc = SKIP_TRAMPOLINE_CODE (npc & ~0x3) & ~0x3;
1582 if (target_pc && !fsr.regs[IPSW_REGNUM])
1583 {
1584 struct symtab_and_line sal;
1585 struct breakpoint *breakpoint;
1586 struct cleanup *old_chain;
1587
1588 /* Set up our breakpoint. Set it to be silent as the MI code
c5aa993b 1589 for "return_command" will print the frame we returned to. */
c906108c
SS
1590 sal = find_pc_line (target_pc, 0);
1591 sal.pc = target_pc;
1592 breakpoint = set_momentary_breakpoint (sal, NULL, bp_finish);
1593 breakpoint->silent = 1;
1594
1595 /* So we can clean things up. */
1596 old_chain = make_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
1597
1598 /* Start up the inferior. */
1599 clear_proceed_status ();
1600 proceed_to_finish = 1;
c5aa993b 1601 proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_DEFAULT, 0);
c906108c
SS
1602
1603 /* Perform our cleanups. */
1604 do_cleanups (old_chain);
1605 }
1606 flush_cached_frames ();
1607}
1608
1609/* After returning to a dummy on the stack, restore the instruction
1610 queue space registers. */
1611
1612static int
1613restore_pc_queue (fsr)
1614 struct frame_saved_regs *fsr;
1615{
1616 CORE_ADDR pc = read_pc ();
53a5351d
JM
1617 CORE_ADDR new_pc = read_memory_integer (fsr->regs[PCOQ_HEAD_REGNUM],
1618 TARGET_PTR_BIT / 8);
c906108c
SS
1619 struct target_waitstatus w;
1620 int insn_count;
1621
1622 /* Advance past break instruction in the call dummy. */
1623 write_register (PCOQ_HEAD_REGNUM, pc + 4);
1624 write_register (PCOQ_TAIL_REGNUM, pc + 8);
1625
1626 /* HPUX doesn't let us set the space registers or the space
1627 registers of the PC queue through ptrace. Boo, hiss.
1628 Conveniently, the call dummy has this sequence of instructions
1629 after the break:
c5aa993b
JM
1630 mtsp r21, sr0
1631 ble,n 0(sr0, r22)
1632
c906108c
SS
1633 So, load up the registers and single step until we are in the
1634 right place. */
1635
53a5351d
JM
1636 write_register (21, read_memory_integer (fsr->regs[PCSQ_HEAD_REGNUM],
1637 REGISTER_SIZE));
c906108c
SS
1638 write_register (22, new_pc);
1639
1640 for (insn_count = 0; insn_count < 3; insn_count++)
1641 {
1642 /* FIXME: What if the inferior gets a signal right now? Want to
c5aa993b
JM
1643 merge this into wait_for_inferior (as a special kind of
1644 watchpoint? By setting a breakpoint at the end? Is there
1645 any other choice? Is there *any* way to do this stuff with
1646 ptrace() or some equivalent?). */
c906108c
SS
1647 resume (1, 0);
1648 target_wait (inferior_pid, &w);
1649
1650 if (w.kind == TARGET_WAITKIND_SIGNALLED)
c5aa993b
JM
1651 {
1652 stop_signal = w.value.sig;
1653 terminal_ours_for_output ();
1654 printf_unfiltered ("\nProgram terminated with signal %s, %s.\n",
c906108c
SS
1655 target_signal_to_name (stop_signal),
1656 target_signal_to_string (stop_signal));
c5aa993b
JM
1657 gdb_flush (gdb_stdout);
1658 return 0;
1659 }
c906108c
SS
1660 }
1661 target_terminal_ours ();
1662 target_fetch_registers (-1);
1663 return 1;
1664}
1665
53a5351d
JM
1666/* This function pushes a stack frame with arguments as part of the
1667 inferior function calling mechanism.
c906108c 1668
53a5351d
JM
1669 For PAs the stack always grows to higher addresses. However the arguments
1670 may grow to either higher or lower addresses depending on which ABI is
1671 currently in use.
c906108c 1672
53a5351d
JM
1673 We simply allocate the appropriate amount of stack space and put
1674 arguments into their proper slots. The call dummy code will copy
1675 arguments into registers as needed by the ABI.
c906108c 1676
53a5351d
JM
1677 Note for the PA64 ABI we load up the argument pointer since the caller
1678 must provide the argument pointer to the callee. */
1679
c906108c
SS
1680CORE_ADDR
1681hppa_push_arguments (nargs, args, sp, struct_return, struct_addr)
1682 int nargs;
1683 value_ptr *args;
1684 CORE_ADDR sp;
1685 int struct_return;
1686 CORE_ADDR struct_addr;
1687{
1688 /* array of arguments' offsets */
c5aa993b 1689 int *offset = (int *) alloca (nargs * sizeof (int));
53a5351d
JM
1690
1691 /* array of arguments' lengths: real lengths in bytes, not aligned to
1692 word size */
c5aa993b 1693 int *lengths = (int *) alloca (nargs * sizeof (int));
c906108c 1694
53a5351d
JM
1695 /* The value of SP as it was passed into this function after
1696 aligning. */
1697 CORE_ADDR orig_sp = STACK_ALIGN (sp);
c906108c 1698
53a5351d
JM
1699 /* The number of stack bytes occupied by the current argument. */
1700 int bytes_reserved;
1701
1702 /* The total number of bytes reserved for the arguments. */
1703 int cum_bytes_reserved = 0;
c906108c 1704
53a5351d
JM
1705 /* Similarly, but aligned. */
1706 int cum_bytes_aligned = 0;
1707 int i;
c5aa993b 1708
53a5351d 1709 /* Iterate over each argument provided by the user. */
c906108c
SS
1710 for (i = 0; i < nargs; i++)
1711 {
c906108c
SS
1712 lengths[i] = TYPE_LENGTH (VALUE_TYPE (args[i]));
1713
53a5351d
JM
1714 /* Align the size of the argument to the word size for this
1715 target. */
1716 bytes_reserved = (lengths[i] + REGISTER_SIZE - 1) & -REGISTER_SIZE;
c906108c 1717
53a5351d 1718#ifdef ARGS_GROW_DOWNWARD
c906108c 1719 offset[i] = cum_bytes_reserved + lengths[i];
53a5351d
JM
1720#else
1721 /* If the arguments grow towards lower addresses, then we want
1722 offset[i] to point to the start of the argument rather than
1723 the end of the argument. */
1724 offset[i] = cum_bytes_reserved;
1725
1726 offset[i] += (lengths[i] < REGISTER_SIZE
1727 ? REGISTER_SIZE - lengths[i] : 0);
1728#endif
c906108c 1729
53a5351d
JM
1730 /* If the argument is a double word argument, then it needs to be
1731 double word aligned.
1732
1733 ?!? I do not think this code is correct when !ARGS_GROW_DOWNWAR. */
1734 if ((bytes_reserved == 2 * REGISTER_SIZE)
1735 && (offset[i] % 2 * REGISTER_SIZE))
c5aa993b
JM
1736 {
1737 int new_offset = 0;
53a5351d
JM
1738 /* BYTES_RESERVED is already aligned to the word, so we put
1739 the argument at one word more down the stack.
1740
1741 This will leave one empty word on the stack, and one unused
1742 register as mandated by the ABI. */
1743 new_offset = ((offset[i] + 2 * REGISTER_SIZE - 1)
1744 & -(2 * REGISTER_SIZE));
1745
1746 if ((new_offset - offset[i]) >= 2 * REGISTER_SIZE)
c5aa993b 1747 {
53a5351d
JM
1748 bytes_reserved += REGISTER_SIZE;
1749 offset[i] += REGISTER_SIZE;
c5aa993b
JM
1750 }
1751 }
c906108c
SS
1752
1753 cum_bytes_reserved += bytes_reserved;
1754
1755 }
1756
53a5351d
JM
1757 /* CUM_BYTES_RESERVED already accounts for all the arguments
1758 passed by the user. However, the ABIs mandate minimum stack space
1759 allocations for outgoing arguments.
1760
1761 The ABIs also mandate minimum stack alignments which we must
1762 preserve. */
c906108c 1763 cum_bytes_aligned = STACK_ALIGN (cum_bytes_reserved);
53a5351d
JM
1764 sp += max (cum_bytes_aligned, REG_PARM_STACK_SPACE);
1765
1766 /* Now write each of the args at the proper offset down the stack.
1767
1768 The two ABIs write arguments in different directions using different
1769 starting points. What fun.
c906108c 1770
53a5351d
JM
1771 ?!? We need to promote values to a full register instead of skipping
1772 words in the stack. */
1773#ifndef ARGS_GROW_DOWNWARD
1774 for (i = 0; i < nargs; i++)
1775 write_memory (orig_sp + offset[i], VALUE_CONTENTS (args[i]), lengths[i]);
1776#else
c906108c
SS
1777 for (i = 0; i < nargs; i++)
1778 write_memory (sp - offset[i], VALUE_CONTENTS (args[i]), lengths[i]);
53a5351d 1779#endif
c906108c 1780
53a5351d
JM
1781 /* If a structure has to be returned, set up register 28 to hold its
1782 address */
c906108c
SS
1783 if (struct_return)
1784 write_register (28, struct_addr);
1785
53a5351d
JM
1786#ifndef ARGS_GROW_DOWNWARD
1787 /* For the PA64 we must pass a pointer to the outgoing argument list.
1788 The ABI mandates that the pointer should point to the first byte of
1789 storage beyond the register flushback area.
1790
1791 However, the call dummy expects the outgoing argument pointer to
1792 be passed in register %r4. */
1793 write_register (4, orig_sp + REG_PARM_STACK_SPACE);
1794
1795 /* ?!? This needs further work. We need to set up the global data
1796 pointer for this procedure. This assumes the same global pointer
1797 for every procedure. The call dummy expects the dp value to
1798 be passed in register %r6. */
1799 write_register (6, read_register (27));
1800#endif
1801
1802 /* The stack will have 32 bytes of additional space for a frame marker. */
c906108c
SS
1803 return sp + 32;
1804}
1805
1806
1807/* elz: this function returns a value which is built looking at the given address.
1808 It is called from call_function_by_hand, in case we need to return a
1809 value which is larger than 64 bits, and it is stored in the stack rather than
1810 in the registers r28 and r29 or fr4.
1811 This function does the same stuff as value_being_returned in values.c, but
1812 gets the value from the stack rather than from the buffer where all the
1813 registers were saved when the function called completed. */
1814value_ptr
c5aa993b 1815hppa_value_returned_from_stack (valtype, addr)
c906108c
SS
1816 register struct type *valtype;
1817 CORE_ADDR addr;
1818{
1819 register value_ptr val;
1820
1821 val = allocate_value (valtype);
1822 CHECK_TYPEDEF (valtype);
c5aa993b 1823 target_read_memory (addr, VALUE_CONTENTS_RAW (val), TYPE_LENGTH (valtype));
c906108c
SS
1824
1825 return val;
1826}
1827
1828
1829
1830/* elz: Used to lookup a symbol in the shared libraries.
c5aa993b
JM
1831 This function calls shl_findsym, indirectly through a
1832 call to __d_shl_get. __d_shl_get is in end.c, which is always
1833 linked in by the hp compilers/linkers.
1834 The call to shl_findsym cannot be made directly because it needs
1835 to be active in target address space.
1836 inputs: - minimal symbol pointer for the function we want to look up
1837 - address in target space of the descriptor for the library
1838 where we want to look the symbol up.
1839 This address is retrieved using the
1840 som_solib_get_solib_by_pc function (somsolib.c).
1841 output: - real address in the library of the function.
1842 note: the handle can be null, in which case shl_findsym will look for
1843 the symbol in all the loaded shared libraries.
1844 files to look at if you need reference on this stuff:
1845 dld.c, dld_shl_findsym.c
1846 end.c
1847 man entry for shl_findsym */
c906108c
SS
1848
1849CORE_ADDR
c5aa993b
JM
1850find_stub_with_shl_get (function, handle)
1851 struct minimal_symbol *function;
1852 CORE_ADDR handle;
c906108c 1853{
c5aa993b
JM
1854 struct symbol *get_sym, *symbol2;
1855 struct minimal_symbol *buff_minsym, *msymbol;
1856 struct type *ftype;
1857 value_ptr *args;
1858 value_ptr funcval, val;
1859
1860 int x, namelen, err_value, tmp = -1;
1861 CORE_ADDR endo_buff_addr, value_return_addr, errno_return_addr;
1862 CORE_ADDR stub_addr;
1863
1864
1865 args = (value_ptr *) alloca (sizeof (value_ptr) * 8); /* 6 for the arguments and one null one??? */
1866 funcval = find_function_in_inferior ("__d_shl_get");
1867 get_sym = lookup_symbol ("__d_shl_get", NULL, VAR_NAMESPACE, NULL, NULL);
1868 buff_minsym = lookup_minimal_symbol ("__buffer", NULL, NULL);
1869 msymbol = lookup_minimal_symbol ("__shldp", NULL, NULL);
1870 symbol2 = lookup_symbol ("__shldp", NULL, VAR_NAMESPACE, NULL, NULL);
1871 endo_buff_addr = SYMBOL_VALUE_ADDRESS (buff_minsym);
1872 namelen = strlen (SYMBOL_NAME (function));
1873 value_return_addr = endo_buff_addr + namelen;
1874 ftype = check_typedef (SYMBOL_TYPE (get_sym));
1875
1876 /* do alignment */
1877 if ((x = value_return_addr % 64) != 0)
1878 value_return_addr = value_return_addr + 64 - x;
1879
1880 errno_return_addr = value_return_addr + 64;
1881
1882
1883 /* set up stuff needed by __d_shl_get in buffer in end.o */
1884
1885 target_write_memory (endo_buff_addr, SYMBOL_NAME (function), namelen);
1886
1887 target_write_memory (value_return_addr, (char *) &tmp, 4);
1888
1889 target_write_memory (errno_return_addr, (char *) &tmp, 4);
1890
1891 target_write_memory (SYMBOL_VALUE_ADDRESS (msymbol),
1892 (char *) &handle, 4);
1893
1894 /* now prepare the arguments for the call */
1895
1896 args[0] = value_from_longest (TYPE_FIELD_TYPE (ftype, 0), 12);
1897 args[1] = value_from_longest (TYPE_FIELD_TYPE (ftype, 1), SYMBOL_VALUE_ADDRESS (msymbol));
1898 args[2] = value_from_longest (TYPE_FIELD_TYPE (ftype, 2), endo_buff_addr);
1899 args[3] = value_from_longest (TYPE_FIELD_TYPE (ftype, 3), TYPE_PROCEDURE);
1900 args[4] = value_from_longest (TYPE_FIELD_TYPE (ftype, 4), value_return_addr);
1901 args[5] = value_from_longest (TYPE_FIELD_TYPE (ftype, 5), errno_return_addr);
1902
1903 /* now call the function */
1904
1905 val = call_function_by_hand (funcval, 6, args);
1906
1907 /* now get the results */
1908
1909 target_read_memory (errno_return_addr, (char *) &err_value, sizeof (err_value));
1910
1911 target_read_memory (value_return_addr, (char *) &stub_addr, sizeof (stub_addr));
1912 if (stub_addr <= 0)
104c1213 1913 error ("call to __d_shl_get failed, error code is %d", err_value);
c5aa993b
JM
1914
1915 return (stub_addr);
c906108c
SS
1916}
1917
c5aa993b 1918/* Cover routine for find_stub_with_shl_get to pass to catch_errors */
a0b3c4fd
JM
1919static int
1920cover_find_stub_with_shl_get (PTR args_untyped)
c906108c 1921{
a0b3c4fd
JM
1922 args_for_find_stub *args = args_untyped;
1923 args->return_val = find_stub_with_shl_get (args->msym, args->solib_handle);
1924 return 0;
c906108c
SS
1925}
1926
c906108c
SS
1927/* Insert the specified number of args and function address
1928 into a call sequence of the above form stored at DUMMYNAME.
1929
1930 On the hppa we need to call the stack dummy through $$dyncall.
1931 Therefore our version of FIX_CALL_DUMMY takes an extra argument,
1932 real_pc, which is the location where gdb should start up the
cce74817
JM
1933 inferior to do the function call.
1934
1935 This has to work across several versions of hpux, bsd, osf1. It has to
1936 work regardless of what compiler was used to build the inferior program.
1937 It should work regardless of whether or not end.o is available. It has
1938 to work even if gdb can not call into the dynamic loader in the inferior
1939 to query it for symbol names and addresses.
1940
1941 Yes, all those cases should work. Luckily code exists to handle most
1942 of them. The complexity is in selecting exactly what scheme should
1943 be used to perform the inferior call.
1944
1945 At the current time this routine is known not to handle cases where
1946 the program was linked with HP's compiler without including end.o.
1947
1948 Please contact Jeff Law (law@cygnus.com) before changing this code. */
c906108c
SS
1949
1950CORE_ADDR
1951hppa_fix_call_dummy (dummy, pc, fun, nargs, args, type, gcc_p)
1952 char *dummy;
1953 CORE_ADDR pc;
1954 CORE_ADDR fun;
1955 int nargs;
1956 value_ptr *args;
1957 struct type *type;
1958 int gcc_p;
1959{
1960 CORE_ADDR dyncall_addr;
1961 struct minimal_symbol *msymbol;
1962 struct minimal_symbol *trampoline;
1963 int flags = read_register (FLAGS_REGNUM);
cce74817
JM
1964 struct unwind_table_entry *u = NULL;
1965 CORE_ADDR new_stub = 0;
1966 CORE_ADDR solib_handle = 0;
1967
1968 /* Nonzero if we will use GCC's PLT call routine. This routine must be
c5aa993b 1969 passed an import stub, not a PLABEL. It is also necessary to set %r19
cce74817 1970 (the PIC register) before performing the call.
c906108c 1971
cce74817
JM
1972 If zero, then we are using __d_plt_call (HP's PLT call routine) or we
1973 are calling the target directly. When using __d_plt_call we want to
1974 use a PLABEL instead of an import stub. */
1975 int using_gcc_plt_call = 1;
1976
53a5351d
JM
1977#ifdef GDB_TARGET_IS_HPPA_20W
1978 /* We currently use completely different code for the PA2.0W inferior
1979 function call sequences. This needs to be cleaned up. */
1980 {
1981 CORE_ADDR pcsqh, pcsqt, pcoqh, pcoqt, sr5;
1982 struct target_waitstatus w;
1983 int inst1, inst2;
1984 char buf[4];
1985 int status;
1986 struct objfile *objfile;
1987
1988 /* We can not modify the PC space queues directly, so we start
1989 up the inferior and execute a couple instructions to set the
1990 space queues so that they point to the call dummy in the stack. */
1991 pcsqh = read_register (PCSQ_HEAD_REGNUM);
1992 sr5 = read_register (SR5_REGNUM);
1993 if (1)
1994 {
1995 pcoqh = read_register (PCOQ_HEAD_REGNUM);
1996 pcoqt = read_register (PCOQ_TAIL_REGNUM);
1997 if (target_read_memory (pcoqh, buf, 4) != 0)
1998 error ("Couldn't modify space queue\n");
1999 inst1 = extract_unsigned_integer (buf, 4);
2000
2001 if (target_read_memory (pcoqt, buf, 4) != 0)
2002 error ("Couldn't modify space queue\n");
2003 inst2 = extract_unsigned_integer (buf, 4);
2004
2005 /* BVE (r1) */
2006 *((int *) buf) = 0xe820d000;
2007 if (target_write_memory (pcoqh, buf, 4) != 0)
2008 error ("Couldn't modify space queue\n");
2009
2010 /* NOP */
2011 *((int *) buf) = 0x08000240;
2012 if (target_write_memory (pcoqt, buf, 4) != 0)
2013 {
2014 *((int *) buf) = inst1;
2015 target_write_memory (pcoqh, buf, 4);
2016 error ("Couldn't modify space queue\n");
2017 }
2018
2019 write_register (1, pc);
2020
2021 /* Single step twice, the BVE instruction will set the space queue
2022 such that it points to the PC value written immediately above
2023 (ie the call dummy). */
2024 resume (1, 0);
2025 target_wait (inferior_pid, &w);
2026 resume (1, 0);
2027 target_wait (inferior_pid, &w);
2028
2029 /* Restore the two instructions at the old PC locations. */
2030 *((int *) buf) = inst1;
2031 target_write_memory (pcoqh, buf, 4);
2032 *((int *) buf) = inst2;
2033 target_write_memory (pcoqt, buf, 4);
2034 }
2035
2036 /* The call dummy wants the ultimate destination address initially
2037 in register %r5. */
2038 write_register (5, fun);
2039
2040 /* We need to see if this objfile has a different DP value than our
2041 own (it could be a shared library for example. */
2042 ALL_OBJFILES (objfile)
2043 {
2044 struct obj_section *s;
2045 obj_private_data_t *obj_private;
2046
2047 /* See if FUN is in any section within this shared library. */
2048 for (s = objfile->sections; s < objfile->sections_end; s++)
2049 if (s->addr <= fun && fun < s->endaddr)
2050 break;
2051
2052 if (s >= objfile->sections_end)
2053 continue;
2054
2055 obj_private = (obj_private_data_t *) objfile->obj_private;
2056
2057 /* The DP value may be different for each objfile. But within an
2058 objfile each function uses the same dp value. Thus we do not need
2059 to grope around the opd section looking for dp values.
2060
2061 ?!? This is not strictly correct since we may be in a shared library
2062 and want to call back into the main program. To make that case
2063 work correctly we need to set obj_private->dp for the main program's
2064 objfile, then remove this conditional. */
2065 if (obj_private->dp)
2066 write_register (27, obj_private->dp);
2067 break;
2068 }
2069 return pc;
2070 }
2071#endif
2072
2073#ifndef GDB_TARGET_IS_HPPA_20W
cce74817 2074 /* Prefer __gcc_plt_call over the HP supplied routine because
c5aa993b 2075 __gcc_plt_call works for any number of arguments. */
c906108c 2076 trampoline = NULL;
cce74817
JM
2077 if (lookup_minimal_symbol ("__gcc_plt_call", NULL, NULL) == NULL)
2078 using_gcc_plt_call = 0;
2079
c906108c
SS
2080 msymbol = lookup_minimal_symbol ("$$dyncall", NULL, NULL);
2081 if (msymbol == NULL)
cce74817 2082 error ("Can't find an address for $$dyncall trampoline");
c906108c
SS
2083
2084 dyncall_addr = SYMBOL_VALUE_ADDRESS (msymbol);
2085
2086 /* FUN could be a procedure label, in which case we have to get
cce74817
JM
2087 its real address and the value of its GOT/DP if we plan to
2088 call the routine via gcc_plt_call. */
2089 if ((fun & 0x2) && using_gcc_plt_call)
c906108c
SS
2090 {
2091 /* Get the GOT/DP value for the target function. It's
c5aa993b
JM
2092 at *(fun+4). Note the call dummy is *NOT* allowed to
2093 trash %r19 before calling the target function. */
53a5351d
JM
2094 write_register (19, read_memory_integer ((fun & ~0x3) + 4,
2095 REGISTER_SIZE));
c906108c
SS
2096
2097 /* Now get the real address for the function we are calling, it's
c5aa993b 2098 at *fun. */
53a5351d
JM
2099 fun = (CORE_ADDR) read_memory_integer (fun & ~0x3,
2100 TARGET_PTR_BIT / 8);
c906108c
SS
2101 }
2102 else
2103 {
2104
2105#ifndef GDB_TARGET_IS_PA_ELF
cce74817 2106 /* FUN could be an export stub, the real address of a function, or
c5aa993b
JM
2107 a PLABEL. When using gcc's PLT call routine we must call an import
2108 stub rather than the export stub or real function for lazy binding
2109 to work correctly
cce74817 2110
c5aa993b
JM
2111 /* If we are using the gcc PLT call routine, then we need to
2112 get the import stub for the target function. */
cce74817 2113 if (using_gcc_plt_call && som_solib_get_got_by_pc (fun))
c906108c
SS
2114 {
2115 struct objfile *objfile;
2116 struct minimal_symbol *funsymbol, *stub_symbol;
2117 CORE_ADDR newfun = 0;
2118
2119 funsymbol = lookup_minimal_symbol_by_pc (fun);
2120 if (!funsymbol)
2121 error ("Unable to find minimal symbol for target fucntion.\n");
2122
2123 /* Search all the object files for an import symbol with the
2124 right name. */
2125 ALL_OBJFILES (objfile)
c5aa993b
JM
2126 {
2127 stub_symbol
2128 = lookup_minimal_symbol_solib_trampoline
2129 (SYMBOL_NAME (funsymbol), NULL, objfile);
2130
2131 if (!stub_symbol)
2132 stub_symbol = lookup_minimal_symbol (SYMBOL_NAME (funsymbol),
2133 NULL, objfile);
2134
2135 /* Found a symbol with the right name. */
2136 if (stub_symbol)
2137 {
2138 struct unwind_table_entry *u;
2139 /* It must be a shared library trampoline. */
2140 if (MSYMBOL_TYPE (stub_symbol) != mst_solib_trampoline)
2141 continue;
2142
2143 /* It must also be an import stub. */
2144 u = find_unwind_entry (SYMBOL_VALUE (stub_symbol));
2145 if (!u
2146 || (u->stub_unwind.stub_type != IMPORT)
2147 && u->stub_unwind.stub_type != IMPORT_SHLIB)
2148 continue;
2149
2150 /* OK. Looks like the correct import stub. */
2151 newfun = SYMBOL_VALUE (stub_symbol);
2152 fun = newfun;
2153 }
2154 }
cce74817
JM
2155
2156 /* Ouch. We did not find an import stub. Make an attempt to
2157 do the right thing instead of just croaking. Most of the
2158 time this will actually work. */
c906108c
SS
2159 if (newfun == 0)
2160 write_register (19, som_solib_get_got_by_pc (fun));
cce74817
JM
2161
2162 u = find_unwind_entry (fun);
c5aa993b 2163 if (u
cce74817
JM
2164 && (u->stub_unwind.stub_type == IMPORT
2165 || u->stub_unwind.stub_type == IMPORT_SHLIB))
2166 trampoline = lookup_minimal_symbol ("__gcc_plt_call", NULL, NULL);
2167
2168 /* If we found the import stub in the shared library, then we have
2169 to set %r19 before we call the stub. */
2170 if (u && u->stub_unwind.stub_type == IMPORT_SHLIB)
2171 write_register (19, som_solib_get_got_by_pc (fun));
c906108c 2172 }
c906108c
SS
2173#endif
2174 }
2175
cce74817
JM
2176 /* If we are calling into another load module then have sr4export call the
2177 magic __d_plt_call routine which is linked in from end.o.
c906108c 2178
cce74817
JM
2179 You can't use _sr4export to make the call as the value in sp-24 will get
2180 fried and you end up returning to the wrong location. You can't call the
2181 target as the code to bind the PLT entry to a function can't return to a
2182 stack address.
2183
2184 Also, query the dynamic linker in the inferior to provide a suitable
2185 PLABEL for the target function. */
c5aa993b 2186 if (!using_gcc_plt_call)
c906108c
SS
2187 {
2188 CORE_ADDR new_fun;
2189
cce74817 2190 /* Get a handle for the shared library containing FUN. Given the
c5aa993b 2191 handle we can query the shared library for a PLABEL. */
cce74817 2192 solib_handle = som_solib_get_solib_by_pc (fun);
c906108c 2193
cce74817 2194 if (solib_handle)
c906108c 2195 {
cce74817 2196 struct minimal_symbol *fmsymbol = lookup_minimal_symbol_by_pc (fun);
c906108c 2197
cce74817
JM
2198 trampoline = lookup_minimal_symbol ("__d_plt_call", NULL, NULL);
2199
2200 if (trampoline == NULL)
2201 {
2202 error ("Can't find an address for __d_plt_call or __gcc_plt_call trampoline\nSuggest linking executable with -g or compiling with gcc.");
2203 }
2204
2205 /* This is where sr4export will jump to. */
2206 new_fun = SYMBOL_VALUE_ADDRESS (trampoline);
2207
2208 /* If the function is in a shared library, then call __d_shl_get to
2209 get a PLABEL for the target function. */
2210 new_stub = find_stub_with_shl_get (fmsymbol, solib_handle);
2211
c5aa993b 2212 if (new_stub == 0)
cce74817 2213 error ("Can't find an import stub for %s", SYMBOL_NAME (fmsymbol));
c906108c
SS
2214
2215 /* We have to store the address of the stub in __shlib_funcptr. */
cce74817 2216 msymbol = lookup_minimal_symbol ("__shlib_funcptr", NULL,
c5aa993b 2217 (struct objfile *) NULL);
c906108c 2218
cce74817
JM
2219 if (msymbol == NULL)
2220 error ("Can't find an address for __shlib_funcptr");
2221 target_write_memory (SYMBOL_VALUE_ADDRESS (msymbol),
c5aa993b 2222 (char *) &new_stub, 4);
c906108c
SS
2223
2224 /* We want sr4export to call __d_plt_call, so we claim it is
2225 the final target. Clear trampoline. */
cce74817
JM
2226 fun = new_fun;
2227 trampoline = NULL;
c906108c
SS
2228 }
2229 }
2230
2231 /* Store upper 21 bits of function address into ldil. fun will either be
2232 the final target (most cases) or __d_plt_call when calling into a shared
2233 library and __gcc_plt_call is not available. */
2234 store_unsigned_integer
2235 (&dummy[FUNC_LDIL_OFFSET],
2236 INSTRUCTION_SIZE,
2237 deposit_21 (fun >> 11,
2238 extract_unsigned_integer (&dummy[FUNC_LDIL_OFFSET],
2239 INSTRUCTION_SIZE)));
2240
2241 /* Store lower 11 bits of function address into ldo */
2242 store_unsigned_integer
2243 (&dummy[FUNC_LDO_OFFSET],
2244 INSTRUCTION_SIZE,
2245 deposit_14 (fun & MASK_11,
2246 extract_unsigned_integer (&dummy[FUNC_LDO_OFFSET],
2247 INSTRUCTION_SIZE)));
2248#ifdef SR4EXPORT_LDIL_OFFSET
2249
2250 {
2251 CORE_ADDR trampoline_addr;
2252
2253 /* We may still need sr4export's address too. */
2254
2255 if (trampoline == NULL)
2256 {
2257 msymbol = lookup_minimal_symbol ("_sr4export", NULL, NULL);
2258 if (msymbol == NULL)
cce74817 2259 error ("Can't find an address for _sr4export trampoline");
c906108c
SS
2260
2261 trampoline_addr = SYMBOL_VALUE_ADDRESS (msymbol);
2262 }
2263 else
2264 trampoline_addr = SYMBOL_VALUE_ADDRESS (trampoline);
2265
2266
2267 /* Store upper 21 bits of trampoline's address into ldil */
2268 store_unsigned_integer
2269 (&dummy[SR4EXPORT_LDIL_OFFSET],
2270 INSTRUCTION_SIZE,
2271 deposit_21 (trampoline_addr >> 11,
2272 extract_unsigned_integer (&dummy[SR4EXPORT_LDIL_OFFSET],
2273 INSTRUCTION_SIZE)));
2274
2275 /* Store lower 11 bits of trampoline's address into ldo */
2276 store_unsigned_integer
2277 (&dummy[SR4EXPORT_LDO_OFFSET],
2278 INSTRUCTION_SIZE,
2279 deposit_14 (trampoline_addr & MASK_11,
2280 extract_unsigned_integer (&dummy[SR4EXPORT_LDO_OFFSET],
2281 INSTRUCTION_SIZE)));
2282 }
2283#endif
2284
2285 write_register (22, pc);
2286
2287 /* If we are in a syscall, then we should call the stack dummy
2288 directly. $$dyncall is not needed as the kernel sets up the
2289 space id registers properly based on the value in %r31. In
2290 fact calling $$dyncall will not work because the value in %r22
2291 will be clobbered on the syscall exit path.
2292
2293 Similarly if the current PC is in a shared library. Note however,
2294 this scheme won't work if the shared library isn't mapped into
2295 the same space as the stack. */
2296 if (flags & 2)
2297 return pc;
2298#ifndef GDB_TARGET_IS_PA_ELF
2299 else if (som_solib_get_got_by_pc (target_read_pc (inferior_pid)))
2300 return pc;
2301#endif
2302 else
2303 return dyncall_addr;
53a5351d 2304#endif
c906108c
SS
2305}
2306
2307
2308
2309
2310/* If the pid is in a syscall, then the FP register is not readable.
2311 We'll return zero in that case, rather than attempting to read it
2312 and cause a warning. */
2313CORE_ADDR
2314target_read_fp (pid)
c5aa993b 2315 int pid;
c906108c
SS
2316{
2317 int flags = read_register (FLAGS_REGNUM);
2318
c5aa993b
JM
2319 if (flags & 2)
2320 {
2321 return (CORE_ADDR) 0;
2322 }
c906108c
SS
2323
2324 /* This is the only site that may directly read_register () the FP
2325 register. All others must use TARGET_READ_FP (). */
2326 return read_register (FP_REGNUM);
2327}
2328
2329
2330/* Get the PC from %r31 if currently in a syscall. Also mask out privilege
2331 bits. */
2332
2333CORE_ADDR
2334target_read_pc (pid)
2335 int pid;
2336{
2337 int flags = read_register_pid (FLAGS_REGNUM, pid);
2338
2339 /* The following test does not belong here. It is OS-specific, and belongs
2340 in native code. */
2341 /* Test SS_INSYSCALL */
2342 if (flags & 2)
2343 return read_register_pid (31, pid) & ~0x3;
2344
2345 return read_register_pid (PC_REGNUM, pid) & ~0x3;
2346}
2347
2348/* Write out the PC. If currently in a syscall, then also write the new
2349 PC value into %r31. */
2350
2351void
2352target_write_pc (v, pid)
2353 CORE_ADDR v;
2354 int pid;
2355{
2356 int flags = read_register_pid (FLAGS_REGNUM, pid);
2357
2358 /* The following test does not belong here. It is OS-specific, and belongs
2359 in native code. */
2360 /* If in a syscall, then set %r31. Also make sure to get the
2361 privilege bits set correctly. */
2362 /* Test SS_INSYSCALL */
2363 if (flags & 2)
2364 write_register_pid (31, v | 0x3, pid);
2365
2366 write_register_pid (PC_REGNUM, v, pid);
2367 write_register_pid (NPC_REGNUM, v + 4, pid);
2368}
2369
2370/* return the alignment of a type in bytes. Structures have the maximum
2371 alignment required by their fields. */
2372
2373static int
2374hppa_alignof (type)
2375 struct type *type;
2376{
2377 int max_align, align, i;
2378 CHECK_TYPEDEF (type);
2379 switch (TYPE_CODE (type))
2380 {
2381 case TYPE_CODE_PTR:
2382 case TYPE_CODE_INT:
2383 case TYPE_CODE_FLT:
2384 return TYPE_LENGTH (type);
2385 case TYPE_CODE_ARRAY:
2386 return hppa_alignof (TYPE_FIELD_TYPE (type, 0));
2387 case TYPE_CODE_STRUCT:
2388 case TYPE_CODE_UNION:
2389 max_align = 1;
2390 for (i = 0; i < TYPE_NFIELDS (type); i++)
2391 {
2392 /* Bit fields have no real alignment. */
2393 /* if (!TYPE_FIELD_BITPOS (type, i)) */
c5aa993b 2394 if (!TYPE_FIELD_BITSIZE (type, i)) /* elz: this should be bitsize */
c906108c
SS
2395 {
2396 align = hppa_alignof (TYPE_FIELD_TYPE (type, i));
2397 max_align = max (max_align, align);
2398 }
2399 }
2400 return max_align;
2401 default:
2402 return 4;
2403 }
2404}
2405
2406/* Print the register regnum, or all registers if regnum is -1 */
2407
2408void
2409pa_do_registers_info (regnum, fpregs)
2410 int regnum;
2411 int fpregs;
2412{
c5aa993b 2413 char raw_regs[REGISTER_BYTES];
c906108c
SS
2414 int i;
2415
2416 /* Make a copy of gdb's save area (may cause actual
2417 reads from the target). */
2418 for (i = 0; i < NUM_REGS; i++)
2419 read_relative_register_raw_bytes (i, raw_regs + REGISTER_BYTE (i));
2420
2421 if (regnum == -1)
2422 pa_print_registers (raw_regs, regnum, fpregs);
c5aa993b
JM
2423 else if (regnum < FP4_REGNUM)
2424 {
2425 long reg_val[2];
2426
2427 /* Why is the value not passed through "extract_signed_integer"
2428 as in "pa_print_registers" below? */
2429 pa_register_look_aside (raw_regs, regnum, &reg_val[0]);
2430
2431 if (!is_pa_2)
2432 {
2433 printf_unfiltered ("%s %x\n", REGISTER_NAME (regnum), reg_val[1]);
2434 }
c906108c 2435 else
c5aa993b
JM
2436 {
2437 /* Fancy % formats to prevent leading zeros. */
2438 if (reg_val[0] == 0)
2439 printf_unfiltered ("%s %x\n", REGISTER_NAME (regnum), reg_val[1]);
2440 else
2441 printf_unfiltered ("%s %x%8.8x\n", REGISTER_NAME (regnum),
2442 reg_val[0], reg_val[1]);
2443 }
c906108c 2444 }
c906108c 2445 else
c5aa993b
JM
2446 /* Note that real floating point values only start at
2447 FP4_REGNUM. FP0 and up are just status and error
2448 registers, which have integral (bit) values. */
c906108c
SS
2449 pa_print_fp_reg (regnum);
2450}
2451
2452/********** new function ********************/
2453void
2454pa_do_strcat_registers_info (regnum, fpregs, stream, precision)
2455 int regnum;
2456 int fpregs;
2457 GDB_FILE *stream;
2458 enum precision_type precision;
2459{
c5aa993b 2460 char raw_regs[REGISTER_BYTES];
c906108c
SS
2461 int i;
2462
2463 /* Make a copy of gdb's save area (may cause actual
c5aa993b 2464 reads from the target). */
c906108c
SS
2465 for (i = 0; i < NUM_REGS; i++)
2466 read_relative_register_raw_bytes (i, raw_regs + REGISTER_BYTE (i));
2467
2468 if (regnum == -1)
2469 pa_strcat_registers (raw_regs, regnum, fpregs, stream);
2470
c5aa993b
JM
2471 else if (regnum < FP4_REGNUM)
2472 {
2473 long reg_val[2];
2474
2475 /* Why is the value not passed through "extract_signed_integer"
2476 as in "pa_print_registers" below? */
2477 pa_register_look_aside (raw_regs, regnum, &reg_val[0]);
c906108c 2478
c5aa993b
JM
2479 if (!is_pa_2)
2480 {
2481 fprintf_unfiltered (stream, "%s %x", REGISTER_NAME (regnum), reg_val[1]);
2482 }
c906108c 2483 else
c5aa993b
JM
2484 {
2485 /* Fancy % formats to prevent leading zeros. */
2486 if (reg_val[0] == 0)
2487 fprintf_unfiltered (stream, "%s %x", REGISTER_NAME (regnum),
2488 reg_val[1]);
2489 else
2490 fprintf_unfiltered (stream, "%s %x%8.8x", REGISTER_NAME (regnum),
2491 reg_val[0], reg_val[1]);
2492 }
c906108c 2493 }
c906108c 2494 else
c5aa993b
JM
2495 /* Note that real floating point values only start at
2496 FP4_REGNUM. FP0 and up are just status and error
2497 registers, which have integral (bit) values. */
c906108c
SS
2498 pa_strcat_fp_reg (regnum, stream, precision);
2499}
2500
2501/* If this is a PA2.0 machine, fetch the real 64-bit register
2502 value. Otherwise use the info from gdb's saved register area.
2503
2504 Note that reg_val is really expected to be an array of longs,
2505 with two elements. */
2506static void
c5aa993b 2507pa_register_look_aside (raw_regs, regnum, raw_val)
c906108c 2508 char *raw_regs;
c5aa993b 2509 int regnum;
c906108c
SS
2510 long *raw_val;
2511{
c5aa993b 2512 static int know_which = 0; /* False */
c906108c 2513
c5aa993b 2514 int regaddr;
c906108c
SS
2515 unsigned int offset;
2516 register int i;
c5aa993b
JM
2517 int start;
2518
2519
c906108c
SS
2520 char buf[MAX_REGISTER_RAW_SIZE];
2521 long long reg_val;
2522
c5aa993b
JM
2523 if (!know_which)
2524 {
2525 if (CPU_PA_RISC2_0 == sysconf (_SC_CPU_VERSION))
2526 {
2527 is_pa_2 = (1 == 1);
2528 }
2529
2530 know_which = 1; /* True */
2531 }
c906108c
SS
2532
2533 raw_val[0] = 0;
2534 raw_val[1] = 0;
2535
c5aa993b
JM
2536 if (!is_pa_2)
2537 {
2538 raw_val[1] = *(long *) (raw_regs + REGISTER_BYTE (regnum));
c906108c 2539 return;
c5aa993b 2540 }
c906108c
SS
2541
2542 /* Code below copied from hppah-nat.c, with fixes for wide
2543 registers, using different area of save_state, etc. */
2544 if (regnum == FLAGS_REGNUM || regnum >= FP0_REGNUM ||
c5aa993b
JM
2545 !HAVE_STRUCT_SAVE_STATE_T || !HAVE_STRUCT_MEMBER_SS_WIDE)
2546 {
c906108c 2547 /* Use narrow regs area of save_state and default macro. */
c5aa993b
JM
2548 offset = U_REGS_OFFSET;
2549 regaddr = register_addr (regnum, offset);
2550 start = 1;
2551 }
2552 else
2553 {
c906108c
SS
2554 /* Use wide regs area, and calculate registers as 8 bytes wide.
2555
2556 We'd like to do this, but current version of "C" doesn't
2557 permit "offsetof":
2558
c5aa993b 2559 offset = offsetof(save_state_t, ss_wide);
c906108c
SS
2560
2561 Note that to avoid "C" doing typed pointer arithmetic, we
2562 have to cast away the type in our offset calculation:
2563 otherwise we get an offset of 1! */
2564
7a292a7a 2565 /* NB: save_state_t is not available before HPUX 9.
c5aa993b 2566 The ss_wide field is not available previous to HPUX 10.20,
7a292a7a
SS
2567 so to avoid compile-time warnings, we only compile this for
2568 PA 2.0 processors. This control path should only be followed
2569 if we're debugging a PA 2.0 processor, so this should not cause
2570 problems. */
2571
c906108c
SS
2572 /* #if the following code out so that this file can still be
2573 compiled on older HPUX boxes (< 10.20) which don't have
2574 this structure/structure member. */
2575#if HAVE_STRUCT_SAVE_STATE_T == 1 && HAVE_STRUCT_MEMBER_SS_WIDE == 1
2576 save_state_t temp;
2577
2578 offset = ((int) &temp.ss_wide) - ((int) &temp);
2579 regaddr = offset + regnum * 8;
c5aa993b 2580 start = 0;
c906108c 2581#endif
c5aa993b
JM
2582 }
2583
2584 for (i = start; i < 2; i++)
c906108c
SS
2585 {
2586 errno = 0;
2587 raw_val[i] = call_ptrace (PT_RUREGS, inferior_pid,
c5aa993b 2588 (PTRACE_ARG3_TYPE) regaddr, 0);
c906108c
SS
2589 if (errno != 0)
2590 {
2591 /* Warning, not error, in case we are attached; sometimes the
2592 kernel doesn't let us at the registers. */
2593 char *err = safe_strerror (errno);
2594 char *msg = alloca (strlen (err) + 128);
2595 sprintf (msg, "reading register %s: %s", REGISTER_NAME (regnum), err);
2596 warning (msg);
2597 goto error_exit;
2598 }
2599
2600 regaddr += sizeof (long);
2601 }
c5aa993b 2602
c906108c 2603 if (regnum == PCOQ_HEAD_REGNUM || regnum == PCOQ_TAIL_REGNUM)
c5aa993b 2604 raw_val[1] &= ~0x3; /* I think we're masking out space bits */
c906108c
SS
2605
2606error_exit:
2607 ;
2608}
2609
2610/* "Info all-reg" command */
c5aa993b 2611
c906108c
SS
2612static void
2613pa_print_registers (raw_regs, regnum, fpregs)
2614 char *raw_regs;
2615 int regnum;
2616 int fpregs;
2617{
c5aa993b 2618 int i, j;
adf40b2e
JM
2619 /* Alas, we are compiled so that "long long" is 32 bits */
2620 long raw_val[2];
c906108c 2621 long long_val;
a0b3c4fd 2622 int rows = 48, columns = 2;
c906108c 2623
adf40b2e 2624 for (i = 0; i < rows; i++)
c906108c 2625 {
adf40b2e 2626 for (j = 0; j < columns; j++)
c906108c 2627 {
adf40b2e
JM
2628 /* We display registers in column-major order. */
2629 int regnum = i + j * rows;
2630
c5aa993b
JM
2631 /* Q: Why is the value passed through "extract_signed_integer",
2632 while above, in "pa_do_registers_info" it isn't?
2633 A: ? */
adf40b2e 2634 pa_register_look_aside (raw_regs, regnum, &raw_val[0]);
c5aa993b
JM
2635
2636 /* Even fancier % formats to prevent leading zeros
2637 and still maintain the output in columns. */
2638 if (!is_pa_2)
2639 {
2640 /* Being big-endian, on this machine the low bits
2641 (the ones we want to look at) are in the second longword. */
2642 long_val = extract_signed_integer (&raw_val[1], 4);
a0b3c4fd 2643 printf_filtered ("%10.10s: %8x ",
adf40b2e 2644 REGISTER_NAME (regnum), long_val);
c5aa993b
JM
2645 }
2646 else
2647 {
2648 /* raw_val = extract_signed_integer(&raw_val, 8); */
2649 if (raw_val[0] == 0)
a0b3c4fd 2650 printf_filtered ("%10.10s: %8x ",
adf40b2e 2651 REGISTER_NAME (regnum), raw_val[1]);
c5aa993b 2652 else
a0b3c4fd
JM
2653 printf_filtered ("%10.10s: %8x%8.8x ",
2654 REGISTER_NAME (regnum),
c5aa993b
JM
2655 raw_val[0], raw_val[1]);
2656 }
c906108c
SS
2657 }
2658 printf_unfiltered ("\n");
2659 }
c5aa993b 2660
c906108c 2661 if (fpregs)
c5aa993b 2662 for (i = FP4_REGNUM; i < NUM_REGS; i++) /* FP4_REGNUM == 72 */
c906108c
SS
2663 pa_print_fp_reg (i);
2664}
2665
c5aa993b 2666/************* new function ******************/
c906108c
SS
2667static void
2668pa_strcat_registers (raw_regs, regnum, fpregs, stream)
2669 char *raw_regs;
2670 int regnum;
2671 int fpregs;
2672 GDB_FILE *stream;
2673{
c5aa993b
JM
2674 int i, j;
2675 long raw_val[2]; /* Alas, we are compiled so that "long long" is 32 bits */
c906108c
SS
2676 long long_val;
2677 enum precision_type precision;
2678
2679 precision = unspecified_precision;
2680
2681 for (i = 0; i < 18; i++)
2682 {
2683 for (j = 0; j < 4; j++)
2684 {
c5aa993b
JM
2685 /* Q: Why is the value passed through "extract_signed_integer",
2686 while above, in "pa_do_registers_info" it isn't?
2687 A: ? */
2688 pa_register_look_aside (raw_regs, i + (j * 18), &raw_val[0]);
2689
2690 /* Even fancier % formats to prevent leading zeros
2691 and still maintain the output in columns. */
2692 if (!is_pa_2)
2693 {
2694 /* Being big-endian, on this machine the low bits
2695 (the ones we want to look at) are in the second longword. */
2696 long_val = extract_signed_integer (&raw_val[1], 4);
2697 fprintf_filtered (stream, "%8.8s: %8x ", REGISTER_NAME (i + (j * 18)), long_val);
2698 }
2699 else
2700 {
2701 /* raw_val = extract_signed_integer(&raw_val, 8); */
2702 if (raw_val[0] == 0)
2703 fprintf_filtered (stream, "%8.8s: %8x ", REGISTER_NAME (i + (j * 18)),
2704 raw_val[1]);
2705 else
2706 fprintf_filtered (stream, "%8.8s: %8x%8.8x ", REGISTER_NAME (i + (j * 18)),
2707 raw_val[0], raw_val[1]);
2708 }
c906108c
SS
2709 }
2710 fprintf_unfiltered (stream, "\n");
2711 }
c5aa993b 2712
c906108c 2713 if (fpregs)
c5aa993b 2714 for (i = FP4_REGNUM; i < NUM_REGS; i++) /* FP4_REGNUM == 72 */
c906108c
SS
2715 pa_strcat_fp_reg (i, stream, precision);
2716}
2717
2718static void
2719pa_print_fp_reg (i)
2720 int i;
2721{
2722 char raw_buffer[MAX_REGISTER_RAW_SIZE];
2723 char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
2724
2725 /* Get 32bits of data. */
2726 read_relative_register_raw_bytes (i, raw_buffer);
2727
2728 /* Put it in the buffer. No conversions are ever necessary. */
2729 memcpy (virtual_buffer, raw_buffer, REGISTER_RAW_SIZE (i));
2730
2731 fputs_filtered (REGISTER_NAME (i), gdb_stdout);
2732 print_spaces_filtered (8 - strlen (REGISTER_NAME (i)), gdb_stdout);
2733 fputs_filtered ("(single precision) ", gdb_stdout);
2734
2735 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, gdb_stdout, 0,
2736 1, 0, Val_pretty_default);
2737 printf_filtered ("\n");
2738
2739 /* If "i" is even, then this register can also be a double-precision
2740 FP register. Dump it out as such. */
2741 if ((i % 2) == 0)
2742 {
2743 /* Get the data in raw format for the 2nd half. */
2744 read_relative_register_raw_bytes (i + 1, raw_buffer);
2745
2746 /* Copy it into the appropriate part of the virtual buffer. */
2747 memcpy (virtual_buffer + REGISTER_RAW_SIZE (i), raw_buffer,
2748 REGISTER_RAW_SIZE (i));
2749
2750 /* Dump it as a double. */
2751 fputs_filtered (REGISTER_NAME (i), gdb_stdout);
2752 print_spaces_filtered (8 - strlen (REGISTER_NAME (i)), gdb_stdout);
2753 fputs_filtered ("(double precision) ", gdb_stdout);
2754
2755 val_print (builtin_type_double, virtual_buffer, 0, 0, gdb_stdout, 0,
2756 1, 0, Val_pretty_default);
2757 printf_filtered ("\n");
2758 }
2759}
2760
2761/*************** new function ***********************/
2762static void
2763pa_strcat_fp_reg (i, stream, precision)
2764 int i;
2765 GDB_FILE *stream;
2766 enum precision_type precision;
2767{
2768 char raw_buffer[MAX_REGISTER_RAW_SIZE];
2769 char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
2770
2771 fputs_filtered (REGISTER_NAME (i), stream);
2772 print_spaces_filtered (8 - strlen (REGISTER_NAME (i)), stream);
2773
2774 /* Get 32bits of data. */
2775 read_relative_register_raw_bytes (i, raw_buffer);
2776
2777 /* Put it in the buffer. No conversions are ever necessary. */
2778 memcpy (virtual_buffer, raw_buffer, REGISTER_RAW_SIZE (i));
2779
2780 if (precision == double_precision && (i % 2) == 0)
2781 {
2782
c5aa993b
JM
2783 char raw_buf[MAX_REGISTER_RAW_SIZE];
2784
2785 /* Get the data in raw format for the 2nd half. */
2786 read_relative_register_raw_bytes (i + 1, raw_buf);
2787
2788 /* Copy it into the appropriate part of the virtual buffer. */
2789 memcpy (virtual_buffer + REGISTER_RAW_SIZE (i), raw_buf, REGISTER_RAW_SIZE (i));
c906108c 2790
c5aa993b
JM
2791 val_print (builtin_type_double, virtual_buffer, 0, 0, stream, 0,
2792 1, 0, Val_pretty_default);
c906108c
SS
2793
2794 }
c5aa993b
JM
2795 else
2796 {
2797 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, stream, 0,
2798 1, 0, Val_pretty_default);
2799 }
c906108c
SS
2800
2801}
2802
2803/* Return one if PC is in the call path of a trampoline, else return zero.
2804
2805 Note we return one for *any* call trampoline (long-call, arg-reloc), not
2806 just shared library trampolines (import, export). */
2807
2808int
2809in_solib_call_trampoline (pc, name)
2810 CORE_ADDR pc;
2811 char *name;
2812{
2813 struct minimal_symbol *minsym;
2814 struct unwind_table_entry *u;
2815 static CORE_ADDR dyncall = 0;
2816 static CORE_ADDR sr4export = 0;
2817
2818/* FIXME XXX - dyncall and sr4export must be initialized whenever we get a
2819 new exec file */
2820
2821 /* First see if PC is in one of the two C-library trampolines. */
2822 if (!dyncall)
2823 {
2824 minsym = lookup_minimal_symbol ("$$dyncall", NULL, NULL);
2825 if (minsym)
2826 dyncall = SYMBOL_VALUE_ADDRESS (minsym);
2827 else
2828 dyncall = -1;
2829 }
2830
2831 if (!sr4export)
2832 {
2833 minsym = lookup_minimal_symbol ("_sr4export", NULL, NULL);
2834 if (minsym)
2835 sr4export = SYMBOL_VALUE_ADDRESS (minsym);
2836 else
2837 sr4export = -1;
2838 }
2839
2840 if (pc == dyncall || pc == sr4export)
2841 return 1;
2842
104c1213
JM
2843 minsym = lookup_minimal_symbol_by_pc (pc);
2844 if (minsym && strcmp (SYMBOL_NAME (minsym), ".stub") == 0)
2845 return 1;
2846
c906108c
SS
2847 /* Get the unwind descriptor corresponding to PC, return zero
2848 if no unwind was found. */
2849 u = find_unwind_entry (pc);
2850 if (!u)
2851 return 0;
2852
2853 /* If this isn't a linker stub, then return now. */
2854 if (u->stub_unwind.stub_type == 0)
2855 return 0;
2856
2857 /* By definition a long-branch stub is a call stub. */
2858 if (u->stub_unwind.stub_type == LONG_BRANCH)
2859 return 1;
2860
2861 /* The call and return path execute the same instructions within
2862 an IMPORT stub! So an IMPORT stub is both a call and return
2863 trampoline. */
2864 if (u->stub_unwind.stub_type == IMPORT)
2865 return 1;
2866
2867 /* Parameter relocation stubs always have a call path and may have a
2868 return path. */
2869 if (u->stub_unwind.stub_type == PARAMETER_RELOCATION
2870 || u->stub_unwind.stub_type == EXPORT)
2871 {
2872 CORE_ADDR addr;
2873
2874 /* Search forward from the current PC until we hit a branch
c5aa993b 2875 or the end of the stub. */
c906108c
SS
2876 for (addr = pc; addr <= u->region_end; addr += 4)
2877 {
2878 unsigned long insn;
2879
2880 insn = read_memory_integer (addr, 4);
2881
2882 /* Does it look like a bl? If so then it's the call path, if
2883 we find a bv or be first, then we're on the return path. */
2884 if ((insn & 0xfc00e000) == 0xe8000000)
2885 return 1;
2886 else if ((insn & 0xfc00e001) == 0xe800c000
2887 || (insn & 0xfc000000) == 0xe0000000)
2888 return 0;
2889 }
2890
2891 /* Should never happen. */
104c1213
JM
2892 warning ("Unable to find branch in parameter relocation stub.\n");
2893 return 0;
c906108c
SS
2894 }
2895
2896 /* Unknown stub type. For now, just return zero. */
104c1213 2897 return 0;
c906108c
SS
2898}
2899
2900/* Return one if PC is in the return path of a trampoline, else return zero.
2901
2902 Note we return one for *any* call trampoline (long-call, arg-reloc), not
2903 just shared library trampolines (import, export). */
2904
2905int
2906in_solib_return_trampoline (pc, name)
2907 CORE_ADDR pc;
2908 char *name;
2909{
2910 struct unwind_table_entry *u;
2911
2912 /* Get the unwind descriptor corresponding to PC, return zero
2913 if no unwind was found. */
2914 u = find_unwind_entry (pc);
2915 if (!u)
2916 return 0;
2917
2918 /* If this isn't a linker stub or it's just a long branch stub, then
2919 return zero. */
2920 if (u->stub_unwind.stub_type == 0 || u->stub_unwind.stub_type == LONG_BRANCH)
2921 return 0;
2922
2923 /* The call and return path execute the same instructions within
2924 an IMPORT stub! So an IMPORT stub is both a call and return
2925 trampoline. */
2926 if (u->stub_unwind.stub_type == IMPORT)
2927 return 1;
2928
2929 /* Parameter relocation stubs always have a call path and may have a
2930 return path. */
2931 if (u->stub_unwind.stub_type == PARAMETER_RELOCATION
2932 || u->stub_unwind.stub_type == EXPORT)
2933 {
2934 CORE_ADDR addr;
2935
2936 /* Search forward from the current PC until we hit a branch
c5aa993b 2937 or the end of the stub. */
c906108c
SS
2938 for (addr = pc; addr <= u->region_end; addr += 4)
2939 {
2940 unsigned long insn;
2941
2942 insn = read_memory_integer (addr, 4);
2943
2944 /* Does it look like a bl? If so then it's the call path, if
2945 we find a bv or be first, then we're on the return path. */
2946 if ((insn & 0xfc00e000) == 0xe8000000)
2947 return 0;
2948 else if ((insn & 0xfc00e001) == 0xe800c000
2949 || (insn & 0xfc000000) == 0xe0000000)
2950 return 1;
2951 }
2952
2953 /* Should never happen. */
104c1213
JM
2954 warning ("Unable to find branch in parameter relocation stub.\n");
2955 return 0;
c906108c
SS
2956 }
2957
2958 /* Unknown stub type. For now, just return zero. */
104c1213 2959 return 0;
c906108c
SS
2960
2961}
2962
2963/* Figure out if PC is in a trampoline, and if so find out where
2964 the trampoline will jump to. If not in a trampoline, return zero.
2965
2966 Simple code examination probably is not a good idea since the code
2967 sequences in trampolines can also appear in user code.
2968
2969 We use unwinds and information from the minimal symbol table to
2970 determine when we're in a trampoline. This won't work for ELF
2971 (yet) since it doesn't create stub unwind entries. Whether or
2972 not ELF will create stub unwinds or normal unwinds for linker
2973 stubs is still being debated.
2974
2975 This should handle simple calls through dyncall or sr4export,
2976 long calls, argument relocation stubs, and dyncall/sr4export
2977 calling an argument relocation stub. It even handles some stubs
2978 used in dynamic executables. */
2979
c906108c
SS
2980CORE_ADDR
2981skip_trampoline_code (pc, name)
2982 CORE_ADDR pc;
2983 char *name;
2984{
2985 long orig_pc = pc;
2986 long prev_inst, curr_inst, loc;
2987 static CORE_ADDR dyncall = 0;
2988 static CORE_ADDR dyncall_external = 0;
2989 static CORE_ADDR sr4export = 0;
2990 struct minimal_symbol *msym;
2991 struct unwind_table_entry *u;
2992
2993
2994/* FIXME XXX - dyncall and sr4export must be initialized whenever we get a
2995 new exec file */
2996
2997 if (!dyncall)
2998 {
2999 msym = lookup_minimal_symbol ("$$dyncall", NULL, NULL);
3000 if (msym)
3001 dyncall = SYMBOL_VALUE_ADDRESS (msym);
3002 else
3003 dyncall = -1;
3004 }
3005
3006 if (!dyncall_external)
3007 {
3008 msym = lookup_minimal_symbol ("$$dyncall_external", NULL, NULL);
3009 if (msym)
3010 dyncall_external = SYMBOL_VALUE_ADDRESS (msym);
3011 else
3012 dyncall_external = -1;
3013 }
3014
3015 if (!sr4export)
3016 {
3017 msym = lookup_minimal_symbol ("_sr4export", NULL, NULL);
3018 if (msym)
3019 sr4export = SYMBOL_VALUE_ADDRESS (msym);
3020 else
3021 sr4export = -1;
3022 }
3023
3024 /* Addresses passed to dyncall may *NOT* be the actual address
3025 of the function. So we may have to do something special. */
3026 if (pc == dyncall)
3027 {
3028 pc = (CORE_ADDR) read_register (22);
3029
3030 /* If bit 30 (counting from the left) is on, then pc is the address of
c5aa993b
JM
3031 the PLT entry for this function, not the address of the function
3032 itself. Bit 31 has meaning too, but only for MPE. */
c906108c 3033 if (pc & 0x2)
53a5351d 3034 pc = (CORE_ADDR) read_memory_integer (pc & ~0x3, TARGET_PTR_BIT / 8);
c906108c
SS
3035 }
3036 if (pc == dyncall_external)
3037 {
3038 pc = (CORE_ADDR) read_register (22);
53a5351d 3039 pc = (CORE_ADDR) read_memory_integer (pc & ~0x3, TARGET_PTR_BIT / 8);
c906108c
SS
3040 }
3041 else if (pc == sr4export)
3042 pc = (CORE_ADDR) (read_register (22));
3043
3044 /* Get the unwind descriptor corresponding to PC, return zero
3045 if no unwind was found. */
3046 u = find_unwind_entry (pc);
3047 if (!u)
3048 return 0;
3049
3050 /* If this isn't a linker stub, then return now. */
3051 /* elz: attention here! (FIXME) because of a compiler/linker
3052 error, some stubs which should have a non zero stub_unwind.stub_type
3053 have unfortunately a value of zero. So this function would return here
3054 as if we were not in a trampoline. To fix this, we go look at the partial
3055 symbol information, which reports this guy as a stub.
3056 (FIXME): Unfortunately, we are not that lucky: it turns out that the
3057 partial symbol information is also wrong sometimes. This is because
3058 when it is entered (somread.c::som_symtab_read()) it can happen that
3059 if the type of the symbol (from the som) is Entry, and the symbol is
3060 in a shared library, then it can also be a trampoline. This would
3061 be OK, except that I believe the way they decide if we are ina shared library
3062 does not work. SOOOO..., even if we have a regular function w/o trampolines
3063 its minimal symbol can be assigned type mst_solib_trampoline.
3064 Also, if we find that the symbol is a real stub, then we fix the unwind
3065 descriptor, and define the stub type to be EXPORT.
c5aa993b 3066 Hopefully this is correct most of the times. */
c906108c 3067 if (u->stub_unwind.stub_type == 0)
c5aa993b 3068 {
c906108c
SS
3069
3070/* elz: NOTE (FIXME!) once the problem with the unwind information is fixed
3071 we can delete all the code which appears between the lines */
3072/*--------------------------------------------------------------------------*/
c5aa993b 3073 msym = lookup_minimal_symbol_by_pc (pc);
c906108c 3074
c5aa993b
JM
3075 if (msym == NULL || MSYMBOL_TYPE (msym) != mst_solib_trampoline)
3076 return orig_pc == pc ? 0 : pc & ~0x3;
3077
3078 else if (msym != NULL && MSYMBOL_TYPE (msym) == mst_solib_trampoline)
3079 {
3080 struct objfile *objfile;
3081 struct minimal_symbol *msymbol;
3082 int function_found = 0;
3083
3084 /* go look if there is another minimal symbol with the same name as
3085 this one, but with type mst_text. This would happen if the msym
3086 is an actual trampoline, in which case there would be another
3087 symbol with the same name corresponding to the real function */
3088
3089 ALL_MSYMBOLS (objfile, msymbol)
3090 {
3091 if (MSYMBOL_TYPE (msymbol) == mst_text
3092 && STREQ (SYMBOL_NAME (msymbol), SYMBOL_NAME (msym)))
3093 {
3094 function_found = 1;
3095 break;
3096 }
3097 }
3098
3099 if (function_found)
3100 /* the type of msym is correct (mst_solib_trampoline), but
3101 the unwind info is wrong, so set it to the correct value */
3102 u->stub_unwind.stub_type = EXPORT;
3103 else
3104 /* the stub type info in the unwind is correct (this is not a
3105 trampoline), but the msym type information is wrong, it
3106 should be mst_text. So we need to fix the msym, and also
3107 get out of this function */
3108 {
3109 MSYMBOL_TYPE (msym) = mst_text;
3110 return orig_pc == pc ? 0 : pc & ~0x3;
3111 }
3112 }
c906108c 3113
c906108c 3114/*--------------------------------------------------------------------------*/
c5aa993b 3115 }
c906108c
SS
3116
3117 /* It's a stub. Search for a branch and figure out where it goes.
3118 Note we have to handle multi insn branch sequences like ldil;ble.
3119 Most (all?) other branches can be determined by examining the contents
3120 of certain registers and the stack. */
3121
3122 loc = pc;
3123 curr_inst = 0;
3124 prev_inst = 0;
3125 while (1)
3126 {
3127 /* Make sure we haven't walked outside the range of this stub. */
3128 if (u != find_unwind_entry (loc))
3129 {
3130 warning ("Unable to find branch in linker stub");
3131 return orig_pc == pc ? 0 : pc & ~0x3;
3132 }
3133
3134 prev_inst = curr_inst;
3135 curr_inst = read_memory_integer (loc, 4);
3136
3137 /* Does it look like a branch external using %r1? Then it's the
c5aa993b 3138 branch from the stub to the actual function. */
c906108c
SS
3139 if ((curr_inst & 0xffe0e000) == 0xe0202000)
3140 {
3141 /* Yup. See if the previous instruction loaded
3142 a value into %r1. If so compute and return the jump address. */
3143 if ((prev_inst & 0xffe00000) == 0x20200000)
3144 return (extract_21 (prev_inst) + extract_17 (curr_inst)) & ~0x3;
3145 else
3146 {
3147 warning ("Unable to find ldil X,%%r1 before ble Y(%%sr4,%%r1).");
3148 return orig_pc == pc ? 0 : pc & ~0x3;
3149 }
3150 }
3151
3152 /* Does it look like a be 0(sr0,%r21)? OR
3153 Does it look like a be, n 0(sr0,%r21)? OR
3154 Does it look like a bve (r21)? (this is on PA2.0)
3155 Does it look like a bve, n(r21)? (this is also on PA2.0)
3156 That's the branch from an
c5aa993b 3157 import stub to an export stub.
c906108c 3158
c5aa993b
JM
3159 It is impossible to determine the target of the branch via
3160 simple examination of instructions and/or data (consider
3161 that the address in the plabel may be the address of the
3162 bind-on-reference routine in the dynamic loader).
c906108c 3163
c5aa993b 3164 So we have try an alternative approach.
c906108c 3165
c5aa993b
JM
3166 Get the name of the symbol at our current location; it should
3167 be a stub symbol with the same name as the symbol in the
3168 shared library.
c906108c 3169
c5aa993b
JM
3170 Then lookup a minimal symbol with the same name; we should
3171 get the minimal symbol for the target routine in the shared
3172 library as those take precedence of import/export stubs. */
c906108c 3173 if ((curr_inst == 0xe2a00000) ||
c5aa993b
JM
3174 (curr_inst == 0xe2a00002) ||
3175 (curr_inst == 0xeaa0d000) ||
3176 (curr_inst == 0xeaa0d002))
c906108c
SS
3177 {
3178 struct minimal_symbol *stubsym, *libsym;
3179
3180 stubsym = lookup_minimal_symbol_by_pc (loc);
3181 if (stubsym == NULL)
3182 {
3183 warning ("Unable to find symbol for 0x%x", loc);
3184 return orig_pc == pc ? 0 : pc & ~0x3;
3185 }
3186
3187 libsym = lookup_minimal_symbol (SYMBOL_NAME (stubsym), NULL, NULL);
3188 if (libsym == NULL)
3189 {
3190 warning ("Unable to find library symbol for %s\n",
3191 SYMBOL_NAME (stubsym));
3192 return orig_pc == pc ? 0 : pc & ~0x3;
3193 }
3194
3195 return SYMBOL_VALUE (libsym);
3196 }
3197
3198 /* Does it look like bl X,%rp or bl X,%r0? Another way to do a
c5aa993b
JM
3199 branch from the stub to the actual function. */
3200 /*elz */
c906108c
SS
3201 else if ((curr_inst & 0xffe0e000) == 0xe8400000
3202 || (curr_inst & 0xffe0e000) == 0xe8000000
c5aa993b 3203 || (curr_inst & 0xffe0e000) == 0xe800A000)
c906108c
SS
3204 return (loc + extract_17 (curr_inst) + 8) & ~0x3;
3205
3206 /* Does it look like bv (rp)? Note this depends on the
c5aa993b
JM
3207 current stack pointer being the same as the stack
3208 pointer in the stub itself! This is a branch on from the
3209 stub back to the original caller. */
3210 /*else if ((curr_inst & 0xffe0e000) == 0xe840c000) */
c906108c
SS
3211 else if ((curr_inst & 0xffe0f000) == 0xe840c000)
3212 {
3213 /* Yup. See if the previous instruction loaded
3214 rp from sp - 8. */
3215 if (prev_inst == 0x4bc23ff1)
3216 return (read_memory_integer
3217 (read_register (SP_REGNUM) - 8, 4)) & ~0x3;
3218 else
3219 {
3220 warning ("Unable to find restore of %%rp before bv (%%rp).");
3221 return orig_pc == pc ? 0 : pc & ~0x3;
3222 }
3223 }
3224
3225 /* elz: added this case to capture the new instruction
3226 at the end of the return part of an export stub used by
3227 the PA2.0: BVE, n (rp) */
3228 else if ((curr_inst & 0xffe0f000) == 0xe840d000)
3229 {
c5aa993b 3230 return (read_memory_integer
53a5351d 3231 (read_register (SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3;
c906108c
SS
3232 }
3233
3234 /* What about be,n 0(sr0,%rp)? It's just another way we return to
c5aa993b 3235 the original caller from the stub. Used in dynamic executables. */
c906108c
SS
3236 else if (curr_inst == 0xe0400002)
3237 {
3238 /* The value we jump to is sitting in sp - 24. But that's
3239 loaded several instructions before the be instruction.
3240 I guess we could check for the previous instruction being
3241 mtsp %r1,%sr0 if we want to do sanity checking. */
c5aa993b 3242 return (read_memory_integer
53a5351d 3243 (read_register (SP_REGNUM) - 24, TARGET_PTR_BIT / 8)) & ~0x3;
c906108c
SS
3244 }
3245
3246 /* Haven't found the branch yet, but we're still in the stub.
c5aa993b 3247 Keep looking. */
c906108c
SS
3248 loc += 4;
3249 }
3250}
3251
3252
3253/* For the given instruction (INST), return any adjustment it makes
3254 to the stack pointer or zero for no adjustment.
3255
3256 This only handles instructions commonly found in prologues. */
3257
3258static int
3259prologue_inst_adjust_sp (inst)
3260 unsigned long inst;
3261{
3262 /* This must persist across calls. */
3263 static int save_high21;
3264
3265 /* The most common way to perform a stack adjustment ldo X(sp),sp */
3266 if ((inst & 0xffffc000) == 0x37de0000)
3267 return extract_14 (inst);
3268
3269 /* stwm X,D(sp) */
3270 if ((inst & 0xffe00000) == 0x6fc00000)
3271 return extract_14 (inst);
3272
104c1213
JM
3273 /* std,ma X,D(sp) */
3274 if ((inst & 0xffe00008) == 0x73c00008)
3275 return (inst & 0x1 ? -1 << 16 : 0) | (((inst >> 4) & 0x3ff) << 3);
3276
c906108c
SS
3277 /* addil high21,%r1; ldo low11,(%r1),%r30)
3278 save high bits in save_high21 for later use. */
3279 if ((inst & 0xffe00000) == 0x28200000)
3280 {
3281 save_high21 = extract_21 (inst);
3282 return 0;
3283 }
3284
3285 if ((inst & 0xffff0000) == 0x343e0000)
3286 return save_high21 + extract_14 (inst);
3287
3288 /* fstws as used by the HP compilers. */
3289 if ((inst & 0xffffffe0) == 0x2fd01220)
3290 return extract_5_load (inst);
3291
3292 /* No adjustment. */
3293 return 0;
3294}
3295
3296/* Return nonzero if INST is a branch of some kind, else return zero. */
3297
3298static int
3299is_branch (inst)
3300 unsigned long inst;
3301{
3302 switch (inst >> 26)
3303 {
3304 case 0x20:
3305 case 0x21:
3306 case 0x22:
3307 case 0x23:
7be570e7 3308 case 0x27:
c906108c
SS
3309 case 0x28:
3310 case 0x29:
3311 case 0x2a:
3312 case 0x2b:
7be570e7 3313 case 0x2f:
c906108c
SS
3314 case 0x30:
3315 case 0x31:
3316 case 0x32:
3317 case 0x33:
3318 case 0x38:
3319 case 0x39:
3320 case 0x3a:
7be570e7 3321 case 0x3b:
c906108c
SS
3322 return 1;
3323
3324 default:
3325 return 0;
3326 }
3327}
3328
3329/* Return the register number for a GR which is saved by INST or
3330 zero it INST does not save a GR. */
3331
3332static int
3333inst_saves_gr (inst)
3334 unsigned long inst;
3335{
3336 /* Does it look like a stw? */
7be570e7
JM
3337 if ((inst >> 26) == 0x1a || (inst >> 26) == 0x1b
3338 || (inst >> 26) == 0x1f
3339 || ((inst >> 26) == 0x1f
3340 && ((inst >> 6) == 0xa)))
3341 return extract_5R_store (inst);
3342
3343 /* Does it look like a std? */
3344 if ((inst >> 26) == 0x1c
3345 || ((inst >> 26) == 0x03
3346 && ((inst >> 6) & 0xf) == 0xb))
c906108c
SS
3347 return extract_5R_store (inst);
3348
3349 /* Does it look like a stwm? GCC & HPC may use this in prologues. */
3350 if ((inst >> 26) == 0x1b)
3351 return extract_5R_store (inst);
3352
3353 /* Does it look like sth or stb? HPC versions 9.0 and later use these
3354 too. */
7be570e7
JM
3355 if ((inst >> 26) == 0x19 || (inst >> 26) == 0x18
3356 || ((inst >> 26) == 0x3
3357 && (((inst >> 6) & 0xf) == 0x8
3358 || (inst >> 6) & 0xf) == 0x9))
c906108c 3359 return extract_5R_store (inst);
c5aa993b 3360
c906108c
SS
3361 return 0;
3362}
3363
3364/* Return the register number for a FR which is saved by INST or
3365 zero it INST does not save a FR.
3366
3367 Note we only care about full 64bit register stores (that's the only
3368 kind of stores the prologue will use).
3369
3370 FIXME: What about argument stores with the HP compiler in ANSI mode? */
3371
3372static int
3373inst_saves_fr (inst)
3374 unsigned long inst;
3375{
7be570e7 3376 /* is this an FSTD ? */
c906108c
SS
3377 if ((inst & 0xfc00dfc0) == 0x2c001200)
3378 return extract_5r_store (inst);
7be570e7
JM
3379 if ((inst & 0xfc000002) == 0x70000002)
3380 return extract_5R_store (inst);
3381 /* is this an FSTW ? */
c906108c
SS
3382 if ((inst & 0xfc00df80) == 0x24001200)
3383 return extract_5r_store (inst);
7be570e7
JM
3384 if ((inst & 0xfc000002) == 0x7c000000)
3385 return extract_5R_store (inst);
c906108c
SS
3386 return 0;
3387}
3388
3389/* Advance PC across any function entry prologue instructions
3390 to reach some "real" code.
3391
3392 Use information in the unwind table to determine what exactly should
3393 be in the prologue. */
3394
3395
3396CORE_ADDR
3397skip_prologue_hard_way (pc)
3398 CORE_ADDR pc;
3399{
3400 char buf[4];
3401 CORE_ADDR orig_pc = pc;
3402 unsigned long inst, stack_remaining, save_gr, save_fr, save_rp, save_sp;
3403 unsigned long args_stored, status, i, restart_gr, restart_fr;
3404 struct unwind_table_entry *u;
3405
3406 restart_gr = 0;
3407 restart_fr = 0;
3408
3409restart:
3410 u = find_unwind_entry (pc);
3411 if (!u)
3412 return pc;
3413
c5aa993b 3414 /* If we are not at the beginning of a function, then return now. */
c906108c
SS
3415 if ((pc & ~0x3) != u->region_start)
3416 return pc;
3417
3418 /* This is how much of a frame adjustment we need to account for. */
3419 stack_remaining = u->Total_frame_size << 3;
3420
3421 /* Magic register saves we want to know about. */
3422 save_rp = u->Save_RP;
3423 save_sp = u->Save_SP;
3424
3425 /* An indication that args may be stored into the stack. Unfortunately
3426 the HPUX compilers tend to set this in cases where no args were
3427 stored too!. */
3428 args_stored = 1;
3429
3430 /* Turn the Entry_GR field into a bitmask. */
3431 save_gr = 0;
3432 for (i = 3; i < u->Entry_GR + 3; i++)
3433 {
3434 /* Frame pointer gets saved into a special location. */
3435 if (u->Save_SP && i == FP_REGNUM)
3436 continue;
3437
3438 save_gr |= (1 << i);
3439 }
3440 save_gr &= ~restart_gr;
3441
3442 /* Turn the Entry_FR field into a bitmask too. */
3443 save_fr = 0;
3444 for (i = 12; i < u->Entry_FR + 12; i++)
3445 save_fr |= (1 << i);
3446 save_fr &= ~restart_fr;
3447
3448 /* Loop until we find everything of interest or hit a branch.
3449
3450 For unoptimized GCC code and for any HP CC code this will never ever
3451 examine any user instructions.
3452
3453 For optimzied GCC code we're faced with problems. GCC will schedule
3454 its prologue and make prologue instructions available for delay slot
3455 filling. The end result is user code gets mixed in with the prologue
3456 and a prologue instruction may be in the delay slot of the first branch
3457 or call.
3458
3459 Some unexpected things are expected with debugging optimized code, so
3460 we allow this routine to walk past user instructions in optimized
3461 GCC code. */
3462 while (save_gr || save_fr || save_rp || save_sp || stack_remaining > 0
3463 || args_stored)
3464 {
3465 unsigned int reg_num;
3466 unsigned long old_stack_remaining, old_save_gr, old_save_fr;
3467 unsigned long old_save_rp, old_save_sp, next_inst;
3468
3469 /* Save copies of all the triggers so we can compare them later
c5aa993b 3470 (only for HPC). */
c906108c
SS
3471 old_save_gr = save_gr;
3472 old_save_fr = save_fr;
3473 old_save_rp = save_rp;
3474 old_save_sp = save_sp;
3475 old_stack_remaining = stack_remaining;
3476
3477 status = target_read_memory (pc, buf, 4);
3478 inst = extract_unsigned_integer (buf, 4);
c5aa993b 3479
c906108c
SS
3480 /* Yow! */
3481 if (status != 0)
3482 return pc;
3483
3484 /* Note the interesting effects of this instruction. */
3485 stack_remaining -= prologue_inst_adjust_sp (inst);
3486
7be570e7
JM
3487 /* There are limited ways to store the return pointer into the
3488 stack. */
3489 if (inst == 0x6bc23fd9 || inst == 0x0fc212c1)
c906108c
SS
3490 save_rp = 0;
3491
104c1213 3492 /* These are the only ways we save SP into the stack. At this time
c5aa993b 3493 the HP compilers never bother to save SP into the stack. */
104c1213
JM
3494 if ((inst & 0xffffc000) == 0x6fc10000
3495 || (inst & 0xffffc00c) == 0x73c10008)
c906108c
SS
3496 save_sp = 0;
3497
3498 /* Account for general and floating-point register saves. */
3499 reg_num = inst_saves_gr (inst);
3500 save_gr &= ~(1 << reg_num);
3501
3502 /* Ugh. Also account for argument stores into the stack.
c5aa993b
JM
3503 Unfortunately args_stored only tells us that some arguments
3504 where stored into the stack. Not how many or what kind!
c906108c 3505
c5aa993b
JM
3506 This is a kludge as on the HP compiler sets this bit and it
3507 never does prologue scheduling. So once we see one, skip past
3508 all of them. We have similar code for the fp arg stores below.
c906108c 3509
c5aa993b
JM
3510 FIXME. Can still die if we have a mix of GR and FR argument
3511 stores! */
c906108c
SS
3512 if (reg_num >= 23 && reg_num <= 26)
3513 {
3514 while (reg_num >= 23 && reg_num <= 26)
3515 {
3516 pc += 4;
3517 status = target_read_memory (pc, buf, 4);
3518 inst = extract_unsigned_integer (buf, 4);
3519 if (status != 0)
3520 return pc;
3521 reg_num = inst_saves_gr (inst);
3522 }
3523 args_stored = 0;
3524 continue;
3525 }
3526
3527 reg_num = inst_saves_fr (inst);
3528 save_fr &= ~(1 << reg_num);
3529
3530 status = target_read_memory (pc + 4, buf, 4);
3531 next_inst = extract_unsigned_integer (buf, 4);
c5aa993b 3532
c906108c
SS
3533 /* Yow! */
3534 if (status != 0)
3535 return pc;
3536
3537 /* We've got to be read to handle the ldo before the fp register
c5aa993b 3538 save. */
c906108c
SS
3539 if ((inst & 0xfc000000) == 0x34000000
3540 && inst_saves_fr (next_inst) >= 4
3541 && inst_saves_fr (next_inst) <= 7)
3542 {
3543 /* So we drop into the code below in a reasonable state. */
3544 reg_num = inst_saves_fr (next_inst);
3545 pc -= 4;
3546 }
3547
3548 /* Ugh. Also account for argument stores into the stack.
c5aa993b
JM
3549 This is a kludge as on the HP compiler sets this bit and it
3550 never does prologue scheduling. So once we see one, skip past
3551 all of them. */
c906108c
SS
3552 if (reg_num >= 4 && reg_num <= 7)
3553 {
3554 while (reg_num >= 4 && reg_num <= 7)
3555 {
3556 pc += 8;
3557 status = target_read_memory (pc, buf, 4);
3558 inst = extract_unsigned_integer (buf, 4);
3559 if (status != 0)
3560 return pc;
3561 if ((inst & 0xfc000000) != 0x34000000)
3562 break;
3563 status = target_read_memory (pc + 4, buf, 4);
3564 next_inst = extract_unsigned_integer (buf, 4);
3565 if (status != 0)
3566 return pc;
3567 reg_num = inst_saves_fr (next_inst);
3568 }
3569 args_stored = 0;
3570 continue;
3571 }
3572
3573 /* Quit if we hit any kind of branch. This can happen if a prologue
c5aa993b 3574 instruction is in the delay slot of the first call/branch. */
c906108c
SS
3575 if (is_branch (inst))
3576 break;
3577
3578 /* What a crock. The HP compilers set args_stored even if no
c5aa993b
JM
3579 arguments were stored into the stack (boo hiss). This could
3580 cause this code to then skip a bunch of user insns (up to the
3581 first branch).
3582
3583 To combat this we try to identify when args_stored was bogusly
3584 set and clear it. We only do this when args_stored is nonzero,
3585 all other resources are accounted for, and nothing changed on
3586 this pass. */
c906108c 3587 if (args_stored
c5aa993b 3588 && !(save_gr || save_fr || save_rp || save_sp || stack_remaining > 0)
c906108c
SS
3589 && old_save_gr == save_gr && old_save_fr == save_fr
3590 && old_save_rp == save_rp && old_save_sp == save_sp
3591 && old_stack_remaining == stack_remaining)
3592 break;
c5aa993b 3593
c906108c
SS
3594 /* Bump the PC. */
3595 pc += 4;
3596 }
3597
3598 /* We've got a tenative location for the end of the prologue. However
3599 because of limitations in the unwind descriptor mechanism we may
3600 have went too far into user code looking for the save of a register
3601 that does not exist. So, if there registers we expected to be saved
3602 but never were, mask them out and restart.
3603
3604 This should only happen in optimized code, and should be very rare. */
c5aa993b 3605 if (save_gr || (save_fr && !(restart_fr || restart_gr)))
c906108c
SS
3606 {
3607 pc = orig_pc;
3608 restart_gr = save_gr;
3609 restart_fr = save_fr;
3610 goto restart;
3611 }
3612
3613 return pc;
3614}
3615
3616
7be570e7
JM
3617/* Return the address of the PC after the last prologue instruction if
3618 we can determine it from the debug symbols. Else return zero. */
c906108c
SS
3619
3620static CORE_ADDR
3621after_prologue (pc)
3622 CORE_ADDR pc;
3623{
3624 struct symtab_and_line sal;
3625 CORE_ADDR func_addr, func_end;
3626 struct symbol *f;
3627
7be570e7
JM
3628 /* If we can not find the symbol in the partial symbol table, then
3629 there is no hope we can determine the function's start address
3630 with this code. */
c906108c 3631 if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
7be570e7 3632 return 0;
c906108c 3633
7be570e7 3634 /* Get the line associated with FUNC_ADDR. */
c906108c
SS
3635 sal = find_pc_line (func_addr, 0);
3636
7be570e7
JM
3637 /* There are only two cases to consider. First, the end of the source line
3638 is within the function bounds. In that case we return the end of the
3639 source line. Second is the end of the source line extends beyond the
3640 bounds of the current function. We need to use the slow code to
3641 examine instructions in that case.
c906108c 3642
7be570e7
JM
3643 Anything else is simply a bug elsewhere. Fixing it here is absolutely
3644 the wrong thing to do. In fact, it should be entirely possible for this
3645 function to always return zero since the slow instruction scanning code
3646 is supposed to *always* work. If it does not, then it is a bug. */
3647 if (sal.end < func_end)
3648 return sal.end;
c5aa993b 3649 else
7be570e7 3650 return 0;
c906108c
SS
3651}
3652
3653/* To skip prologues, I use this predicate. Returns either PC itself
3654 if the code at PC does not look like a function prologue; otherwise
3655 returns an address that (if we're lucky) follows the prologue. If
3656 LENIENT, then we must skip everything which is involved in setting
3657 up the frame (it's OK to skip more, just so long as we don't skip
3658 anything which might clobber the registers which are being saved.
3659 Currently we must not skip more on the alpha, but we might the lenient
3660 stuff some day. */
3661
3662CORE_ADDR
b83266a0 3663hppa_skip_prologue (pc)
c906108c
SS
3664 CORE_ADDR pc;
3665{
c5aa993b
JM
3666 unsigned long inst;
3667 int offset;
3668 CORE_ADDR post_prologue_pc;
3669 char buf[4];
c906108c 3670
c5aa993b
JM
3671 /* See if we can determine the end of the prologue via the symbol table.
3672 If so, then return either PC, or the PC after the prologue, whichever
3673 is greater. */
c906108c 3674
c5aa993b 3675 post_prologue_pc = after_prologue (pc);
c906108c 3676
7be570e7
JM
3677 /* If after_prologue returned a useful address, then use it. Else
3678 fall back on the instruction skipping code.
3679
3680 Some folks have claimed this causes problems because the breakpoint
3681 may be the first instruction of the prologue. If that happens, then
3682 the instruction skipping code has a bug that needs to be fixed. */
c5aa993b
JM
3683 if (post_prologue_pc != 0)
3684 return max (pc, post_prologue_pc);
c5aa993b
JM
3685 else
3686 return (skip_prologue_hard_way (pc));
c906108c
SS
3687}
3688
3689/* Put here the code to store, into a struct frame_saved_regs,
3690 the addresses of the saved registers of frame described by FRAME_INFO.
3691 This includes special registers such as pc and fp saved in special
3692 ways in the stack frame. sp is even more special:
3693 the address we return for it IS the sp for the next frame. */
3694
3695void
3696hppa_frame_find_saved_regs (frame_info, frame_saved_regs)
3697 struct frame_info *frame_info;
3698 struct frame_saved_regs *frame_saved_regs;
3699{
3700 CORE_ADDR pc;
3701 struct unwind_table_entry *u;
3702 unsigned long inst, stack_remaining, save_gr, save_fr, save_rp, save_sp;
3703 int status, i, reg;
3704 char buf[4];
3705 int fp_loc = -1;
3706
3707 /* Zero out everything. */
3708 memset (frame_saved_regs, '\0', sizeof (struct frame_saved_regs));
3709
3710 /* Call dummy frames always look the same, so there's no need to
3711 examine the dummy code to determine locations of saved registers;
3712 instead, let find_dummy_frame_regs fill in the correct offsets
3713 for the saved registers. */
3714 if ((frame_info->pc >= frame_info->frame
53a5351d
JM
3715 && frame_info->pc <= (frame_info->frame
3716 /* A call dummy is sized in words, but it is
3717 actually a series of instructions. Account
3718 for that scaling factor. */
3719 + ((REGISTER_SIZE / INSTRUCTION_SIZE)
3720 * CALL_DUMMY_LENGTH)
3721 /* Similarly we have to account for 64bit
3722 wide register saves. */
3723 + (32 * REGISTER_SIZE)
3724 /* We always consider FP regs 8 bytes long. */
3725 + (NUM_REGS - FP0_REGNUM) * 8
3726 /* Similarly we have to account for 64bit
3727 wide register saves. */
3728 + (6 * REGISTER_SIZE))))
c906108c
SS
3729 find_dummy_frame_regs (frame_info, frame_saved_regs);
3730
3731 /* Interrupt handlers are special too. They lay out the register
3732 state in the exact same order as the register numbers in GDB. */
3733 if (pc_in_interrupt_handler (frame_info->pc))
3734 {
3735 for (i = 0; i < NUM_REGS; i++)
3736 {
3737 /* SP is a little special. */
3738 if (i == SP_REGNUM)
3739 frame_saved_regs->regs[SP_REGNUM]
53a5351d
JM
3740 = read_memory_integer (frame_info->frame + SP_REGNUM * 4,
3741 TARGET_PTR_BIT / 8);
c906108c
SS
3742 else
3743 frame_saved_regs->regs[i] = frame_info->frame + i * 4;
3744 }
3745 return;
3746 }
3747
3748#ifdef FRAME_FIND_SAVED_REGS_IN_SIGTRAMP
3749 /* Handle signal handler callers. */
3750 if (frame_info->signal_handler_caller)
3751 {
3752 FRAME_FIND_SAVED_REGS_IN_SIGTRAMP (frame_info, frame_saved_regs);
3753 return;
3754 }
3755#endif
3756
3757 /* Get the starting address of the function referred to by the PC
3758 saved in frame. */
3759 pc = get_pc_function_start (frame_info->pc);
3760
3761 /* Yow! */
3762 u = find_unwind_entry (pc);
3763 if (!u)
3764 return;
3765
3766 /* This is how much of a frame adjustment we need to account for. */
3767 stack_remaining = u->Total_frame_size << 3;
3768
3769 /* Magic register saves we want to know about. */
3770 save_rp = u->Save_RP;
3771 save_sp = u->Save_SP;
3772
3773 /* Turn the Entry_GR field into a bitmask. */
3774 save_gr = 0;
3775 for (i = 3; i < u->Entry_GR + 3; i++)
3776 {
3777 /* Frame pointer gets saved into a special location. */
3778 if (u->Save_SP && i == FP_REGNUM)
3779 continue;
3780
3781 save_gr |= (1 << i);
3782 }
3783
3784 /* Turn the Entry_FR field into a bitmask too. */
3785 save_fr = 0;
3786 for (i = 12; i < u->Entry_FR + 12; i++)
3787 save_fr |= (1 << i);
3788
3789 /* The frame always represents the value of %sp at entry to the
3790 current function (and is thus equivalent to the "saved" stack
3791 pointer. */
3792 frame_saved_regs->regs[SP_REGNUM] = frame_info->frame;
3793
3794 /* Loop until we find everything of interest or hit a branch.
3795
3796 For unoptimized GCC code and for any HP CC code this will never ever
3797 examine any user instructions.
3798
7be570e7 3799 For optimized GCC code we're faced with problems. GCC will schedule
c906108c
SS
3800 its prologue and make prologue instructions available for delay slot
3801 filling. The end result is user code gets mixed in with the prologue
3802 and a prologue instruction may be in the delay slot of the first branch
3803 or call.
3804
3805 Some unexpected things are expected with debugging optimized code, so
3806 we allow this routine to walk past user instructions in optimized
3807 GCC code. */
3808 while (save_gr || save_fr || save_rp || save_sp || stack_remaining > 0)
3809 {
3810 status = target_read_memory (pc, buf, 4);
3811 inst = extract_unsigned_integer (buf, 4);
3812
3813 /* Yow! */
3814 if (status != 0)
3815 return;
3816
3817 /* Note the interesting effects of this instruction. */
3818 stack_remaining -= prologue_inst_adjust_sp (inst);
3819
104c1213
JM
3820 /* There are limited ways to store the return pointer into the
3821 stack. */
3822 if (inst == 0x6bc23fd9 || inst == 0x0fc212c1)
c906108c
SS
3823 {
3824 save_rp = 0;
3825 frame_saved_regs->regs[RP_REGNUM] = frame_info->frame - 20;
3826 }
3827
104c1213
JM
3828 /* Note if we saved SP into the stack. This also happens to indicate
3829 the location of the saved frame pointer. */
3830 if ((inst & 0xffffc000) == 0x6fc10000
3831 || (inst & 0xffffc00c) == 0x73c10008)
3832 {
3833 frame_saved_regs->regs[FP_REGNUM] = frame_info->frame;
3834 save_sp = 0;
3835 }
c906108c
SS
3836
3837 /* Account for general and floating-point register saves. */
3838 reg = inst_saves_gr (inst);
3839 if (reg >= 3 && reg <= 18
3840 && (!u->Save_SP || reg != FP_REGNUM))
3841 {
3842 save_gr &= ~(1 << reg);
3843
3844 /* stwm with a positive displacement is a *post modify*. */
3845 if ((inst >> 26) == 0x1b
3846 && extract_14 (inst) >= 0)
3847 frame_saved_regs->regs[reg] = frame_info->frame;
104c1213
JM
3848 /* A std has explicit post_modify forms. */
3849 else if ((inst & 0xfc00000c0) == 0x70000008)
3850 frame_saved_regs->regs[reg] = frame_info->frame;
c906108c
SS
3851 else
3852 {
104c1213
JM
3853 CORE_ADDR offset;
3854
3855 if ((inst >> 26) == 0x1c)
3856 offset = (inst & 0x1 ? -1 << 16 : 0) | (((inst >> 4) & 0x3ff) << 3);
3857 else if ((inst >> 26) == 0x03)
3858 offset = low_sign_extend (inst & 0x1f, 5);
3859 else
3860 offset = extract_14 (inst);
3861
c906108c
SS
3862 /* Handle code with and without frame pointers. */
3863 if (u->Save_SP)
3864 frame_saved_regs->regs[reg]
104c1213 3865 = frame_info->frame + offset;
c906108c
SS
3866 else
3867 frame_saved_regs->regs[reg]
104c1213
JM
3868 = (frame_info->frame + (u->Total_frame_size << 3)
3869 + offset);
c906108c
SS
3870 }
3871 }
3872
3873
3874 /* GCC handles callee saved FP regs a little differently.
3875
c5aa993b
JM
3876 It emits an instruction to put the value of the start of
3877 the FP store area into %r1. It then uses fstds,ma with
3878 a basereg of %r1 for the stores.
c906108c 3879
c5aa993b
JM
3880 HP CC emits them at the current stack pointer modifying
3881 the stack pointer as it stores each register. */
c906108c
SS
3882
3883 /* ldo X(%r3),%r1 or ldo X(%r30),%r1. */
3884 if ((inst & 0xffffc000) == 0x34610000
3885 || (inst & 0xffffc000) == 0x37c10000)
3886 fp_loc = extract_14 (inst);
c5aa993b 3887
c906108c
SS
3888 reg = inst_saves_fr (inst);
3889 if (reg >= 12 && reg <= 21)
3890 {
3891 /* Note +4 braindamage below is necessary because the FP status
3892 registers are internally 8 registers rather than the expected
3893 4 registers. */
3894 save_fr &= ~(1 << reg);
3895 if (fp_loc == -1)
3896 {
3897 /* 1st HP CC FP register store. After this instruction
c5aa993b
JM
3898 we've set enough state that the GCC and HPCC code are
3899 both handled in the same manner. */
c906108c
SS
3900 frame_saved_regs->regs[reg + FP4_REGNUM + 4] = frame_info->frame;
3901 fp_loc = 8;
3902 }
3903 else
3904 {
3905 frame_saved_regs->regs[reg + FP0_REGNUM + 4]
3906 = frame_info->frame + fp_loc;
3907 fp_loc += 8;
3908 }
3909 }
3910
3911 /* Quit if we hit any kind of branch. This can happen if a prologue
c5aa993b 3912 instruction is in the delay slot of the first call/branch. */
c906108c
SS
3913 if (is_branch (inst))
3914 break;
3915
3916 /* Bump the PC. */
3917 pc += 4;
3918 }
3919}
3920
3921
3922/* Exception handling support for the HP-UX ANSI C++ compiler.
3923 The compiler (aCC) provides a callback for exception events;
3924 GDB can set a breakpoint on this callback and find out what
3925 exception event has occurred. */
3926
3927/* The name of the hook to be set to point to the callback function */
c5aa993b
JM
3928static char HP_ACC_EH_notify_hook[] = "__eh_notify_hook";
3929/* The name of the function to be used to set the hook value */
3930static char HP_ACC_EH_set_hook_value[] = "__eh_set_hook_value";
3931/* The name of the callback function in end.o */
c906108c 3932static char HP_ACC_EH_notify_callback[] = "__d_eh_notify_callback";
c5aa993b
JM
3933/* Name of function in end.o on which a break is set (called by above) */
3934static char HP_ACC_EH_break[] = "__d_eh_break";
3935/* Name of flag (in end.o) that enables catching throws */
3936static char HP_ACC_EH_catch_throw[] = "__d_eh_catch_throw";
3937/* Name of flag (in end.o) that enables catching catching */
3938static char HP_ACC_EH_catch_catch[] = "__d_eh_catch_catch";
3939/* The enum used by aCC */
3940typedef enum
3941 {
3942 __EH_NOTIFY_THROW,
3943 __EH_NOTIFY_CATCH
3944 }
3945__eh_notification;
c906108c
SS
3946
3947/* Is exception-handling support available with this executable? */
3948static int hp_cxx_exception_support = 0;
3949/* Has the initialize function been run? */
3950int hp_cxx_exception_support_initialized = 0;
3951/* Similar to above, but imported from breakpoint.c -- non-target-specific */
3952extern int exception_support_initialized;
3953/* Address of __eh_notify_hook */
a0b3c4fd 3954static CORE_ADDR eh_notify_hook_addr = 0;
c906108c 3955/* Address of __d_eh_notify_callback */
a0b3c4fd 3956static CORE_ADDR eh_notify_callback_addr = 0;
c906108c 3957/* Address of __d_eh_break */
a0b3c4fd 3958static CORE_ADDR eh_break_addr = 0;
c906108c 3959/* Address of __d_eh_catch_catch */
a0b3c4fd 3960static CORE_ADDR eh_catch_catch_addr = 0;
c906108c 3961/* Address of __d_eh_catch_throw */
a0b3c4fd 3962static CORE_ADDR eh_catch_throw_addr = 0;
c906108c 3963/* Sal for __d_eh_break */
a0b3c4fd 3964static struct symtab_and_line *break_callback_sal = 0;
c906108c
SS
3965
3966/* Code in end.c expects __d_pid to be set in the inferior,
3967 otherwise __d_eh_notify_callback doesn't bother to call
3968 __d_eh_break! So we poke the pid into this symbol
3969 ourselves.
3970 0 => success
c5aa993b 3971 1 => failure */
c906108c
SS
3972int
3973setup_d_pid_in_inferior ()
3974{
3975 CORE_ADDR anaddr;
c5aa993b
JM
3976 struct minimal_symbol *msymbol;
3977 char buf[4]; /* FIXME 32x64? */
3978
c906108c
SS
3979 /* Slam the pid of the process into __d_pid; failing is only a warning! */
3980 msymbol = lookup_minimal_symbol ("__d_pid", NULL, symfile_objfile);
3981 if (msymbol == NULL)
3982 {
3983 warning ("Unable to find __d_pid symbol in object file.");
3984 warning ("Suggest linking executable with -g (links in /opt/langtools/lib/end.o).");
3985 return 1;
3986 }
3987
3988 anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
c5aa993b
JM
3989 store_unsigned_integer (buf, 4, inferior_pid); /* FIXME 32x64? */
3990 if (target_write_memory (anaddr, buf, 4)) /* FIXME 32x64? */
c906108c
SS
3991 {
3992 warning ("Unable to write __d_pid");
3993 warning ("Suggest linking executable with -g (links in /opt/langtools/lib/end.o).");
3994 return 1;
3995 }
3996 return 0;
3997}
3998
3999/* Initialize exception catchpoint support by looking for the
4000 necessary hooks/callbacks in end.o, etc., and set the hook value to
4001 point to the required debug function
4002
4003 Return 0 => failure
c5aa993b 4004 1 => success */
c906108c
SS
4005
4006static int
4007initialize_hp_cxx_exception_support ()
4008{
4009 struct symtabs_and_lines sals;
c5aa993b
JM
4010 struct cleanup *old_chain;
4011 struct cleanup *canonical_strings_chain = NULL;
c906108c 4012 int i;
c5aa993b
JM
4013 char *addr_start;
4014 char *addr_end = NULL;
4015 char **canonical = (char **) NULL;
c906108c 4016 int thread = -1;
c5aa993b
JM
4017 struct symbol *sym = NULL;
4018 struct minimal_symbol *msym = NULL;
4019 struct objfile *objfile;
c906108c
SS
4020 asection *shlib_info;
4021
4022 /* Detect and disallow recursion. On HP-UX with aCC, infinite
4023 recursion is a possibility because finding the hook for exception
4024 callbacks involves making a call in the inferior, which means
4025 re-inserting breakpoints which can re-invoke this code */
4026
c5aa993b
JM
4027 static int recurse = 0;
4028 if (recurse > 0)
c906108c
SS
4029 {
4030 hp_cxx_exception_support_initialized = 0;
4031 exception_support_initialized = 0;
4032 return 0;
4033 }
4034
4035 hp_cxx_exception_support = 0;
4036
4037 /* First check if we have seen any HP compiled objects; if not,
4038 it is very unlikely that HP's idiosyncratic callback mechanism
4039 for exception handling debug support will be available!
4040 This will percolate back up to breakpoint.c, where our callers
4041 will decide to try the g++ exception-handling support instead. */
4042 if (!hp_som_som_object_present)
4043 return 0;
c5aa993b 4044
c906108c
SS
4045 /* We have a SOM executable with SOM debug info; find the hooks */
4046
4047 /* First look for the notify hook provided by aCC runtime libs */
4048 /* If we find this symbol, we conclude that the executable must
4049 have HP aCC exception support built in. If this symbol is not
4050 found, even though we're a HP SOM-SOM file, we may have been
4051 built with some other compiler (not aCC). This results percolates
4052 back up to our callers in breakpoint.c which can decide to
4053 try the g++ style of exception support instead.
4054 If this symbol is found but the other symbols we require are
4055 not found, there is something weird going on, and g++ support
4056 should *not* be tried as an alternative.
c5aa993b 4057
c906108c
SS
4058 ASSUMPTION: Only HP aCC code will have __eh_notify_hook defined.
4059 ASSUMPTION: HP aCC and g++ modules cannot be linked together. */
c5aa993b 4060
c906108c
SS
4061 /* libCsup has this hook; it'll usually be non-debuggable */
4062 msym = lookup_minimal_symbol (HP_ACC_EH_notify_hook, NULL, NULL);
4063 if (msym)
4064 {
4065 eh_notify_hook_addr = SYMBOL_VALUE_ADDRESS (msym);
4066 hp_cxx_exception_support = 1;
c5aa993b 4067 }
c906108c
SS
4068 else
4069 {
4070 warning ("Unable to find exception callback hook (%s).", HP_ACC_EH_notify_hook);
4071 warning ("Executable may not have been compiled debuggable with HP aCC.");
4072 warning ("GDB will be unable to intercept exception events.");
4073 eh_notify_hook_addr = 0;
4074 hp_cxx_exception_support = 0;
4075 return 0;
4076 }
4077
c906108c 4078 /* Next look for the notify callback routine in end.o */
c5aa993b 4079 /* This is always available in the SOM symbol dictionary if end.o is linked in */
c906108c
SS
4080 msym = lookup_minimal_symbol (HP_ACC_EH_notify_callback, NULL, NULL);
4081 if (msym)
4082 {
4083 eh_notify_callback_addr = SYMBOL_VALUE_ADDRESS (msym);
4084 hp_cxx_exception_support = 1;
c5aa993b
JM
4085 }
4086 else
c906108c
SS
4087 {
4088 warning ("Unable to find exception callback routine (%s).", HP_ACC_EH_notify_callback);
4089 warning ("Suggest linking executable with -g (links in /opt/langtools/lib/end.o).");
4090 warning ("GDB will be unable to intercept exception events.");
4091 eh_notify_callback_addr = 0;
4092 return 0;
4093 }
4094
53a5351d 4095#ifndef GDB_TARGET_IS_HPPA_20W
c906108c
SS
4096 /* Check whether the executable is dynamically linked or archive bound */
4097 /* With an archive-bound executable we can use the raw addresses we find
4098 for the callback function, etc. without modification. For an executable
4099 with shared libraries, we have to do more work to find the plabel, which
4100 can be the target of a call through $$dyncall from the aCC runtime support
4101 library (libCsup) which is linked shared by default by aCC. */
4102 /* This test below was copied from somsolib.c/somread.c. It may not be a very
c5aa993b 4103 reliable one to test that an executable is linked shared. pai/1997-07-18 */
c906108c
SS
4104 shlib_info = bfd_get_section_by_name (symfile_objfile->obfd, "$SHLIB_INFO$");
4105 if (shlib_info && (bfd_section_size (symfile_objfile->obfd, shlib_info) != 0))
4106 {
4107 /* The minsym we have has the local code address, but that's not the
4108 plabel that can be used by an inter-load-module call. */
4109 /* Find solib handle for main image (which has end.o), and use that
4110 and the min sym as arguments to __d_shl_get() (which does the equivalent
c5aa993b 4111 of shl_findsym()) to find the plabel. */
c906108c
SS
4112
4113 args_for_find_stub args;
4114 static char message[] = "Error while finding exception callback hook:\n";
c5aa993b 4115
c906108c
SS
4116 args.solib_handle = som_solib_get_solib_by_pc (eh_notify_callback_addr);
4117 args.msym = msym;
a0b3c4fd 4118 args.return_val = 0;
c5aa993b 4119
c906108c 4120 recurse++;
a0b3c4fd
JM
4121 catch_errors (cover_find_stub_with_shl_get, (PTR) &args, message,
4122 RETURN_MASK_ALL);
4123 eh_notify_callback_addr = args.return_val;
c906108c 4124 recurse--;
c5aa993b 4125
c906108c 4126 exception_catchpoints_are_fragile = 1;
c5aa993b 4127
c906108c 4128 if (!eh_notify_callback_addr)
c5aa993b
JM
4129 {
4130 /* We can get here either if there is no plabel in the export list
4131 for the main image, or if something strange happened (??) */
4132 warning ("Couldn't find a plabel (indirect function label) for the exception callback.");
4133 warning ("GDB will not be able to intercept exception events.");
4134 return 0;
4135 }
c906108c
SS
4136 }
4137 else
4138 exception_catchpoints_are_fragile = 0;
53a5351d 4139#endif
c906108c 4140
c906108c 4141 /* Now, look for the breakpointable routine in end.o */
c5aa993b 4142 /* This should also be available in the SOM symbol dict. if end.o linked in */
c906108c
SS
4143 msym = lookup_minimal_symbol (HP_ACC_EH_break, NULL, NULL);
4144 if (msym)
4145 {
4146 eh_break_addr = SYMBOL_VALUE_ADDRESS (msym);
4147 hp_cxx_exception_support = 1;
c5aa993b 4148 }
c906108c
SS
4149 else
4150 {
4151 warning ("Unable to find exception callback routine to set breakpoint (%s).", HP_ACC_EH_break);
4152 warning ("Suggest linking executable with -g (link in /opt/langtools/lib/end.o).");
4153 warning ("GDB will be unable to intercept exception events.");
4154 eh_break_addr = 0;
4155 return 0;
4156 }
4157
c906108c
SS
4158 /* Next look for the catch enable flag provided in end.o */
4159 sym = lookup_symbol (HP_ACC_EH_catch_catch, (struct block *) NULL,
c5aa993b
JM
4160 VAR_NAMESPACE, 0, (struct symtab **) NULL);
4161 if (sym) /* sometimes present in debug info */
c906108c
SS
4162 {
4163 eh_catch_catch_addr = SYMBOL_VALUE_ADDRESS (sym);
4164 hp_cxx_exception_support = 1;
4165 }
c5aa993b
JM
4166 else
4167 /* otherwise look in SOM symbol dict. */
c906108c
SS
4168 {
4169 msym = lookup_minimal_symbol (HP_ACC_EH_catch_catch, NULL, NULL);
4170 if (msym)
c5aa993b
JM
4171 {
4172 eh_catch_catch_addr = SYMBOL_VALUE_ADDRESS (msym);
4173 hp_cxx_exception_support = 1;
4174 }
c906108c 4175 else
c5aa993b
JM
4176 {
4177 warning ("Unable to enable interception of exception catches.");
4178 warning ("Executable may not have been compiled debuggable with HP aCC.");
4179 warning ("Suggest linking executable with -g (link in /opt/langtools/lib/end.o).");
4180 return 0;
4181 }
c906108c
SS
4182 }
4183
c906108c
SS
4184 /* Next look for the catch enable flag provided end.o */
4185 sym = lookup_symbol (HP_ACC_EH_catch_catch, (struct block *) NULL,
c5aa993b
JM
4186 VAR_NAMESPACE, 0, (struct symtab **) NULL);
4187 if (sym) /* sometimes present in debug info */
c906108c
SS
4188 {
4189 eh_catch_throw_addr = SYMBOL_VALUE_ADDRESS (sym);
4190 hp_cxx_exception_support = 1;
4191 }
c5aa993b
JM
4192 else
4193 /* otherwise look in SOM symbol dict. */
c906108c
SS
4194 {
4195 msym = lookup_minimal_symbol (HP_ACC_EH_catch_throw, NULL, NULL);
4196 if (msym)
c5aa993b
JM
4197 {
4198 eh_catch_throw_addr = SYMBOL_VALUE_ADDRESS (msym);
4199 hp_cxx_exception_support = 1;
4200 }
c906108c 4201 else
c5aa993b
JM
4202 {
4203 warning ("Unable to enable interception of exception throws.");
4204 warning ("Executable may not have been compiled debuggable with HP aCC.");
4205 warning ("Suggest linking executable with -g (link in /opt/langtools/lib/end.o).");
4206 return 0;
4207 }
c906108c
SS
4208 }
4209
c5aa993b
JM
4210 /* Set the flags */
4211 hp_cxx_exception_support = 2; /* everything worked so far */
c906108c
SS
4212 hp_cxx_exception_support_initialized = 1;
4213 exception_support_initialized = 1;
4214
4215 return 1;
4216}
4217
4218/* Target operation for enabling or disabling interception of
4219 exception events.
4220 KIND is either EX_EVENT_THROW or EX_EVENT_CATCH
4221 ENABLE is either 0 (disable) or 1 (enable).
4222 Return value is NULL if no support found;
4223 -1 if something went wrong,
4224 or a pointer to a symtab/line struct if the breakpointable
c5aa993b 4225 address was found. */
c906108c 4226
c5aa993b 4227struct symtab_and_line *
c906108c 4228child_enable_exception_callback (kind, enable)
c5aa993b
JM
4229 enum exception_event_kind kind;
4230 int enable;
c906108c
SS
4231{
4232 char buf[4];
4233
4234 if (!exception_support_initialized || !hp_cxx_exception_support_initialized)
4235 if (!initialize_hp_cxx_exception_support ())
4236 return NULL;
4237
4238 switch (hp_cxx_exception_support)
4239 {
c5aa993b
JM
4240 case 0:
4241 /* Assuming no HP support at all */
4242 return NULL;
4243 case 1:
4244 /* HP support should be present, but something went wrong */
4245 return (struct symtab_and_line *) -1; /* yuck! */
4246 /* there may be other cases in the future */
c906108c 4247 }
c5aa993b 4248
c906108c 4249 /* Set the EH hook to point to the callback routine */
c5aa993b 4250 store_unsigned_integer (buf, 4, enable ? eh_notify_callback_addr : 0); /* FIXME 32x64 problem */
c906108c 4251 /* pai: (temp) FIXME should there be a pack operation first? */
c5aa993b 4252 if (target_write_memory (eh_notify_hook_addr, buf, 4)) /* FIXME 32x64 problem */
c906108c
SS
4253 {
4254 warning ("Could not write to target memory for exception event callback.");
4255 warning ("Interception of exception events may not work.");
c5aa993b 4256 return (struct symtab_and_line *) -1;
c906108c
SS
4257 }
4258 if (enable)
4259 {
c5aa993b 4260 /* Ensure that __d_pid is set up correctly -- end.c code checks this. :-( */
c906108c 4261 if (inferior_pid > 0)
c5aa993b
JM
4262 {
4263 if (setup_d_pid_in_inferior ())
4264 return (struct symtab_and_line *) -1;
4265 }
c906108c 4266 else
c5aa993b 4267 {
104c1213
JM
4268 warning ("Internal error: Invalid inferior pid? Cannot intercept exception events.");
4269 return (struct symtab_and_line *) -1;
c5aa993b 4270 }
c906108c 4271 }
c5aa993b 4272
c906108c
SS
4273 switch (kind)
4274 {
c5aa993b
JM
4275 case EX_EVENT_THROW:
4276 store_unsigned_integer (buf, 4, enable ? 1 : 0);
4277 if (target_write_memory (eh_catch_throw_addr, buf, 4)) /* FIXME 32x64? */
4278 {
4279 warning ("Couldn't enable exception throw interception.");
4280 return (struct symtab_and_line *) -1;
4281 }
4282 break;
4283 case EX_EVENT_CATCH:
4284 store_unsigned_integer (buf, 4, enable ? 1 : 0);
4285 if (target_write_memory (eh_catch_catch_addr, buf, 4)) /* FIXME 32x64? */
4286 {
4287 warning ("Couldn't enable exception catch interception.");
4288 return (struct symtab_and_line *) -1;
4289 }
4290 break;
104c1213
JM
4291 default:
4292 error ("Request to enable unknown or unsupported exception event.");
c906108c 4293 }
c5aa993b 4294
c906108c
SS
4295 /* Copy break address into new sal struct, malloc'ing if needed. */
4296 if (!break_callback_sal)
4297 {
4298 break_callback_sal = (struct symtab_and_line *) xmalloc (sizeof (struct symtab_and_line));
4299 }
c5aa993b 4300 INIT_SAL (break_callback_sal);
c906108c
SS
4301 break_callback_sal->symtab = NULL;
4302 break_callback_sal->pc = eh_break_addr;
4303 break_callback_sal->line = 0;
4304 break_callback_sal->end = eh_break_addr;
c5aa993b 4305
c906108c
SS
4306 return break_callback_sal;
4307}
4308
c5aa993b 4309/* Record some information about the current exception event */
c906108c 4310static struct exception_event_record current_ex_event;
c5aa993b
JM
4311/* Convenience struct */
4312static struct symtab_and_line null_symtab_and_line =
4313{NULL, 0, 0, 0};
c906108c
SS
4314
4315/* Report current exception event. Returns a pointer to a record
4316 that describes the kind of the event, where it was thrown from,
4317 and where it will be caught. More information may be reported
c5aa993b 4318 in the future */
c906108c
SS
4319struct exception_event_record *
4320child_get_current_exception_event ()
4321{
c5aa993b
JM
4322 CORE_ADDR event_kind;
4323 CORE_ADDR throw_addr;
4324 CORE_ADDR catch_addr;
c906108c
SS
4325 struct frame_info *fi, *curr_frame;
4326 int level = 1;
4327
c5aa993b 4328 curr_frame = get_current_frame ();
c906108c
SS
4329 if (!curr_frame)
4330 return (struct exception_event_record *) NULL;
4331
4332 /* Go up one frame to __d_eh_notify_callback, because at the
4333 point when this code is executed, there's garbage in the
4334 arguments of __d_eh_break. */
4335 fi = find_relative_frame (curr_frame, &level);
4336 if (level != 0)
4337 return (struct exception_event_record *) NULL;
4338
4339 select_frame (fi, -1);
4340
4341 /* Read in the arguments */
4342 /* __d_eh_notify_callback() is called with 3 arguments:
c5aa993b
JM
4343 1. event kind catch or throw
4344 2. the target address if known
4345 3. a flag -- not sure what this is. pai/1997-07-17 */
4346 event_kind = read_register (ARG0_REGNUM);
c906108c
SS
4347 catch_addr = read_register (ARG1_REGNUM);
4348
4349 /* Now go down to a user frame */
4350 /* For a throw, __d_eh_break is called by
c5aa993b
JM
4351 __d_eh_notify_callback which is called by
4352 __notify_throw which is called
4353 from user code.
c906108c 4354 For a catch, __d_eh_break is called by
c5aa993b
JM
4355 __d_eh_notify_callback which is called by
4356 <stackwalking stuff> which is called by
4357 __throw__<stuff> or __rethrow_<stuff> which is called
4358 from user code. */
4359 /* FIXME: Don't use such magic numbers; search for the frames */
c906108c
SS
4360 level = (event_kind == EX_EVENT_THROW) ? 3 : 4;
4361 fi = find_relative_frame (curr_frame, &level);
4362 if (level != 0)
4363 return (struct exception_event_record *) NULL;
4364
4365 select_frame (fi, -1);
4366 throw_addr = fi->pc;
4367
4368 /* Go back to original (top) frame */
4369 select_frame (curr_frame, -1);
4370
4371 current_ex_event.kind = (enum exception_event_kind) event_kind;
4372 current_ex_event.throw_sal = find_pc_line (throw_addr, 1);
4373 current_ex_event.catch_sal = find_pc_line (catch_addr, 1);
4374
4375 return &current_ex_event;
4376}
4377
c906108c
SS
4378static void
4379unwind_command (exp, from_tty)
4380 char *exp;
4381 int from_tty;
4382{
4383 CORE_ADDR address;
4384 struct unwind_table_entry *u;
4385
4386 /* If we have an expression, evaluate it and use it as the address. */
4387
4388 if (exp != 0 && *exp != 0)
4389 address = parse_and_eval_address (exp);
4390 else
4391 return;
4392
4393 u = find_unwind_entry (address);
4394
4395 if (!u)
4396 {
4397 printf_unfiltered ("Can't find unwind table entry for %s\n", exp);
4398 return;
4399 }
4400
4401 printf_unfiltered ("unwind_table_entry (0x%x):\n", u);
4402
4403 printf_unfiltered ("\tregion_start = ");
4404 print_address (u->region_start, gdb_stdout);
4405
4406 printf_unfiltered ("\n\tregion_end = ");
4407 print_address (u->region_end, gdb_stdout);
4408
4409#ifdef __STDC__
4410#define pif(FLD) if (u->FLD) printf_unfiltered (" "#FLD);
4411#else
4412#define pif(FLD) if (u->FLD) printf_unfiltered (" FLD");
4413#endif
4414
4415 printf_unfiltered ("\n\tflags =");
4416 pif (Cannot_unwind);
4417 pif (Millicode);
4418 pif (Millicode_save_sr0);
4419 pif (Entry_SR);
4420 pif (Args_stored);
4421 pif (Variable_Frame);
4422 pif (Separate_Package_Body);
4423 pif (Frame_Extension_Millicode);
4424 pif (Stack_Overflow_Check);
4425 pif (Two_Instruction_SP_Increment);
4426 pif (Ada_Region);
4427 pif (Save_SP);
4428 pif (Save_RP);
4429 pif (Save_MRP_in_frame);
4430 pif (extn_ptr_defined);
4431 pif (Cleanup_defined);
4432 pif (MPE_XL_interrupt_marker);
4433 pif (HP_UX_interrupt_marker);
4434 pif (Large_frame);
4435
4436 putchar_unfiltered ('\n');
4437
4438#ifdef __STDC__
4439#define pin(FLD) printf_unfiltered ("\t"#FLD" = 0x%x\n", u->FLD);
4440#else
4441#define pin(FLD) printf_unfiltered ("\tFLD = 0x%x\n", u->FLD);
4442#endif
4443
4444 pin (Region_description);
4445 pin (Entry_FR);
4446 pin (Entry_GR);
4447 pin (Total_frame_size);
4448}
c906108c
SS
4449
4450#ifdef PREPARE_TO_PROCEED
4451
4452/* If the user has switched threads, and there is a breakpoint
4453 at the old thread's pc location, then switch to that thread
4454 and return TRUE, else return FALSE and don't do a thread
4455 switch (or rather, don't seem to have done a thread switch).
4456
4457 Ptrace-based gdb will always return FALSE to the thread-switch
4458 query, and thus also to PREPARE_TO_PROCEED.
4459
4460 The important thing is whether there is a BPT instruction,
4461 not how many user breakpoints there are. So we have to worry
4462 about things like these:
4463
4464 o Non-bp stop -- NO
4465
4466 o User hits bp, no switch -- NO
4467
4468 o User hits bp, switches threads -- YES
4469
4470 o User hits bp, deletes bp, switches threads -- NO
4471
4472 o User hits bp, deletes one of two or more bps
c5aa993b 4473 at that PC, user switches threads -- YES
c906108c
SS
4474
4475 o Plus, since we're buffering events, the user may have hit a
c5aa993b
JM
4476 breakpoint, deleted the breakpoint and then gotten another
4477 hit on that same breakpoint on another thread which
4478 actually hit before the delete. (FIXME in breakpoint.c
4479 so that "dead" breakpoints are ignored?) -- NO
c906108c
SS
4480
4481 For these reasons, we have to violate information hiding and
4482 call "breakpoint_here_p". If core gdb thinks there is a bpt
4483 here, that's what counts, as core gdb is the one which is
4484 putting the BPT instruction in and taking it out. */
4485int
c5aa993b 4486hppa_prepare_to_proceed ()
c906108c
SS
4487{
4488 pid_t old_thread;
4489 pid_t current_thread;
4490
c5aa993b 4491 old_thread = hppa_switched_threads (inferior_pid);
c906108c
SS
4492 if (old_thread != 0)
4493 {
4494 /* Switched over from "old_thread". Try to do
4495 as little work as possible, 'cause mostly
4496 we're going to switch back. */
4497 CORE_ADDR new_pc;
c5aa993b 4498 CORE_ADDR old_pc = read_pc ();
c906108c
SS
4499
4500 /* Yuk, shouldn't use global to specify current
4501 thread. But that's how gdb does it. */
4502 current_thread = inferior_pid;
c5aa993b 4503 inferior_pid = old_thread;
c906108c 4504
c5aa993b
JM
4505 new_pc = read_pc ();
4506 if (new_pc != old_pc /* If at same pc, no need */
c906108c 4507 && breakpoint_here_p (new_pc))
c5aa993b 4508 {
c906108c 4509 /* User hasn't deleted the BP.
c5aa993b 4510 Return TRUE, finishing switch to "old_thread". */
c906108c
SS
4511 flush_cached_frames ();
4512 registers_changed ();
4513#if 0
c5aa993b 4514 printf ("---> PREPARE_TO_PROCEED (was %d, now %d)!\n",
c906108c
SS
4515 current_thread, inferior_pid);
4516#endif
c5aa993b 4517
c906108c 4518 return 1;
c5aa993b 4519 }
c906108c
SS
4520
4521 /* Otherwise switch back to the user-chosen thread. */
4522 inferior_pid = current_thread;
c5aa993b 4523 new_pc = read_pc (); /* Re-prime register cache */
c906108c
SS
4524 }
4525
4526 return 0;
4527}
4528#endif /* PREPARE_TO_PROCEED */
4529
4530void
4531_initialize_hppa_tdep ()
4532{
4533 tm_print_insn = print_insn_hppa;
4534
c906108c
SS
4535 add_cmd ("unwind", class_maintenance, unwind_command,
4536 "Print unwind table entry at given address.",
4537 &maintenanceprintlist);
c906108c 4538}
This page took 0.221016 seconds and 4 git commands to generate.