* subsegs.h: Include obstack.h.
[deliverable/binutils-gdb.git] / gdb / hppa-tdep.c
CommitLineData
669caa9c
SS
1/* Target-dependent code for the HP PA architecture, for GDB.
2 Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994
3 Free Software Foundation, Inc.
66a1aa07
SG
4
5 Contributed by the Center for Software Science at the
6 University of Utah (pa-gdb-bugs@cs.utah.edu).
7
8This file is part of GDB.
9
10This program is free software; you can redistribute it and/or modify
11it under the terms of the GNU General Public License as published by
12the Free Software Foundation; either version 2 of the License, or
13(at your option) any later version.
14
15This program is distributed in the hope that it will be useful,
16but WITHOUT ANY WARRANTY; without even the implied warranty of
17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18GNU General Public License for more details.
19
20You should have received a copy of the GNU General Public License
21along with this program; if not, write to the Free Software
22Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
23
24#include "defs.h"
25#include "frame.h"
26#include "inferior.h"
27#include "value.h"
28
29/* For argument passing to the inferior */
30#include "symtab.h"
31
32#ifdef USG
33#include <sys/types.h>
34#endif
35
36#include <sys/param.h>
66a1aa07 37#include <signal.h>
66a1aa07
SG
38
39#ifdef COFF_ENCAPSULATE
40#include "a.out.encap.h"
41#else
66a1aa07
SG
42#endif
43#ifndef N_SET_MAGIC
44#define N_SET_MAGIC(exec, val) ((exec).a_magic = (val))
45#endif
46
47/*#include <sys/user.h> After a.out.h */
48#include <sys/file.h>
49#include <sys/stat.h>
66a1aa07
SG
50#include "wait.h"
51
52#include "gdbcore.h"
53#include "gdbcmd.h"
54#include "target.h"
55#include "symfile.h"
56#include "objfiles.h"
57
669caa9c
SS
58static int restore_pc_queue PARAMS ((struct frame_saved_regs *));
59
60static int hppa_alignof PARAMS ((struct type *));
61
62CORE_ADDR frame_saved_pc PARAMS ((struct frame_info *));
63
c598654a 64static int prologue_inst_adjust_sp PARAMS ((unsigned long));
669caa9c 65
c598654a 66static int is_branch PARAMS ((unsigned long));
669caa9c 67
c598654a 68static int inst_saves_gr PARAMS ((unsigned long));
669caa9c 69
c598654a 70static int inst_saves_fr PARAMS ((unsigned long));
669caa9c 71
70e43abe 72static int pc_in_interrupt_handler PARAMS ((CORE_ADDR));
669caa9c 73
70e43abe 74static int pc_in_linker_stub PARAMS ((CORE_ADDR));
669caa9c
SS
75
76static int compare_unwind_entries PARAMS ((const struct unwind_table_entry *,
f81eee9d 77 const struct unwind_table_entry *));
669caa9c 78
c5152d42 79static void read_unwind_info PARAMS ((struct objfile *));
669caa9c 80
c5152d42
JL
81static void internalize_unwinds PARAMS ((struct objfile *,
82 struct unwind_table_entry *,
83 asection *, unsigned int,
bfaef242 84 unsigned int, CORE_ADDR));
e43169eb
JL
85static void pa_print_registers PARAMS ((char *, int, int));
86static void pa_print_fp_reg PARAMS ((int));
66a1aa07
SG
87
88\f
89/* Routines to extract various sized constants out of hppa
90 instructions. */
91
92/* This assumes that no garbage lies outside of the lower bits of
93 value. */
94
95int
96sign_extend (val, bits)
97 unsigned val, bits;
98{
99 return (int)(val >> bits - 1 ? (-1 << bits) | val : val);
100}
101
102/* For many immediate values the sign bit is the low bit! */
103
104int
105low_sign_extend (val, bits)
106 unsigned val, bits;
107{
108 return (int)((val & 0x1 ? (-1 << (bits - 1)) : 0) | val >> 1);
109}
110/* extract the immediate field from a ld{bhw}s instruction */
111
112unsigned
113get_field (val, from, to)
114 unsigned val, from, to;
115{
116 val = val >> 31 - to;
117 return val & ((1 << 32 - from) - 1);
118}
119
120unsigned
121set_field (val, from, to, new_val)
122 unsigned *val, from, to;
123{
124 unsigned mask = ~((1 << (to - from + 1)) << (31 - from));
125 return *val = *val & mask | (new_val << (31 - from));
126}
127
128/* extract a 3-bit space register number from a be, ble, mtsp or mfsp */
129
130extract_3 (word)
131 unsigned word;
132{
133 return GET_FIELD (word, 18, 18) << 2 | GET_FIELD (word, 16, 17);
134}
135
136extract_5_load (word)
137 unsigned word;
138{
139 return low_sign_extend (word >> 16 & MASK_5, 5);
140}
141
142/* extract the immediate field from a st{bhw}s instruction */
143
144int
145extract_5_store (word)
146 unsigned word;
147{
148 return low_sign_extend (word & MASK_5, 5);
149}
150
68c8d698
SG
151/* extract the immediate field from a break instruction */
152
153unsigned
154extract_5r_store (word)
155 unsigned word;
156{
157 return (word & MASK_5);
158}
159
160/* extract the immediate field from a {sr}sm instruction */
161
162unsigned
163extract_5R_store (word)
164 unsigned word;
165{
166 return (word >> 16 & MASK_5);
167}
168
66a1aa07
SG
169/* extract an 11 bit immediate field */
170
171int
172extract_11 (word)
173 unsigned word;
174{
175 return low_sign_extend (word & MASK_11, 11);
176}
177
178/* extract a 14 bit immediate field */
179
180int
181extract_14 (word)
182 unsigned word;
183{
184 return low_sign_extend (word & MASK_14, 14);
185}
186
187/* deposit a 14 bit constant in a word */
188
189unsigned
190deposit_14 (opnd, word)
191 int opnd;
192 unsigned word;
193{
194 unsigned sign = (opnd < 0 ? 1 : 0);
195
196 return word | ((unsigned)opnd << 1 & MASK_14) | sign;
197}
198
199/* extract a 21 bit constant */
200
201int
202extract_21 (word)
203 unsigned word;
204{
205 int val;
206
207 word &= MASK_21;
208 word <<= 11;
209 val = GET_FIELD (word, 20, 20);
210 val <<= 11;
211 val |= GET_FIELD (word, 9, 19);
212 val <<= 2;
213 val |= GET_FIELD (word, 5, 6);
214 val <<= 5;
215 val |= GET_FIELD (word, 0, 4);
216 val <<= 2;
217 val |= GET_FIELD (word, 7, 8);
218 return sign_extend (val, 21) << 11;
219}
220
221/* deposit a 21 bit constant in a word. Although 21 bit constants are
222 usually the top 21 bits of a 32 bit constant, we assume that only
223 the low 21 bits of opnd are relevant */
224
225unsigned
226deposit_21 (opnd, word)
227 unsigned opnd, word;
228{
229 unsigned val = 0;
230
231 val |= GET_FIELD (opnd, 11 + 14, 11 + 18);
232 val <<= 2;
233 val |= GET_FIELD (opnd, 11 + 12, 11 + 13);
234 val <<= 2;
235 val |= GET_FIELD (opnd, 11 + 19, 11 + 20);
236 val <<= 11;
237 val |= GET_FIELD (opnd, 11 + 1, 11 + 11);
238 val <<= 1;
239 val |= GET_FIELD (opnd, 11 + 0, 11 + 0);
240 return word | val;
241}
242
243/* extract a 12 bit constant from branch instructions */
244
245int
246extract_12 (word)
247 unsigned word;
248{
249 return sign_extend (GET_FIELD (word, 19, 28) |
250 GET_FIELD (word, 29, 29) << 10 |
251 (word & 0x1) << 11, 12) << 2;
252}
253
254/* extract a 17 bit constant from branch instructions, returning the
255 19 bit signed value. */
256
257int
258extract_17 (word)
259 unsigned word;
260{
261 return sign_extend (GET_FIELD (word, 19, 28) |
262 GET_FIELD (word, 29, 29) << 10 |
263 GET_FIELD (word, 11, 15) << 11 |
264 (word & 0x1) << 16, 17) << 2;
265}
266\f
c5152d42
JL
267
268/* Compare the start address for two unwind entries returning 1 if
269 the first address is larger than the second, -1 if the second is
270 larger than the first, and zero if they are equal. */
271
272static int
273compare_unwind_entries (a, b)
f81eee9d
JL
274 const struct unwind_table_entry *a;
275 const struct unwind_table_entry *b;
c5152d42
JL
276{
277 if (a->region_start > b->region_start)
278 return 1;
279 else if (a->region_start < b->region_start)
280 return -1;
281 else
282 return 0;
283}
284
285static void
bfaef242 286internalize_unwinds (objfile, table, section, entries, size, text_offset)
c5152d42
JL
287 struct objfile *objfile;
288 struct unwind_table_entry *table;
289 asection *section;
290 unsigned int entries, size;
bfaef242 291 CORE_ADDR text_offset;
c5152d42
JL
292{
293 /* We will read the unwind entries into temporary memory, then
294 fill in the actual unwind table. */
295 if (size > 0)
296 {
297 unsigned long tmp;
298 unsigned i;
299 char *buf = alloca (size);
300
301 bfd_get_section_contents (objfile->obfd, section, buf, 0, size);
302
303 /* Now internalize the information being careful to handle host/target
304 endian issues. */
305 for (i = 0; i < entries; i++)
306 {
307 table[i].region_start = bfd_get_32 (objfile->obfd,
308 (bfd_byte *)buf);
bfaef242 309 table[i].region_start += text_offset;
c5152d42
JL
310 buf += 4;
311 table[i].region_end = bfd_get_32 (objfile->obfd, (bfd_byte *)buf);
bfaef242 312 table[i].region_end += text_offset;
c5152d42
JL
313 buf += 4;
314 tmp = bfd_get_32 (objfile->obfd, (bfd_byte *)buf);
315 buf += 4;
e43169eb 316 table[i].Cannot_unwind = (tmp >> 31) & 0x1;
c5152d42
JL
317 table[i].Millicode = (tmp >> 30) & 0x1;
318 table[i].Millicode_save_sr0 = (tmp >> 29) & 0x1;
319 table[i].Region_description = (tmp >> 27) & 0x3;
320 table[i].reserved1 = (tmp >> 26) & 0x1;
321 table[i].Entry_SR = (tmp >> 25) & 0x1;
322 table[i].Entry_FR = (tmp >> 21) & 0xf;
323 table[i].Entry_GR = (tmp >> 16) & 0x1f;
324 table[i].Args_stored = (tmp >> 15) & 0x1;
325 table[i].Variable_Frame = (tmp >> 14) & 0x1;
326 table[i].Separate_Package_Body = (tmp >> 13) & 0x1;
327 table[i].Frame_Extension_Millicode = (tmp >> 12 ) & 0x1;
328 table[i].Stack_Overflow_Check = (tmp >> 11) & 0x1;
329 table[i].Two_Instruction_SP_Increment = (tmp >> 10) & 0x1;
330 table[i].Ada_Region = (tmp >> 9) & 0x1;
331 table[i].reserved2 = (tmp >> 5) & 0xf;
332 table[i].Save_SP = (tmp >> 4) & 0x1;
333 table[i].Save_RP = (tmp >> 3) & 0x1;
334 table[i].Save_MRP_in_frame = (tmp >> 2) & 0x1;
335 table[i].extn_ptr_defined = (tmp >> 1) & 0x1;
336 table[i].Cleanup_defined = tmp & 0x1;
337 tmp = bfd_get_32 (objfile->obfd, (bfd_byte *)buf);
338 buf += 4;
339 table[i].MPE_XL_interrupt_marker = (tmp >> 31) & 0x1;
340 table[i].HP_UX_interrupt_marker = (tmp >> 30) & 0x1;
341 table[i].Large_frame = (tmp >> 29) & 0x1;
342 table[i].reserved4 = (tmp >> 27) & 0x3;
343 table[i].Total_frame_size = tmp & 0x7ffffff;
344 }
345 }
346}
347
348/* Read in the backtrace information stored in the `$UNWIND_START$' section of
349 the object file. This info is used mainly by find_unwind_entry() to find
350 out the stack frame size and frame pointer used by procedures. We put
351 everything on the psymbol obstack in the objfile so that it automatically
352 gets freed when the objfile is destroyed. */
353
9c842e0c 354static void
c5152d42
JL
355read_unwind_info (objfile)
356 struct objfile *objfile;
357{
358 asection *unwind_sec, *elf_unwind_sec, *stub_unwind_sec;
359 unsigned unwind_size, elf_unwind_size, stub_unwind_size, total_size;
360 unsigned index, unwind_entries, elf_unwind_entries;
361 unsigned stub_entries, total_entries;
bfaef242 362 CORE_ADDR text_offset;
c5152d42
JL
363 struct obj_unwind_info *ui;
364
bfaef242 365 text_offset = ANOFFSET (objfile->section_offsets, 0);
c5152d42
JL
366 ui = obstack_alloc (&objfile->psymbol_obstack,
367 sizeof (struct obj_unwind_info));
368
369 ui->table = NULL;
370 ui->cache = NULL;
371 ui->last = -1;
372
373 /* Get hooks to all unwind sections. Note there is no linker-stub unwind
374 section in ELF at the moment. */
375 unwind_sec = bfd_get_section_by_name (objfile->obfd, "$UNWIND_START$");
0fc27289 376 elf_unwind_sec = bfd_get_section_by_name (objfile->obfd, ".PARISC.unwind");
c5152d42
JL
377 stub_unwind_sec = bfd_get_section_by_name (objfile->obfd, "$UNWIND_END$");
378
379 /* Get sizes and unwind counts for all sections. */
380 if (unwind_sec)
381 {
382 unwind_size = bfd_section_size (objfile->obfd, unwind_sec);
383 unwind_entries = unwind_size / UNWIND_ENTRY_SIZE;
384 }
385 else
386 {
387 unwind_size = 0;
388 unwind_entries = 0;
389 }
390
391 if (elf_unwind_sec)
392 {
393 elf_unwind_size = bfd_section_size (objfile->obfd, elf_unwind_sec);
394 elf_unwind_entries = elf_unwind_size / UNWIND_ENTRY_SIZE;
395 }
f55179cb
JL
396 else
397 {
398 elf_unwind_size = 0;
399 elf_unwind_entries = 0;
400 }
c5152d42
JL
401
402 if (stub_unwind_sec)
403 {
404 stub_unwind_size = bfd_section_size (objfile->obfd, stub_unwind_sec);
405 stub_entries = stub_unwind_size / STUB_UNWIND_ENTRY_SIZE;
406 }
407 else
408 {
409 stub_unwind_size = 0;
410 stub_entries = 0;
411 }
412
413 /* Compute total number of unwind entries and their total size. */
414 total_entries = unwind_entries + elf_unwind_entries + stub_entries;
415 total_size = total_entries * sizeof (struct unwind_table_entry);
416
417 /* Allocate memory for the unwind table. */
418 ui->table = obstack_alloc (&objfile->psymbol_obstack, total_size);
419 ui->last = total_entries - 1;
420
421 /* Internalize the standard unwind entries. */
422 index = 0;
423 internalize_unwinds (objfile, &ui->table[index], unwind_sec,
bfaef242 424 unwind_entries, unwind_size, text_offset);
c5152d42
JL
425 index += unwind_entries;
426 internalize_unwinds (objfile, &ui->table[index], elf_unwind_sec,
bfaef242 427 elf_unwind_entries, elf_unwind_size, text_offset);
c5152d42
JL
428 index += elf_unwind_entries;
429
430 /* Now internalize the stub unwind entries. */
431 if (stub_unwind_size > 0)
432 {
433 unsigned int i;
434 char *buf = alloca (stub_unwind_size);
435
436 /* Read in the stub unwind entries. */
437 bfd_get_section_contents (objfile->obfd, stub_unwind_sec, buf,
438 0, stub_unwind_size);
439
440 /* Now convert them into regular unwind entries. */
441 for (i = 0; i < stub_entries; i++, index++)
442 {
443 /* Clear out the next unwind entry. */
444 memset (&ui->table[index], 0, sizeof (struct unwind_table_entry));
445
446 /* Convert offset & size into region_start and region_end.
447 Stuff away the stub type into "reserved" fields. */
448 ui->table[index].region_start = bfd_get_32 (objfile->obfd,
449 (bfd_byte *) buf);
73a25072 450 ui->table[index].region_start += text_offset;
c5152d42
JL
451 buf += 4;
452 ui->table[index].stub_type = bfd_get_8 (objfile->obfd,
453 (bfd_byte *) buf);
454 buf += 2;
455 ui->table[index].region_end
456 = ui->table[index].region_start + 4 *
457 (bfd_get_16 (objfile->obfd, (bfd_byte *) buf) - 1);
458 buf += 2;
459 }
460
461 }
462
463 /* Unwind table needs to be kept sorted. */
464 qsort (ui->table, total_entries, sizeof (struct unwind_table_entry),
465 compare_unwind_entries);
466
467 /* Keep a pointer to the unwind information. */
468 objfile->obj_private = (PTR) ui;
469}
470
66a1aa07
SG
471/* Lookup the unwind (stack backtrace) info for the given PC. We search all
472 of the objfiles seeking the unwind table entry for this PC. Each objfile
473 contains a sorted list of struct unwind_table_entry. Since we do a binary
474 search of the unwind tables, we depend upon them to be sorted. */
475
476static struct unwind_table_entry *
477find_unwind_entry(pc)
478 CORE_ADDR pc;
479{
480 int first, middle, last;
481 struct objfile *objfile;
482
483 ALL_OBJFILES (objfile)
484 {
485 struct obj_unwind_info *ui;
486
487 ui = OBJ_UNWIND_INFO (objfile);
488
489 if (!ui)
c5152d42
JL
490 {
491 read_unwind_info (objfile);
492 ui = OBJ_UNWIND_INFO (objfile);
493 }
66a1aa07
SG
494
495 /* First, check the cache */
496
497 if (ui->cache
498 && pc >= ui->cache->region_start
499 && pc <= ui->cache->region_end)
500 return ui->cache;
501
502 /* Not in the cache, do a binary search */
503
504 first = 0;
505 last = ui->last;
506
507 while (first <= last)
508 {
509 middle = (first + last) / 2;
510 if (pc >= ui->table[middle].region_start
511 && pc <= ui->table[middle].region_end)
512 {
513 ui->cache = &ui->table[middle];
514 return &ui->table[middle];
515 }
516
517 if (pc < ui->table[middle].region_start)
518 last = middle - 1;
519 else
520 first = middle + 1;
521 }
522 } /* ALL_OBJFILES() */
523 return NULL;
524}
525
98c0e047
JL
526/* Return the adjustment necessary to make for addresses on the stack
527 as presented by hpread.c.
528
529 This is necessary because of the stack direction on the PA and the
530 bizarre way in which someone (?) decided they wanted to handle
531 frame pointerless code in GDB. */
532int
533hpread_adjust_stack_address (func_addr)
534 CORE_ADDR func_addr;
535{
536 struct unwind_table_entry *u;
537
538 u = find_unwind_entry (func_addr);
539 if (!u)
540 return 0;
541 else
542 return u->Total_frame_size << 3;
543}
98c0e047 544
70e43abe
JL
545/* Called to determine if PC is in an interrupt handler of some
546 kind. */
547
548static int
549pc_in_interrupt_handler (pc)
550 CORE_ADDR pc;
551{
552 struct unwind_table_entry *u;
553 struct minimal_symbol *msym_us;
554
555 u = find_unwind_entry (pc);
556 if (!u)
557 return 0;
558
559 /* Oh joys. HPUX sets the interrupt bit for _sigreturn even though
560 its frame isn't a pure interrupt frame. Deal with this. */
561 msym_us = lookup_minimal_symbol_by_pc (pc);
562
563 return u->HP_UX_interrupt_marker && !IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us));
564}
565
5ac7f56e
JK
566/* Called when no unwind descriptor was found for PC. Returns 1 if it
567 appears that PC is in a linker stub. */
5ac7f56e
JK
568
569static int
570pc_in_linker_stub (pc)
571 CORE_ADDR pc;
572{
5ac7f56e
JK
573 int found_magic_instruction = 0;
574 int i;
08ecd8f3
JK
575 char buf[4];
576
577 /* If unable to read memory, assume pc is not in a linker stub. */
578 if (target_read_memory (pc, buf, 4) != 0)
579 return 0;
5ac7f56e 580
d08c6f4c
JK
581 /* We are looking for something like
582
583 ; $$dyncall jams RP into this special spot in the frame (RP')
584 ; before calling the "call stub"
585 ldw -18(sp),rp
586
587 ldsid (rp),r1 ; Get space associated with RP into r1
588 mtsp r1,sp ; Move it into space register 0
589 be,n 0(sr0),rp) ; back to your regularly scheduled program
590 */
591
5ac7f56e
JK
592 /* Maximum known linker stub size is 4 instructions. Search forward
593 from the given PC, then backward. */
594 for (i = 0; i < 4; i++)
595 {
6e35b037 596 /* If we hit something with an unwind, stop searching this direction. */
5ac7f56e
JK
597
598 if (find_unwind_entry (pc + i * 4) != 0)
599 break;
600
601 /* Check for ldsid (rp),r1 which is the magic instruction for a
602 return from a cross-space function call. */
603 if (read_memory_integer (pc + i * 4, 4) == 0x004010a1)
604 {
605 found_magic_instruction = 1;
606 break;
607 }
608 /* Add code to handle long call/branch and argument relocation stubs
609 here. */
610 }
611
612 if (found_magic_instruction != 0)
613 return 1;
614
615 /* Now look backward. */
616 for (i = 0; i < 4; i++)
617 {
6e35b037 618 /* If we hit something with an unwind, stop searching this direction. */
5ac7f56e
JK
619
620 if (find_unwind_entry (pc - i * 4) != 0)
621 break;
622
623 /* Check for ldsid (rp),r1 which is the magic instruction for a
624 return from a cross-space function call. */
625 if (read_memory_integer (pc - i * 4, 4) == 0x004010a1)
626 {
627 found_magic_instruction = 1;
628 break;
629 }
630 /* Add code to handle long call/branch and argument relocation stubs
631 here. */
632 }
633 return found_magic_instruction;
634}
635
66a1aa07
SG
636static int
637find_return_regnum(pc)
638 CORE_ADDR pc;
639{
640 struct unwind_table_entry *u;
641
642 u = find_unwind_entry (pc);
643
644 if (!u)
645 return RP_REGNUM;
646
647 if (u->Millicode)
648 return 31;
649
650 return RP_REGNUM;
651}
652
5ac7f56e 653/* Return size of frame, or -1 if we should use a frame pointer. */
66a1aa07 654int
70e43abe 655find_proc_framesize (pc)
66a1aa07
SG
656 CORE_ADDR pc;
657{
658 struct unwind_table_entry *u;
70e43abe 659 struct minimal_symbol *msym_us;
66a1aa07 660
66a1aa07
SG
661 u = find_unwind_entry (pc);
662
663 if (!u)
5ac7f56e
JK
664 {
665 if (pc_in_linker_stub (pc))
666 /* Linker stubs have a zero size frame. */
667 return 0;
668 else
669 return -1;
670 }
66a1aa07 671
70e43abe
JL
672 msym_us = lookup_minimal_symbol_by_pc (pc);
673
674 /* If Save_SP is set, and we're not in an interrupt or signal caller,
675 then we have a frame pointer. Use it. */
676 if (u->Save_SP && !pc_in_interrupt_handler (pc)
677 && !IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us)))
eabbe766
JK
678 return -1;
679
66a1aa07
SG
680 return u->Total_frame_size << 3;
681}
682
5ac7f56e
JK
683/* Return offset from sp at which rp is saved, or 0 if not saved. */
684static int rp_saved PARAMS ((CORE_ADDR));
685
686static int
687rp_saved (pc)
688 CORE_ADDR pc;
66a1aa07
SG
689{
690 struct unwind_table_entry *u;
691
692 u = find_unwind_entry (pc);
693
694 if (!u)
5ac7f56e
JK
695 {
696 if (pc_in_linker_stub (pc))
697 /* This is the so-called RP'. */
698 return -24;
699 else
700 return 0;
701 }
66a1aa07
SG
702
703 if (u->Save_RP)
5ac7f56e 704 return -20;
c7f3b703
JL
705 else if (u->stub_type != 0)
706 {
707 switch (u->stub_type)
708 {
709 case EXPORT:
c2e00af6 710 case IMPORT:
c7f3b703
JL
711 return -24;
712 case PARAMETER_RELOCATION:
713 return -8;
714 default:
715 return 0;
716 }
717 }
66a1aa07
SG
718 else
719 return 0;
720}
721\f
8fa74880
SG
722int
723frameless_function_invocation (frame)
669caa9c 724 struct frame_info *frame;
8fa74880 725{
b8ec9a79 726 struct unwind_table_entry *u;
8fa74880 727
b8ec9a79 728 u = find_unwind_entry (frame->pc);
8fa74880 729
b8ec9a79 730 if (u == 0)
7f43b9b7 731 return 0;
b8ec9a79 732
c7f3b703 733 return (u->Total_frame_size == 0 && u->stub_type == 0);
8fa74880
SG
734}
735
66a1aa07
SG
736CORE_ADDR
737saved_pc_after_call (frame)
669caa9c 738 struct frame_info *frame;
66a1aa07
SG
739{
740 int ret_regnum;
edd86fb0
JL
741 CORE_ADDR pc;
742 struct unwind_table_entry *u;
66a1aa07
SG
743
744 ret_regnum = find_return_regnum (get_frame_pc (frame));
edd86fb0
JL
745 pc = read_register (ret_regnum) & ~0x3;
746
747 /* If PC is in a linker stub, then we need to dig the address
748 the stub will return to out of the stack. */
749 u = find_unwind_entry (pc);
750 if (u && u->stub_type != 0)
751 return frame_saved_pc (frame);
752 else
753 return pc;
66a1aa07
SG
754}
755\f
756CORE_ADDR
757frame_saved_pc (frame)
669caa9c 758 struct frame_info *frame;
66a1aa07
SG
759{
760 CORE_ADDR pc = get_frame_pc (frame);
7f43b9b7 761 struct unwind_table_entry *u;
66a1aa07 762
70e43abe
JL
763 /* BSD, HPUX & OSF1 all lay out the hardware state in the same manner
764 at the base of the frame in an interrupt handler. Registers within
765 are saved in the exact same order as GDB numbers registers. How
766 convienent. */
767 if (pc_in_interrupt_handler (pc))
768 return read_memory_integer (frame->frame + PC_REGNUM * 4, 4) & ~0x3;
769
770 /* Deal with signal handler caller frames too. */
771 if (frame->signal_handler_caller)
772 {
773 CORE_ADDR rp;
774 FRAME_SAVED_PC_IN_SIGTRAMP (frame, &rp);
54b2555b 775 return rp & ~0x3;
70e43abe
JL
776 }
777
8fa74880 778 if (frameless_function_invocation (frame))
66a1aa07
SG
779 {
780 int ret_regnum;
781
782 ret_regnum = find_return_regnum (pc);
783
70e43abe
JL
784 /* If the next frame is an interrupt frame or a signal
785 handler caller, then we need to look in the saved
786 register area to get the return pointer (the values
787 in the registers may not correspond to anything useful). */
788 if (frame->next
789 && (frame->next->signal_handler_caller
790 || pc_in_interrupt_handler (frame->next->pc)))
791 {
70e43abe
JL
792 struct frame_saved_regs saved_regs;
793
54b2555b 794 get_frame_saved_regs (frame->next, &saved_regs);
471fb8d8 795 if (read_memory_integer (saved_regs.regs[FLAGS_REGNUM], 4) & 0x2)
54b2555b
JL
796 {
797 pc = read_memory_integer (saved_regs.regs[31], 4) & ~0x3;
798
799 /* Syscalls are really two frames. The syscall stub itself
800 with a return pointer in %rp and the kernel call with
801 a return pointer in %r31. We return the %rp variant
802 if %r31 is the same as frame->pc. */
803 if (pc == frame->pc)
804 pc = read_memory_integer (saved_regs.regs[RP_REGNUM], 4) & ~0x3;
805 }
70e43abe 806 else
7f43b9b7 807 pc = read_memory_integer (saved_regs.regs[RP_REGNUM], 4) & ~0x3;
70e43abe
JL
808 }
809 else
7f43b9b7 810 pc = read_register (ret_regnum) & ~0x3;
66a1aa07 811 }
66a1aa07 812 else
5ac7f56e 813 {
edd86fb0 814 int rp_offset;
5ac7f56e 815
edd86fb0
JL
816restart:
817 rp_offset = rp_saved (pc);
70e43abe
JL
818 /* Similar to code in frameless function case. If the next
819 frame is a signal or interrupt handler, then dig the right
820 information out of the saved register info. */
821 if (rp_offset == 0
822 && frame->next
823 && (frame->next->signal_handler_caller
824 || pc_in_interrupt_handler (frame->next->pc)))
825 {
70e43abe
JL
826 struct frame_saved_regs saved_regs;
827
669caa9c 828 get_frame_saved_regs (frame->next, &saved_regs);
471fb8d8 829 if (read_memory_integer (saved_regs.regs[FLAGS_REGNUM], 4) & 0x2)
54b2555b
JL
830 {
831 pc = read_memory_integer (saved_regs.regs[31], 4) & ~0x3;
832
833 /* Syscalls are really two frames. The syscall stub itself
834 with a return pointer in %rp and the kernel call with
835 a return pointer in %r31. We return the %rp variant
836 if %r31 is the same as frame->pc. */
837 if (pc == frame->pc)
838 pc = read_memory_integer (saved_regs.regs[RP_REGNUM], 4) & ~0x3;
839 }
70e43abe 840 else
7f43b9b7 841 pc = read_memory_integer (saved_regs.regs[RP_REGNUM], 4) & ~0x3;
70e43abe
JL
842 }
843 else if (rp_offset == 0)
7f43b9b7 844 pc = read_register (RP_REGNUM) & ~0x3;
5ac7f56e 845 else
7f43b9b7 846 pc = read_memory_integer (frame->frame + rp_offset, 4) & ~0x3;
5ac7f56e 847 }
7f43b9b7
JL
848
849 /* If PC is inside a linker stub, then dig out the address the stub
850 will return to. */
851 u = find_unwind_entry (pc);
852 if (u && u->stub_type != 0)
853 goto restart;
854
855 return pc;
66a1aa07
SG
856}
857\f
858/* We need to correct the PC and the FP for the outermost frame when we are
859 in a system call. */
860
861void
862init_extra_frame_info (fromleaf, frame)
863 int fromleaf;
864 struct frame_info *frame;
865{
866 int flags;
867 int framesize;
868
192c3eeb 869 if (frame->next && !fromleaf)
66a1aa07
SG
870 return;
871
192c3eeb
JL
872 /* If the next frame represents a frameless function invocation
873 then we have to do some adjustments that are normally done by
874 FRAME_CHAIN. (FRAME_CHAIN is not called in this case.) */
875 if (fromleaf)
876 {
877 /* Find the framesize of *this* frame without peeking at the PC
878 in the current frame structure (it isn't set yet). */
879 framesize = find_proc_framesize (FRAME_SAVED_PC (get_next_frame (frame)));
880
881 /* Now adjust our base frame accordingly. If we have a frame pointer
882 use it, else subtract the size of this frame from the current
883 frame. (we always want frame->frame to point at the lowest address
884 in the frame). */
885 if (framesize == -1)
886 frame->frame = read_register (FP_REGNUM);
887 else
888 frame->frame -= framesize;
889 return;
890 }
891
66a1aa07
SG
892 flags = read_register (FLAGS_REGNUM);
893 if (flags & 2) /* In system call? */
894 frame->pc = read_register (31) & ~0x3;
895
192c3eeb
JL
896 /* The outermost frame is always derived from PC-framesize
897
898 One might think frameless innermost frames should have
899 a frame->frame that is the same as the parent's frame->frame.
900 That is wrong; frame->frame in that case should be the *high*
901 address of the parent's frame. It's complicated as hell to
902 explain, but the parent *always* creates some stack space for
903 the child. So the child actually does have a frame of some
904 sorts, and its base is the high address in its parent's frame. */
66a1aa07
SG
905 framesize = find_proc_framesize(frame->pc);
906 if (framesize == -1)
907 frame->frame = read_register (FP_REGNUM);
908 else
909 frame->frame = read_register (SP_REGNUM) - framesize;
66a1aa07
SG
910}
911\f
8966221d
JK
912/* Given a GDB frame, determine the address of the calling function's frame.
913 This will be used to create a new GDB frame struct, and then
914 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
915
916 This may involve searching through prologues for several functions
917 at boundaries where GCC calls HP C code, or where code which has
918 a frame pointer calls code without a frame pointer. */
8966221d 919
669caa9c 920CORE_ADDR
66a1aa07
SG
921frame_chain (frame)
922 struct frame_info *frame;
923{
8966221d
JK
924 int my_framesize, caller_framesize;
925 struct unwind_table_entry *u;
70e43abe
JL
926 CORE_ADDR frame_base;
927
928 /* Handle HPUX, BSD, and OSF1 style interrupt frames first. These
929 are easy; at *sp we have a full save state strucutre which we can
930 pull the old stack pointer from. Also see frame_saved_pc for
931 code to dig a saved PC out of the save state structure. */
932 if (pc_in_interrupt_handler (frame->pc))
933 frame_base = read_memory_integer (frame->frame + SP_REGNUM * 4, 4);
934 else if (frame->signal_handler_caller)
935 {
936 FRAME_BASE_BEFORE_SIGTRAMP (frame, &frame_base);
937 }
938 else
939 frame_base = frame->frame;
66a1aa07 940
8966221d
JK
941 /* Get frame sizes for the current frame and the frame of the
942 caller. */
943 my_framesize = find_proc_framesize (frame->pc);
944 caller_framesize = find_proc_framesize (FRAME_SAVED_PC(frame));
66a1aa07 945
8966221d
JK
946 /* If caller does not have a frame pointer, then its frame
947 can be found at current_frame - caller_framesize. */
948 if (caller_framesize != -1)
70e43abe 949 return frame_base - caller_framesize;
8966221d
JK
950
951 /* Both caller and callee have frame pointers and are GCC compiled
952 (SAVE_SP bit in unwind descriptor is on for both functions.
953 The previous frame pointer is found at the top of the current frame. */
954 if (caller_framesize == -1 && my_framesize == -1)
70e43abe 955 return read_memory_integer (frame_base, 4);
8966221d
JK
956
957 /* Caller has a frame pointer, but callee does not. This is a little
958 more difficult as GCC and HP C lay out locals and callee register save
959 areas very differently.
960
961 The previous frame pointer could be in a register, or in one of
962 several areas on the stack.
963
964 Walk from the current frame to the innermost frame examining
2f8c3639 965 unwind descriptors to determine if %r3 ever gets saved into the
8966221d 966 stack. If so return whatever value got saved into the stack.
2f8c3639 967 If it was never saved in the stack, then the value in %r3 is still
8966221d
JK
968 valid, so use it.
969
2f8c3639 970 We use information from unwind descriptors to determine if %r3
8966221d
JK
971 is saved into the stack (Entry_GR field has this information). */
972
973 while (frame)
974 {
975 u = find_unwind_entry (frame->pc);
976
977 if (!u)
978 {
01a03545
JK
979 /* We could find this information by examining prologues. I don't
980 think anyone has actually written any tools (not even "strip")
981 which leave them out of an executable, so maybe this is a moot
982 point. */
8966221d
JK
983 warning ("Unable to find unwind for PC 0x%x -- Help!", frame->pc);
984 return 0;
985 }
986
987 /* Entry_GR specifies the number of callee-saved general registers
2f8c3639 988 saved in the stack. It starts at %r3, so %r3 would be 1. */
70e43abe
JL
989 if (u->Entry_GR >= 1 || u->Save_SP
990 || frame->signal_handler_caller
991 || pc_in_interrupt_handler (frame->pc))
8966221d
JK
992 break;
993 else
994 frame = frame->next;
995 }
996
997 if (frame)
998 {
999 /* We may have walked down the chain into a function with a frame
1000 pointer. */
70e43abe
JL
1001 if (u->Save_SP
1002 && !frame->signal_handler_caller
1003 && !pc_in_interrupt_handler (frame->pc))
8966221d 1004 return read_memory_integer (frame->frame, 4);
2f8c3639 1005 /* %r3 was saved somewhere in the stack. Dig it out. */
8966221d 1006 else
c598654a 1007 {
c598654a
JL
1008 struct frame_saved_regs saved_regs;
1009
669caa9c 1010 get_frame_saved_regs (frame, &saved_regs);
c598654a
JL
1011 return read_memory_integer (saved_regs.regs[FP_REGNUM], 4);
1012 }
8966221d
JK
1013 }
1014 else
1015 {
2f8c3639 1016 /* The value in %r3 was never saved into the stack (thus %r3 still
8966221d 1017 holds the value of the previous frame pointer). */
2f8c3639 1018 return read_register (FP_REGNUM);
8966221d
JK
1019 }
1020}
66a1aa07 1021
66a1aa07
SG
1022\f
1023/* To see if a frame chain is valid, see if the caller looks like it
1024 was compiled with gcc. */
1025
1026int
1027frame_chain_valid (chain, thisframe)
669caa9c
SS
1028 CORE_ADDR chain;
1029 struct frame_info *thisframe;
66a1aa07 1030{
247145e6
JK
1031 struct minimal_symbol *msym_us;
1032 struct minimal_symbol *msym_start;
70e43abe 1033 struct unwind_table_entry *u, *next_u = NULL;
669caa9c 1034 struct frame_info *next;
66a1aa07
SG
1035
1036 if (!chain)
1037 return 0;
1038
b8ec9a79 1039 u = find_unwind_entry (thisframe->pc);
4b01383b 1040
70e43abe
JL
1041 if (u == NULL)
1042 return 1;
1043
247145e6
JK
1044 /* We can't just check that the same of msym_us is "_start", because
1045 someone idiotically decided that they were going to make a Ltext_end
1046 symbol with the same address. This Ltext_end symbol is totally
1047 indistinguishable (as nearly as I can tell) from the symbol for a function
1048 which is (legitimately, since it is in the user's namespace)
1049 named Ltext_end, so we can't just ignore it. */
1050 msym_us = lookup_minimal_symbol_by_pc (FRAME_SAVED_PC (thisframe));
1051 msym_start = lookup_minimal_symbol ("_start", NULL);
1052 if (msym_us
1053 && msym_start
1054 && SYMBOL_VALUE_ADDRESS (msym_us) == SYMBOL_VALUE_ADDRESS (msym_start))
b8ec9a79 1055 return 0;
5ac7f56e 1056
70e43abe
JL
1057 next = get_next_frame (thisframe);
1058 if (next)
1059 next_u = find_unwind_entry (next->pc);
5ac7f56e 1060
70e43abe
JL
1061 /* If this frame does not save SP, has no stack, isn't a stub,
1062 and doesn't "call" an interrupt routine or signal handler caller,
1063 then its not valid. */
1064 if (u->Save_SP || u->Total_frame_size || u->stub_type != 0
1065 || (thisframe->next && thisframe->next->signal_handler_caller)
1066 || (next_u && next_u->HP_UX_interrupt_marker))
b8ec9a79 1067 return 1;
5ac7f56e 1068
b8ec9a79
JK
1069 if (pc_in_linker_stub (thisframe->pc))
1070 return 1;
4b01383b 1071
b8ec9a79 1072 return 0;
66a1aa07
SG
1073}
1074
66a1aa07
SG
1075/*
1076 * These functions deal with saving and restoring register state
1077 * around a function call in the inferior. They keep the stack
1078 * double-word aligned; eventually, on an hp700, the stack will have
1079 * to be aligned to a 64-byte boundary.
1080 */
1081
e43169eb
JL
1082void
1083push_dummy_frame (inf_status)
1084 struct inferior_status *inf_status;
66a1aa07 1085{
e43169eb 1086 CORE_ADDR sp, pc, pcspace;
66a1aa07
SG
1087 register int regnum;
1088 int int_buffer;
1089 double freg_buffer;
1090
e43169eb
JL
1091 /* Oh, what a hack. If we're trying to perform an inferior call
1092 while the inferior is asleep, we have to make sure to clear
1093 the "in system call" bit in the flag register (the call will
1094 start after the syscall returns, so we're no longer in the system
1095 call!) This state is kept in "inf_status", change it there.
1096
1097 We also need a number of horrid hacks to deal with lossage in the
1098 PC queue registers (apparently they're not valid when the in syscall
1099 bit is set). */
1100 pc = target_read_pc (inferior_pid);
1101 int_buffer = read_register (FLAGS_REGNUM);
1102 if (int_buffer & 0x2)
1103 {
1104 int_buffer &= ~0x2;
1105 memcpy (inf_status->registers, &int_buffer, 4);
1106 memcpy (inf_status->registers + REGISTER_BYTE (PCOQ_HEAD_REGNUM), &pc, 4);
1107 pc += 4;
1108 memcpy (inf_status->registers + REGISTER_BYTE (PCOQ_TAIL_REGNUM), &pc, 4);
1109 pc -= 4;
1110 pcspace = read_register (SR4_REGNUM);
1111 memcpy (inf_status->registers + REGISTER_BYTE (PCSQ_HEAD_REGNUM),
1112 &pcspace, 4);
1113 memcpy (inf_status->registers + REGISTER_BYTE (PCSQ_TAIL_REGNUM),
1114 &pcspace, 4);
1115 }
1116 else
1117 pcspace = read_register (PCSQ_HEAD_REGNUM);
1118
66a1aa07
SG
1119 /* Space for "arguments"; the RP goes in here. */
1120 sp = read_register (SP_REGNUM) + 48;
1121 int_buffer = read_register (RP_REGNUM) | 0x3;
1122 write_memory (sp - 20, (char *)&int_buffer, 4);
1123
1124 int_buffer = read_register (FP_REGNUM);
1125 write_memory (sp, (char *)&int_buffer, 4);
1126
1127 write_register (FP_REGNUM, sp);
1128
1129 sp += 8;
1130
1131 for (regnum = 1; regnum < 32; regnum++)
1132 if (regnum != RP_REGNUM && regnum != FP_REGNUM)
1133 sp = push_word (sp, read_register (regnum));
1134
1135 sp += 4;
1136
1137 for (regnum = FP0_REGNUM; regnum < NUM_REGS; regnum++)
1138 {
1139 read_register_bytes (REGISTER_BYTE (regnum), (char *)&freg_buffer, 8);
1140 sp = push_bytes (sp, (char *)&freg_buffer, 8);
1141 }
1142 sp = push_word (sp, read_register (IPSW_REGNUM));
1143 sp = push_word (sp, read_register (SAR_REGNUM));
e43169eb
JL
1144 sp = push_word (sp, pc);
1145 sp = push_word (sp, pcspace);
1146 sp = push_word (sp, pc + 4);
1147 sp = push_word (sp, pcspace);
66a1aa07
SG
1148 write_register (SP_REGNUM, sp);
1149}
1150
e43169eb 1151void
66a1aa07
SG
1152find_dummy_frame_regs (frame, frame_saved_regs)
1153 struct frame_info *frame;
1154 struct frame_saved_regs *frame_saved_regs;
1155{
1156 CORE_ADDR fp = frame->frame;
1157 int i;
1158
1159 frame_saved_regs->regs[RP_REGNUM] = fp - 20 & ~0x3;
1160 frame_saved_regs->regs[FP_REGNUM] = fp;
1161 frame_saved_regs->regs[1] = fp + 8;
66a1aa07 1162
b227992a
SG
1163 for (fp += 12, i = 3; i < 32; i++)
1164 {
1165 if (i != FP_REGNUM)
1166 {
1167 frame_saved_regs->regs[i] = fp;
1168 fp += 4;
1169 }
1170 }
66a1aa07
SG
1171
1172 fp += 4;
1173 for (i = FP0_REGNUM; i < NUM_REGS; i++, fp += 8)
1174 frame_saved_regs->regs[i] = fp;
1175
1176 frame_saved_regs->regs[IPSW_REGNUM] = fp;
b227992a
SG
1177 frame_saved_regs->regs[SAR_REGNUM] = fp + 4;
1178 frame_saved_regs->regs[PCOQ_HEAD_REGNUM] = fp + 8;
1179 frame_saved_regs->regs[PCSQ_HEAD_REGNUM] = fp + 12;
1180 frame_saved_regs->regs[PCOQ_TAIL_REGNUM] = fp + 16;
1181 frame_saved_regs->regs[PCSQ_TAIL_REGNUM] = fp + 20;
66a1aa07
SG
1182}
1183
e43169eb 1184void
66a1aa07
SG
1185hppa_pop_frame ()
1186{
669caa9c 1187 register struct frame_info *frame = get_current_frame ();
54576db3 1188 register CORE_ADDR fp, npc, target_pc;
66a1aa07
SG
1189 register int regnum;
1190 struct frame_saved_regs fsr;
66a1aa07
SG
1191 double freg_buffer;
1192
669caa9c
SS
1193 fp = FRAME_FP (frame);
1194 get_frame_saved_regs (frame, &fsr);
66a1aa07 1195
0a64709e 1196#ifndef NO_PC_SPACE_QUEUE_RESTORE
66a1aa07
SG
1197 if (fsr.regs[IPSW_REGNUM]) /* Restoring a call dummy frame */
1198 restore_pc_queue (&fsr);
0a64709e 1199#endif
66a1aa07
SG
1200
1201 for (regnum = 31; regnum > 0; regnum--)
1202 if (fsr.regs[regnum])
1203 write_register (regnum, read_memory_integer (fsr.regs[regnum], 4));
1204
1205 for (regnum = NUM_REGS - 1; regnum >= FP0_REGNUM ; regnum--)
1206 if (fsr.regs[regnum])
1207 {
1208 read_memory (fsr.regs[regnum], (char *)&freg_buffer, 8);
1209 write_register_bytes (REGISTER_BYTE (regnum), (char *)&freg_buffer, 8);
1210 }
1211
1212 if (fsr.regs[IPSW_REGNUM])
1213 write_register (IPSW_REGNUM,
1214 read_memory_integer (fsr.regs[IPSW_REGNUM], 4));
1215
1216 if (fsr.regs[SAR_REGNUM])
1217 write_register (SAR_REGNUM,
1218 read_memory_integer (fsr.regs[SAR_REGNUM], 4));
1219
ed1a07ad 1220 /* If the PC was explicitly saved, then just restore it. */
66a1aa07 1221 if (fsr.regs[PCOQ_TAIL_REGNUM])
54576db3
JL
1222 {
1223 npc = read_memory_integer (fsr.regs[PCOQ_TAIL_REGNUM], 4);
1224 write_register (PCOQ_TAIL_REGNUM, npc);
1225 }
ed1a07ad
JK
1226 /* Else use the value in %rp to set the new PC. */
1227 else
54576db3
JL
1228 {
1229 npc = read_register (RP_REGNUM);
1230 target_write_pc (npc, 0);
1231 }
ed1a07ad 1232
66a1aa07
SG
1233 write_register (FP_REGNUM, read_memory_integer (fp, 4));
1234
1235 if (fsr.regs[IPSW_REGNUM]) /* call dummy */
1236 write_register (SP_REGNUM, fp - 48);
1237 else
1238 write_register (SP_REGNUM, fp);
1239
54576db3
JL
1240 /* The PC we just restored may be inside a return trampoline. If so
1241 we want to restart the inferior and run it through the trampoline.
1242
1243 Do this by setting a momentary breakpoint at the location the
1244 trampoline returns to. */
1245 target_pc = SKIP_TRAMPOLINE_CODE (npc & ~0x3) & ~0x3;
1246 if (target_pc)
1247 {
1248 struct symtab_and_line sal;
1249 struct breakpoint *breakpoint;
1250 struct cleanup *old_chain;
1251
1252 /* Set up our breakpoint. Set it to be silent as the MI code
1253 for "return_command" will print the frame we returned to. */
1254 sal = find_pc_line (target_pc, 0);
1255 sal.pc = target_pc;
1256 breakpoint = set_momentary_breakpoint (sal, NULL, bp_finish);
1257 breakpoint->silent = 1;
1258
1259 /* So we can clean things up. */
1260 old_chain = make_cleanup (delete_breakpoint, breakpoint);
1261
1262 /* Start up the inferior. */
1263 proceed_to_finish = 1;
1264 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
1265
1266 /* Perform our cleanups. */
1267 do_cleanups (old_chain);
1268 }
66a1aa07 1269 flush_cached_frames ();
66a1aa07
SG
1270}
1271
1272/*
1273 * After returning to a dummy on the stack, restore the instruction
1274 * queue space registers. */
1275
1276static int
1277restore_pc_queue (fsr)
1278 struct frame_saved_regs *fsr;
1279{
1280 CORE_ADDR pc = read_pc ();
1281 CORE_ADDR new_pc = read_memory_integer (fsr->regs[PCOQ_HEAD_REGNUM], 4);
67ac9759 1282 struct target_waitstatus w;
66a1aa07
SG
1283 int insn_count;
1284
1285 /* Advance past break instruction in the call dummy. */
1286 write_register (PCOQ_HEAD_REGNUM, pc + 4);
1287 write_register (PCOQ_TAIL_REGNUM, pc + 8);
1288
1289 /*
1290 * HPUX doesn't let us set the space registers or the space
1291 * registers of the PC queue through ptrace. Boo, hiss.
1292 * Conveniently, the call dummy has this sequence of instructions
1293 * after the break:
1294 * mtsp r21, sr0
1295 * ble,n 0(sr0, r22)
1296 *
1297 * So, load up the registers and single step until we are in the
1298 * right place.
1299 */
1300
1301 write_register (21, read_memory_integer (fsr->regs[PCSQ_HEAD_REGNUM], 4));
1302 write_register (22, new_pc);
1303
1304 for (insn_count = 0; insn_count < 3; insn_count++)
1305 {
8c5e0021
JK
1306 /* FIXME: What if the inferior gets a signal right now? Want to
1307 merge this into wait_for_inferior (as a special kind of
1308 watchpoint? By setting a breakpoint at the end? Is there
1309 any other choice? Is there *any* way to do this stuff with
1310 ptrace() or some equivalent?). */
66a1aa07 1311 resume (1, 0);
67ac9759 1312 target_wait (inferior_pid, &w);
66a1aa07 1313
67ac9759 1314 if (w.kind == TARGET_WAITKIND_SIGNALLED)
66a1aa07 1315 {
67ac9759 1316 stop_signal = w.value.sig;
66a1aa07 1317 terminal_ours_for_output ();
67ac9759
JK
1318 printf_unfiltered ("\nProgram terminated with signal %s, %s.\n",
1319 target_signal_to_name (stop_signal),
1320 target_signal_to_string (stop_signal));
199b2450 1321 gdb_flush (gdb_stdout);
66a1aa07
SG
1322 return 0;
1323 }
1324 }
8c5e0021 1325 target_terminal_ours ();
cad1498f 1326 target_fetch_registers (-1);
66a1aa07
SG
1327 return 1;
1328}
1329
1330CORE_ADDR
1331hppa_push_arguments (nargs, args, sp, struct_return, struct_addr)
1332 int nargs;
4fd5eed4 1333 value_ptr *args;
66a1aa07
SG
1334 CORE_ADDR sp;
1335 int struct_return;
1336 CORE_ADDR struct_addr;
1337{
1338 /* array of arguments' offsets */
1edc5cd2 1339 int *offset = (int *)alloca(nargs * sizeof (int));
66a1aa07
SG
1340 int cum = 0;
1341 int i, alignment;
1342
1343 for (i = 0; i < nargs; i++)
1344 {
1345 /* Coerce chars to int & float to double if necessary */
1346 args[i] = value_arg_coerce (args[i]);
1347
1348 cum += TYPE_LENGTH (VALUE_TYPE (args[i]));
1349
1350 /* value must go at proper alignment. Assume alignment is a
1351 power of two.*/
1352 alignment = hppa_alignof (VALUE_TYPE (args[i]));
1353 if (cum % alignment)
1354 cum = (cum + alignment) & -alignment;
1355 offset[i] = -cum;
1356 }
558f4183 1357 sp += max ((cum + 7) & -8, 16);
66a1aa07
SG
1358
1359 for (i = 0; i < nargs; i++)
1360 write_memory (sp + offset[i], VALUE_CONTENTS (args[i]),
1361 TYPE_LENGTH (VALUE_TYPE (args[i])));
1362
1363 if (struct_return)
1364 write_register (28, struct_addr);
1365 return sp + 32;
1366}
1367
1368/*
1369 * Insert the specified number of args and function address
1370 * into a call sequence of the above form stored at DUMMYNAME.
1371 *
1372 * On the hppa we need to call the stack dummy through $$dyncall.
1373 * Therefore our version of FIX_CALL_DUMMY takes an extra argument,
1374 * real_pc, which is the location where gdb should start up the
1375 * inferior to do the function call.
1376 */
1377
1378CORE_ADDR
1379hppa_fix_call_dummy (dummy, pc, fun, nargs, args, type, gcc_p)
f4f0d174 1380 char *dummy;
66a1aa07
SG
1381 CORE_ADDR pc;
1382 CORE_ADDR fun;
1383 int nargs;
4fd5eed4 1384 value_ptr *args;
66a1aa07
SG
1385 struct type *type;
1386 int gcc_p;
1387{
1388 CORE_ADDR dyncall_addr, sr4export_addr;
1389 struct minimal_symbol *msymbol;
6cfec929 1390 int flags = read_register (FLAGS_REGNUM);
19cd0c1f 1391 struct unwind_table_entry *u;
66a1aa07
SG
1392
1393 msymbol = lookup_minimal_symbol ("$$dyncall", (struct objfile *) NULL);
1394 if (msymbol == NULL)
1395 error ("Can't find an address for $$dyncall trampoline");
1396
1397 dyncall_addr = SYMBOL_VALUE_ADDRESS (msymbol);
1398
4f915914
JL
1399 /* FUN could be a procedure label, in which case we have to get
1400 its real address and the value of its GOT/DP. */
1401 if (fun & 0x2)
1402 {
1403 /* Get the GOT/DP value for the target function. It's
1404 at *(fun+4). Note the call dummy is *NOT* allowed to
1405 trash %r19 before calling the target function. */
1406 write_register (19, read_memory_integer ((fun & ~0x3) + 4, 4));
1407
1408 /* Now get the real address for the function we are calling, it's
1409 at *fun. */
1410 fun = (CORE_ADDR) read_memory_integer (fun & ~0x3, 4);
1411 }
b1bbe38b
JL
1412 else
1413 {
1414
1415 /* FUN could be either an export stub, or the real address of a
1416 function in a shared library.
1417
1418 To call this function we need to get the GOT/DP value for the target
1419 function. Do this by calling shared library support routines in
1420 somsolib.c. Once the GOT value is in %r19 we can call the procedure
1421 in the normal fashion. */
1422
bd2b724a 1423#ifndef GDB_TARGET_IS_PA_ELF
b1bbe38b 1424 write_register (19, som_solib_get_got_by_pc (fun));
bd2b724a 1425#endif
b1bbe38b 1426 }
4f915914 1427
19cd0c1f
JL
1428 /* If we are calling an import stub (eg calling into a dynamic library)
1429 then have sr4export call the magic __d_plt_call routine which is linked
1430 in from end.o. (You can't use _sr4export to call the import stub as
1431 the value in sp-24 will get fried and you end up returning to the
1432 wrong location. You can't call the import stub directly as the code
1433 to bind the PLT entry to a function can't return to a stack address.) */
1434 u = find_unwind_entry (fun);
1435 if (u && u->stub_type == IMPORT)
1436 {
1437 CORE_ADDR new_fun;
1438 msymbol = lookup_minimal_symbol ("__d_plt_call", (struct objfile *) NULL);
1439 if (msymbol == NULL)
1440 error ("Can't find an address for __d_plt_call trampoline");
1441
1442 /* This is where sr4export will jump to. */
1443 new_fun = SYMBOL_VALUE_ADDRESS (msymbol);
1444
1445 /* We have to store the address of the stub in __shlib_funcptr. */
1446 msymbol = lookup_minimal_symbol ("__shlib_funcptr",
1447 (struct objfile *)NULL);
1448 if (msymbol == NULL)
1449 error ("Can't find an address for __shlib_funcptr");
1450
1451 target_write_memory (SYMBOL_VALUE_ADDRESS (msymbol), (char *)&fun, 4);
1452 fun = new_fun;
1453
1454 }
1455
1456 /* We still need sr4export's address too. */
66a1aa07
SG
1457 msymbol = lookup_minimal_symbol ("_sr4export", (struct objfile *) NULL);
1458 if (msymbol == NULL)
1459 error ("Can't find an address for _sr4export trampoline");
1460
1461 sr4export_addr = SYMBOL_VALUE_ADDRESS (msymbol);
1462
f4f0d174
JK
1463 store_unsigned_integer
1464 (&dummy[9*REGISTER_SIZE],
1465 REGISTER_SIZE,
1466 deposit_21 (fun >> 11,
1467 extract_unsigned_integer (&dummy[9*REGISTER_SIZE],
1468 REGISTER_SIZE)));
1469 store_unsigned_integer
1470 (&dummy[10*REGISTER_SIZE],
1471 REGISTER_SIZE,
1472 deposit_14 (fun & MASK_11,
1473 extract_unsigned_integer (&dummy[10*REGISTER_SIZE],
1474 REGISTER_SIZE)));
1475 store_unsigned_integer
1476 (&dummy[12*REGISTER_SIZE],
1477 REGISTER_SIZE,
1478 deposit_21 (sr4export_addr >> 11,
1479 extract_unsigned_integer (&dummy[12*REGISTER_SIZE],
1480 REGISTER_SIZE)));
1481 store_unsigned_integer
1482 (&dummy[13*REGISTER_SIZE],
1483 REGISTER_SIZE,
1484 deposit_14 (sr4export_addr & MASK_11,
1485 extract_unsigned_integer (&dummy[13*REGISTER_SIZE],
1486 REGISTER_SIZE)));
66a1aa07
SG
1487
1488 write_register (22, pc);
1489
6cfec929
JK
1490 /* If we are in a syscall, then we should call the stack dummy
1491 directly. $$dyncall is not needed as the kernel sets up the
1492 space id registers properly based on the value in %r31. In
1493 fact calling $$dyncall will not work because the value in %r22
1494 will be clobbered on the syscall exit path. */
1495 if (flags & 2)
1496 return pc;
1497 else
1498 return dyncall_addr;
1499
66a1aa07
SG
1500}
1501
d3862cae
JK
1502/* Get the PC from %r31 if currently in a syscall. Also mask out privilege
1503 bits. */
669caa9c 1504
d3862cae 1505CORE_ADDR
e9a3cde8
JL
1506target_read_pc (pid)
1507 int pid;
d3862cae
JK
1508{
1509 int flags = read_register (FLAGS_REGNUM);
1510
1511 if (flags & 2)
1512 return read_register (31) & ~0x3;
1513 return read_register (PC_REGNUM) & ~0x3;
1514}
1515
6cfec929
JK
1516/* Write out the PC. If currently in a syscall, then also write the new
1517 PC value into %r31. */
669caa9c 1518
6cfec929 1519void
e9a3cde8 1520target_write_pc (v, pid)
6cfec929 1521 CORE_ADDR v;
e9a3cde8 1522 int pid;
6cfec929
JK
1523{
1524 int flags = read_register (FLAGS_REGNUM);
1525
1526 /* If in a syscall, then set %r31. Also make sure to get the
1527 privilege bits set correctly. */
1528 if (flags & 2)
1529 write_register (31, (long) (v | 0x3));
1530
1531 write_register (PC_REGNUM, (long) v);
1532 write_register (NPC_REGNUM, (long) v + 4);
1533}
1534
66a1aa07
SG
1535/* return the alignment of a type in bytes. Structures have the maximum
1536 alignment required by their fields. */
1537
1538static int
1539hppa_alignof (arg)
1540 struct type *arg;
1541{
1542 int max_align, align, i;
1543 switch (TYPE_CODE (arg))
1544 {
1545 case TYPE_CODE_PTR:
1546 case TYPE_CODE_INT:
1547 case TYPE_CODE_FLT:
1548 return TYPE_LENGTH (arg);
1549 case TYPE_CODE_ARRAY:
1550 return hppa_alignof (TYPE_FIELD_TYPE (arg, 0));
1551 case TYPE_CODE_STRUCT:
1552 case TYPE_CODE_UNION:
1553 max_align = 2;
1554 for (i = 0; i < TYPE_NFIELDS (arg); i++)
1555 {
1556 /* Bit fields have no real alignment. */
1557 if (!TYPE_FIELD_BITPOS (arg, i))
1558 {
1559 align = hppa_alignof (TYPE_FIELD_TYPE (arg, i));
1560 max_align = max (max_align, align);
1561 }
1562 }
1563 return max_align;
1564 default:
1565 return 4;
1566 }
1567}
1568
1569/* Print the register regnum, or all registers if regnum is -1 */
1570
e43169eb 1571void
66a1aa07
SG
1572pa_do_registers_info (regnum, fpregs)
1573 int regnum;
1574 int fpregs;
1575{
1576 char raw_regs [REGISTER_BYTES];
1577 int i;
1578
1579 for (i = 0; i < NUM_REGS; i++)
1580 read_relative_register_raw_bytes (i, raw_regs + REGISTER_BYTE (i));
1581 if (regnum == -1)
1582 pa_print_registers (raw_regs, regnum, fpregs);
1583 else if (regnum < FP0_REGNUM)
199b2450 1584 printf_unfiltered ("%s %x\n", reg_names[regnum], *(long *)(raw_regs +
66a1aa07
SG
1585 REGISTER_BYTE (regnum)));
1586 else
1587 pa_print_fp_reg (regnum);
1588}
1589
e43169eb 1590static void
66a1aa07
SG
1591pa_print_registers (raw_regs, regnum, fpregs)
1592 char *raw_regs;
1593 int regnum;
1594 int fpregs;
1595{
1596 int i;
1597
1598 for (i = 0; i < 18; i++)
199b2450 1599 printf_unfiltered ("%8.8s: %8x %8.8s: %8x %8.8s: %8x %8.8s: %8x\n",
66a1aa07
SG
1600 reg_names[i],
1601 *(int *)(raw_regs + REGISTER_BYTE (i)),
1602 reg_names[i + 18],
1603 *(int *)(raw_regs + REGISTER_BYTE (i + 18)),
1604 reg_names[i + 36],
1605 *(int *)(raw_regs + REGISTER_BYTE (i + 36)),
1606 reg_names[i + 54],
1607 *(int *)(raw_regs + REGISTER_BYTE (i + 54)));
1608
1609 if (fpregs)
1610 for (i = 72; i < NUM_REGS; i++)
1611 pa_print_fp_reg (i);
1612}
1613
e43169eb 1614static void
66a1aa07
SG
1615pa_print_fp_reg (i)
1616 int i;
1617{
1618 unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE];
1619 unsigned char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
66a1aa07 1620
eb1167c6 1621 /* Get 32bits of data. */
66a1aa07 1622 read_relative_register_raw_bytes (i, raw_buffer);
ad09cb2b 1623
eb1167c6
JL
1624 /* Put it in the buffer. No conversions are ever necessary. */
1625 memcpy (virtual_buffer, raw_buffer, REGISTER_RAW_SIZE (i));
66a1aa07 1626
199b2450 1627 fputs_filtered (reg_names[i], gdb_stdout);
eb1167c6
JL
1628 print_spaces_filtered (8 - strlen (reg_names[i]), gdb_stdout);
1629 fputs_filtered ("(single precision) ", gdb_stdout);
66a1aa07 1630
199b2450 1631 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, gdb_stdout, 0,
66a1aa07
SG
1632 1, 0, Val_pretty_default);
1633 printf_filtered ("\n");
eb1167c6
JL
1634
1635 /* If "i" is even, then this register can also be a double-precision
1636 FP register. Dump it out as such. */
1637 if ((i % 2) == 0)
1638 {
1639 /* Get the data in raw format for the 2nd half. */
1640 read_relative_register_raw_bytes (i + 1, raw_buffer);
1641
1642 /* Copy it into the appropriate part of the virtual buffer. */
1643 memcpy (virtual_buffer + REGISTER_RAW_SIZE (i), raw_buffer,
1644 REGISTER_RAW_SIZE (i));
1645
1646 /* Dump it as a double. */
1647 fputs_filtered (reg_names[i], gdb_stdout);
1648 print_spaces_filtered (8 - strlen (reg_names[i]), gdb_stdout);
1649 fputs_filtered ("(double precision) ", gdb_stdout);
1650
1651 val_print (builtin_type_double, virtual_buffer, 0, gdb_stdout, 0,
1652 1, 0, Val_pretty_default);
1653 printf_filtered ("\n");
1654 }
66a1aa07
SG
1655}
1656
a76c2240
JL
1657/* Return one if PC is in the call path of a trampoline, else return zero.
1658
1659 Note we return one for *any* call trampoline (long-call, arg-reloc), not
1660 just shared library trampolines (import, export). */
481faa25 1661
e43169eb 1662int
481faa25
JL
1663in_solib_call_trampoline (pc, name)
1664 CORE_ADDR pc;
1665 char *name;
1666{
1667 struct minimal_symbol *minsym;
1668 struct unwind_table_entry *u;
a76c2240
JL
1669 static CORE_ADDR dyncall = 0;
1670 static CORE_ADDR sr4export = 0;
1671
1672/* FIXME XXX - dyncall and sr4export must be initialized whenever we get a
1673 new exec file */
1674
1675 /* First see if PC is in one of the two C-library trampolines. */
1676 if (!dyncall)
1677 {
1678 minsym = lookup_minimal_symbol ("$$dyncall", NULL);
1679 if (minsym)
1680 dyncall = SYMBOL_VALUE_ADDRESS (minsym);
1681 else
1682 dyncall = -1;
1683 }
1684
1685 if (!sr4export)
1686 {
1687 minsym = lookup_minimal_symbol ("_sr4export", NULL);
1688 if (minsym)
1689 sr4export = SYMBOL_VALUE_ADDRESS (minsym);
1690 else
1691 sr4export = -1;
1692 }
1693
1694 if (pc == dyncall || pc == sr4export)
1695 return 1;
481faa25
JL
1696
1697 /* Get the unwind descriptor corresponding to PC, return zero
1698 if no unwind was found. */
1699 u = find_unwind_entry (pc);
1700 if (!u)
1701 return 0;
1702
1703 /* If this isn't a linker stub, then return now. */
a76c2240 1704 if (u->stub_type == 0)
481faa25
JL
1705 return 0;
1706
a76c2240
JL
1707 /* By definition a long-branch stub is a call stub. */
1708 if (u->stub_type == LONG_BRANCH)
1709 return 1;
1710
481faa25
JL
1711 /* The call and return path execute the same instructions within
1712 an IMPORT stub! So an IMPORT stub is both a call and return
1713 trampoline. */
1714 if (u->stub_type == IMPORT)
1715 return 1;
1716
a76c2240 1717 /* Parameter relocation stubs always have a call path and may have a
481faa25 1718 return path. */
54576db3
JL
1719 if (u->stub_type == PARAMETER_RELOCATION
1720 || u->stub_type == EXPORT)
a76c2240
JL
1721 {
1722 CORE_ADDR addr;
1723
1724 /* Search forward from the current PC until we hit a branch
1725 or the end of the stub. */
1726 for (addr = pc; addr <= u->region_end; addr += 4)
1727 {
1728 unsigned long insn;
1729
1730 insn = read_memory_integer (addr, 4);
1731
1732 /* Does it look like a bl? If so then it's the call path, if
54576db3 1733 we find a bv or be first, then we're on the return path. */
a76c2240
JL
1734 if ((insn & 0xfc00e000) == 0xe8000000)
1735 return 1;
54576db3
JL
1736 else if ((insn & 0xfc00e001) == 0xe800c000
1737 || (insn & 0xfc000000) == 0xe0000000)
a76c2240
JL
1738 return 0;
1739 }
1740
1741 /* Should never happen. */
1742 warning ("Unable to find branch in parameter relocation stub.\n");
1743 return 0;
1744 }
1745
1746 /* Unknown stub type. For now, just return zero. */
1747 return 0;
481faa25
JL
1748}
1749
a76c2240
JL
1750/* Return one if PC is in the return path of a trampoline, else return zero.
1751
1752 Note we return one for *any* call trampoline (long-call, arg-reloc), not
1753 just shared library trampolines (import, export). */
481faa25 1754
e43169eb 1755int
481faa25
JL
1756in_solib_return_trampoline (pc, name)
1757 CORE_ADDR pc;
1758 char *name;
1759{
481faa25
JL
1760 struct unwind_table_entry *u;
1761
1762 /* Get the unwind descriptor corresponding to PC, return zero
1763 if no unwind was found. */
1764 u = find_unwind_entry (pc);
1765 if (!u)
1766 return 0;
1767
a76c2240
JL
1768 /* If this isn't a linker stub or it's just a long branch stub, then
1769 return zero. */
1770 if (u->stub_type == 0 || u->stub_type == LONG_BRANCH)
481faa25
JL
1771 return 0;
1772
1773 /* The call and return path execute the same instructions within
1774 an IMPORT stub! So an IMPORT stub is both a call and return
1775 trampoline. */
1776 if (u->stub_type == IMPORT)
1777 return 1;
1778
a76c2240 1779 /* Parameter relocation stubs always have a call path and may have a
481faa25 1780 return path. */
54576db3
JL
1781 if (u->stub_type == PARAMETER_RELOCATION
1782 || u->stub_type == EXPORT)
a76c2240
JL
1783 {
1784 CORE_ADDR addr;
1785
1786 /* Search forward from the current PC until we hit a branch
1787 or the end of the stub. */
1788 for (addr = pc; addr <= u->region_end; addr += 4)
1789 {
1790 unsigned long insn;
1791
1792 insn = read_memory_integer (addr, 4);
1793
1794 /* Does it look like a bl? If so then it's the call path, if
54576db3 1795 we find a bv or be first, then we're on the return path. */
a76c2240
JL
1796 if ((insn & 0xfc00e000) == 0xe8000000)
1797 return 0;
54576db3
JL
1798 else if ((insn & 0xfc00e001) == 0xe800c000
1799 || (insn & 0xfc000000) == 0xe0000000)
a76c2240
JL
1800 return 1;
1801 }
1802
1803 /* Should never happen. */
1804 warning ("Unable to find branch in parameter relocation stub.\n");
1805 return 0;
1806 }
1807
1808 /* Unknown stub type. For now, just return zero. */
1809 return 0;
1810
481faa25
JL
1811}
1812
de482138
JL
1813/* Figure out if PC is in a trampoline, and if so find out where
1814 the trampoline will jump to. If not in a trampoline, return zero.
66a1aa07 1815
de482138
JL
1816 Simple code examination probably is not a good idea since the code
1817 sequences in trampolines can also appear in user code.
1818
1819 We use unwinds and information from the minimal symbol table to
1820 determine when we're in a trampoline. This won't work for ELF
1821 (yet) since it doesn't create stub unwind entries. Whether or
1822 not ELF will create stub unwinds or normal unwinds for linker
1823 stubs is still being debated.
1824
1825 This should handle simple calls through dyncall or sr4export,
1826 long calls, argument relocation stubs, and dyncall/sr4export
1827 calling an argument relocation stub. It even handles some stubs
1828 used in dynamic executables. */
66a1aa07
SG
1829
1830CORE_ADDR
1831skip_trampoline_code (pc, name)
1832 CORE_ADDR pc;
1833 char *name;
1834{
de482138
JL
1835 long orig_pc = pc;
1836 long prev_inst, curr_inst, loc;
66a1aa07 1837 static CORE_ADDR dyncall = 0;
de482138 1838 static CORE_ADDR sr4export = 0;
66a1aa07 1839 struct minimal_symbol *msym;
de482138 1840 struct unwind_table_entry *u;
66a1aa07 1841
de482138
JL
1842/* FIXME XXX - dyncall and sr4export must be initialized whenever we get a
1843 new exec file */
66a1aa07
SG
1844
1845 if (!dyncall)
1846 {
1847 msym = lookup_minimal_symbol ("$$dyncall", NULL);
1848 if (msym)
1849 dyncall = SYMBOL_VALUE_ADDRESS (msym);
1850 else
1851 dyncall = -1;
1852 }
1853
de482138
JL
1854 if (!sr4export)
1855 {
1856 msym = lookup_minimal_symbol ("_sr4export", NULL);
1857 if (msym)
1858 sr4export = SYMBOL_VALUE_ADDRESS (msym);
1859 else
1860 sr4export = -1;
1861 }
1862
1863 /* Addresses passed to dyncall may *NOT* be the actual address
669caa9c 1864 of the function. So we may have to do something special. */
66a1aa07 1865 if (pc == dyncall)
de482138
JL
1866 {
1867 pc = (CORE_ADDR) read_register (22);
66a1aa07 1868
de482138
JL
1869 /* If bit 30 (counting from the left) is on, then pc is the address of
1870 the PLT entry for this function, not the address of the function
1871 itself. Bit 31 has meaning too, but only for MPE. */
1872 if (pc & 0x2)
1873 pc = (CORE_ADDR) read_memory_integer (pc & ~0x3, 4);
1874 }
1875 else if (pc == sr4export)
1876 pc = (CORE_ADDR) (read_register (22));
66a1aa07 1877
de482138
JL
1878 /* Get the unwind descriptor corresponding to PC, return zero
1879 if no unwind was found. */
1880 u = find_unwind_entry (pc);
1881 if (!u)
1882 return 0;
1883
1884 /* If this isn't a linker stub, then return now. */
1885 if (u->stub_type == 0)
1886 return orig_pc == pc ? 0 : pc & ~0x3;
1887
1888 /* It's a stub. Search for a branch and figure out where it goes.
1889 Note we have to handle multi insn branch sequences like ldil;ble.
1890 Most (all?) other branches can be determined by examining the contents
1891 of certain registers and the stack. */
1892 loc = pc;
1893 curr_inst = 0;
1894 prev_inst = 0;
1895 while (1)
1896 {
1897 /* Make sure we haven't walked outside the range of this stub. */
1898 if (u != find_unwind_entry (loc))
1899 {
1900 warning ("Unable to find branch in linker stub");
1901 return orig_pc == pc ? 0 : pc & ~0x3;
1902 }
1903
1904 prev_inst = curr_inst;
1905 curr_inst = read_memory_integer (loc, 4);
66a1aa07 1906
de482138
JL
1907 /* Does it look like a branch external using %r1? Then it's the
1908 branch from the stub to the actual function. */
1909 if ((curr_inst & 0xffe0e000) == 0xe0202000)
1910 {
1911 /* Yup. See if the previous instruction loaded
1912 a value into %r1. If so compute and return the jump address. */
4cbc4bf1 1913 if ((prev_inst & 0xffe00000) == 0x20200000)
de482138
JL
1914 return (extract_21 (prev_inst) + extract_17 (curr_inst)) & ~0x3;
1915 else
1916 {
1917 warning ("Unable to find ldil X,%%r1 before ble Y(%%sr4,%%r1).");
1918 return orig_pc == pc ? 0 : pc & ~0x3;
1919 }
1920 }
1921
f32fc5f9
JL
1922 /* Does it look like a be 0(sr0,%r21)? That's the branch from an
1923 import stub to an export stub.
1924
1925 It is impossible to determine the target of the branch via
1926 simple examination of instructions and/or data (consider
1927 that the address in the plabel may be the address of the
1928 bind-on-reference routine in the dynamic loader).
1929
1930 So we have try an alternative approach.
1931
1932 Get the name of the symbol at our current location; it should
1933 be a stub symbol with the same name as the symbol in the
1934 shared library.
1935
1936 Then lookup a minimal symbol with the same name; we should
1937 get the minimal symbol for the target routine in the shared
1938 library as those take precedence of import/export stubs. */
1939 if (curr_inst == 0xe2a00000)
1940 {
1941 struct minimal_symbol *stubsym, *libsym;
1942
1943 stubsym = lookup_minimal_symbol_by_pc (loc);
1944 if (stubsym == NULL)
1945 {
1946 warning ("Unable to find symbol for 0x%x", loc);
1947 return orig_pc == pc ? 0 : pc & ~0x3;
1948 }
1949
1950 libsym = lookup_minimal_symbol (SYMBOL_NAME (stubsym), NULL);
1951 if (libsym == NULL)
1952 {
1953 warning ("Unable to find library symbol for %s\n",
1954 SYMBOL_NAME (stubsym));
1955 return orig_pc == pc ? 0 : pc & ~0x3;
1956 }
1957
1958 return SYMBOL_VALUE (libsym);
1959 }
1960
88b91d4a
JL
1961 /* Does it look like bl X,%rp or bl X,%r0? Another way to do a
1962 branch from the stub to the actual function. */
1963 else if ((curr_inst & 0xffe0e000) == 0xe8400000
1964 || (curr_inst & 0xffe0e000) == 0xe8000000)
de482138
JL
1965 return (loc + extract_17 (curr_inst) + 8) & ~0x3;
1966
1967 /* Does it look like bv (rp)? Note this depends on the
1968 current stack pointer being the same as the stack
1969 pointer in the stub itself! This is a branch on from the
1970 stub back to the original caller. */
1971 else if ((curr_inst & 0xffe0e000) == 0xe840c000)
1972 {
1973 /* Yup. See if the previous instruction loaded
1974 rp from sp - 8. */
1975 if (prev_inst == 0x4bc23ff1)
1976 return (read_memory_integer
1977 (read_register (SP_REGNUM) - 8, 4)) & ~0x3;
1978 else
1979 {
1980 warning ("Unable to find restore of %%rp before bv (%%rp).");
1981 return orig_pc == pc ? 0 : pc & ~0x3;
1982 }
1983 }
1984
1985 /* What about be,n 0(sr0,%rp)? It's just another way we return to
1986 the original caller from the stub. Used in dynamic executables. */
1987 else if (curr_inst == 0xe0400002)
1988 {
1989 /* The value we jump to is sitting in sp - 24. But that's
1990 loaded several instructions before the be instruction.
1991 I guess we could check for the previous instruction being
1992 mtsp %r1,%sr0 if we want to do sanity checking. */
1993 return (read_memory_integer
1994 (read_register (SP_REGNUM) - 24, 4)) & ~0x3;
1995 }
1996
1997 /* Haven't found the branch yet, but we're still in the stub.
1998 Keep looking. */
1999 loc += 4;
2000 }
66a1aa07
SG
2001}
2002
c598654a
JL
2003/* For the given instruction (INST), return any adjustment it makes
2004 to the stack pointer or zero for no adjustment.
2005
2006 This only handles instructions commonly found in prologues. */
2007
2008static int
2009prologue_inst_adjust_sp (inst)
2010 unsigned long inst;
2011{
2012 /* This must persist across calls. */
2013 static int save_high21;
2014
2015 /* The most common way to perform a stack adjustment ldo X(sp),sp */
2016 if ((inst & 0xffffc000) == 0x37de0000)
2017 return extract_14 (inst);
2018
2019 /* stwm X,D(sp) */
2020 if ((inst & 0xffe00000) == 0x6fc00000)
2021 return extract_14 (inst);
2022
2023 /* addil high21,%r1; ldo low11,(%r1),%r30)
2024 save high bits in save_high21 for later use. */
2025 if ((inst & 0xffe00000) == 0x28200000)
2026 {
2027 save_high21 = extract_21 (inst);
2028 return 0;
2029 }
2030
2031 if ((inst & 0xffff0000) == 0x343e0000)
2032 return save_high21 + extract_14 (inst);
2033
2034 /* fstws as used by the HP compilers. */
2035 if ((inst & 0xffffffe0) == 0x2fd01220)
2036 return extract_5_load (inst);
2037
2038 /* No adjustment. */
2039 return 0;
2040}
2041
2042/* Return nonzero if INST is a branch of some kind, else return zero. */
2043
2044static int
2045is_branch (inst)
2046 unsigned long inst;
2047{
2048 switch (inst >> 26)
2049 {
2050 case 0x20:
2051 case 0x21:
2052 case 0x22:
2053 case 0x23:
2054 case 0x28:
2055 case 0x29:
2056 case 0x2a:
2057 case 0x2b:
2058 case 0x30:
2059 case 0x31:
2060 case 0x32:
2061 case 0x33:
2062 case 0x38:
2063 case 0x39:
2064 case 0x3a:
2065 return 1;
2066
2067 default:
2068 return 0;
2069 }
2070}
2071
2072/* Return the register number for a GR which is saved by INST or
edd86fb0 2073 zero it INST does not save a GR. */
c598654a
JL
2074
2075static int
2076inst_saves_gr (inst)
2077 unsigned long inst;
2078{
2079 /* Does it look like a stw? */
2080 if ((inst >> 26) == 0x1a)
2081 return extract_5R_store (inst);
2082
edd86fb0 2083 /* Does it look like a stwm? GCC & HPC may use this in prologues. */
c598654a
JL
2084 if ((inst >> 26) == 0x1b)
2085 return extract_5R_store (inst);
2086
edd86fb0
JL
2087 /* Does it look like sth or stb? HPC versions 9.0 and later use these
2088 too. */
2089 if ((inst >> 26) == 0x19 || (inst >> 26) == 0x18)
2090 return extract_5R_store (inst);
2091
c598654a
JL
2092 return 0;
2093}
2094
2095/* Return the register number for a FR which is saved by INST or
2096 zero it INST does not save a FR.
2097
2098 Note we only care about full 64bit register stores (that's the only
edd86fb0
JL
2099 kind of stores the prologue will use).
2100
2101 FIXME: What about argument stores with the HP compiler in ANSI mode? */
c598654a
JL
2102
2103static int
2104inst_saves_fr (inst)
2105 unsigned long inst;
2106{
edd86fb0 2107 if ((inst & 0xfc00dfc0) == 0x2c001200)
c598654a
JL
2108 return extract_5r_store (inst);
2109 return 0;
2110}
2111
66a1aa07 2112/* Advance PC across any function entry prologue instructions
c598654a 2113 to reach some "real" code.
66a1aa07 2114
c598654a
JL
2115 Use information in the unwind table to determine what exactly should
2116 be in the prologue. */
66a1aa07
SG
2117
2118CORE_ADDR
de482138 2119skip_prologue (pc)
66a1aa07
SG
2120 CORE_ADDR pc;
2121{
34df79fc 2122 char buf[4];
c598654a 2123 unsigned long inst, stack_remaining, save_gr, save_fr, save_rp, save_sp;
edd86fb0 2124 unsigned long args_stored, status, i;
c598654a 2125 struct unwind_table_entry *u;
66a1aa07 2126
c598654a
JL
2127 u = find_unwind_entry (pc);
2128 if (!u)
fdafbfad 2129 return pc;
c598654a 2130
de482138
JL
2131 /* If we are not at the beginning of a function, then return now. */
2132 if ((pc & ~0x3) != u->region_start)
2133 return pc;
2134
c598654a
JL
2135 /* This is how much of a frame adjustment we need to account for. */
2136 stack_remaining = u->Total_frame_size << 3;
66a1aa07 2137
c598654a
JL
2138 /* Magic register saves we want to know about. */
2139 save_rp = u->Save_RP;
2140 save_sp = u->Save_SP;
2141
edd86fb0
JL
2142 /* An indication that args may be stored into the stack. Unfortunately
2143 the HPUX compilers tend to set this in cases where no args were
2144 stored too!. */
2145 args_stored = u->Args_stored;
2146
c598654a
JL
2147 /* Turn the Entry_GR field into a bitmask. */
2148 save_gr = 0;
2149 for (i = 3; i < u->Entry_GR + 3; i++)
66a1aa07 2150 {
c598654a
JL
2151 /* Frame pointer gets saved into a special location. */
2152 if (u->Save_SP && i == FP_REGNUM)
2153 continue;
2154
2155 save_gr |= (1 << i);
2156 }
2157
2158 /* Turn the Entry_FR field into a bitmask too. */
2159 save_fr = 0;
2160 for (i = 12; i < u->Entry_FR + 12; i++)
2161 save_fr |= (1 << i);
2162
2163 /* Loop until we find everything of interest or hit a branch.
2164
2165 For unoptimized GCC code and for any HP CC code this will never ever
2166 examine any user instructions.
2167
2168 For optimzied GCC code we're faced with problems. GCC will schedule
2169 its prologue and make prologue instructions available for delay slot
2170 filling. The end result is user code gets mixed in with the prologue
2171 and a prologue instruction may be in the delay slot of the first branch
2172 or call.
2173
2174 Some unexpected things are expected with debugging optimized code, so
2175 we allow this routine to walk past user instructions in optimized
2176 GCC code. */
edd86fb0
JL
2177 while (save_gr || save_fr || save_rp || save_sp || stack_remaining > 0
2178 || args_stored)
c598654a 2179 {
edd86fb0
JL
2180 unsigned int reg_num;
2181 unsigned long old_stack_remaining, old_save_gr, old_save_fr;
e43169eb 2182 unsigned long old_save_rp, old_save_sp, next_inst;
edd86fb0
JL
2183
2184 /* Save copies of all the triggers so we can compare them later
2185 (only for HPC). */
2186 old_save_gr = save_gr;
2187 old_save_fr = save_fr;
2188 old_save_rp = save_rp;
2189 old_save_sp = save_sp;
2190 old_stack_remaining = stack_remaining;
2191
c598654a
JL
2192 status = target_read_memory (pc, buf, 4);
2193 inst = extract_unsigned_integer (buf, 4);
edd86fb0 2194
c598654a
JL
2195 /* Yow! */
2196 if (status != 0)
2197 return pc;
2198
2199 /* Note the interesting effects of this instruction. */
2200 stack_remaining -= prologue_inst_adjust_sp (inst);
2201
2202 /* There is only one instruction used for saving RP into the stack. */
2203 if (inst == 0x6bc23fd9)
2204 save_rp = 0;
2205
2206 /* This is the only way we save SP into the stack. At this time
2207 the HP compilers never bother to save SP into the stack. */
2208 if ((inst & 0xffffc000) == 0x6fc10000)
2209 save_sp = 0;
2210
2211 /* Account for general and floating-point register saves. */
edd86fb0
JL
2212 reg_num = inst_saves_gr (inst);
2213 save_gr &= ~(1 << reg_num);
2214
2215 /* Ugh. Also account for argument stores into the stack.
2216 Unfortunately args_stored only tells us that some arguments
2217 where stored into the stack. Not how many or what kind!
2218
2219 This is a kludge as on the HP compiler sets this bit and it
2220 never does prologue scheduling. So once we see one, skip past
2221 all of them. We have similar code for the fp arg stores below.
2222
2223 FIXME. Can still die if we have a mix of GR and FR argument
2224 stores! */
2225 if (reg_num >= 23 && reg_num <= 26)
2226 {
2227 while (reg_num >= 23 && reg_num <= 26)
2228 {
2229 pc += 4;
2230 status = target_read_memory (pc, buf, 4);
2231 inst = extract_unsigned_integer (buf, 4);
2232 if (status != 0)
2233 return pc;
2234 reg_num = inst_saves_gr (inst);
2235 }
2236 args_stored = 0;
2237 continue;
2238 }
2239
2240 reg_num = inst_saves_fr (inst);
2241 save_fr &= ~(1 << reg_num);
2242
2243 status = target_read_memory (pc + 4, buf, 4);
2244 next_inst = extract_unsigned_integer (buf, 4);
2245
2246 /* Yow! */
2247 if (status != 0)
2248 return pc;
2249
2250 /* We've got to be read to handle the ldo before the fp register
2251 save. */
2252 if ((inst & 0xfc000000) == 0x34000000
2253 && inst_saves_fr (next_inst) >= 4
2254 && inst_saves_fr (next_inst) <= 7)
2255 {
2256 /* So we drop into the code below in a reasonable state. */
2257 reg_num = inst_saves_fr (next_inst);
2258 pc -= 4;
2259 }
2260
2261 /* Ugh. Also account for argument stores into the stack.
2262 This is a kludge as on the HP compiler sets this bit and it
2263 never does prologue scheduling. So once we see one, skip past
2264 all of them. */
2265 if (reg_num >= 4 && reg_num <= 7)
2266 {
2267 while (reg_num >= 4 && reg_num <= 7)
2268 {
2269 pc += 8;
2270 status = target_read_memory (pc, buf, 4);
2271 inst = extract_unsigned_integer (buf, 4);
2272 if (status != 0)
2273 return pc;
2274 if ((inst & 0xfc000000) != 0x34000000)
2275 break;
2276 status = target_read_memory (pc + 4, buf, 4);
2277 next_inst = extract_unsigned_integer (buf, 4);
2278 if (status != 0)
2279 return pc;
2280 reg_num = inst_saves_fr (next_inst);
2281 }
2282 args_stored = 0;
2283 continue;
2284 }
c598654a
JL
2285
2286 /* Quit if we hit any kind of branch. This can happen if a prologue
2287 instruction is in the delay slot of the first call/branch. */
2288 if (is_branch (inst))
2289 break;
2290
edd86fb0
JL
2291 /* What a crock. The HP compilers set args_stored even if no
2292 arguments were stored into the stack (boo hiss). This could
2293 cause this code to then skip a bunch of user insns (up to the
2294 first branch).
2295
2296 To combat this we try to identify when args_stored was bogusly
2297 set and clear it. We only do this when args_stored is nonzero,
2298 all other resources are accounted for, and nothing changed on
2299 this pass. */
2300 if (args_stored
2301 && ! (save_gr || save_fr || save_rp || save_sp || stack_remaining > 0)
2302 && old_save_gr == save_gr && old_save_fr == save_fr
2303 && old_save_rp == save_rp && old_save_sp == save_sp
2304 && old_stack_remaining == stack_remaining)
2305 break;
2306
c598654a
JL
2307 /* Bump the PC. */
2308 pc += 4;
66a1aa07 2309 }
66a1aa07
SG
2310
2311 return pc;
2312}
2313
c598654a
JL
2314/* Put here the code to store, into a struct frame_saved_regs,
2315 the addresses of the saved registers of frame described by FRAME_INFO.
2316 This includes special registers such as pc and fp saved in special
2317 ways in the stack frame. sp is even more special:
2318 the address we return for it IS the sp for the next frame. */
2319
2320void
2321hppa_frame_find_saved_regs (frame_info, frame_saved_regs)
cb5f7128 2322 struct frame_info *frame_info;
c598654a
JL
2323 struct frame_saved_regs *frame_saved_regs;
2324{
2325 CORE_ADDR pc;
2326 struct unwind_table_entry *u;
2327 unsigned long inst, stack_remaining, save_gr, save_fr, save_rp, save_sp;
2328 int status, i, reg;
2329 char buf[4];
2330 int fp_loc = -1;
2331
2332 /* Zero out everything. */
2333 memset (frame_saved_regs, '\0', sizeof (struct frame_saved_regs));
2334
2335 /* Call dummy frames always look the same, so there's no need to
2336 examine the dummy code to determine locations of saved registers;
2337 instead, let find_dummy_frame_regs fill in the correct offsets
2338 for the saved registers. */
cb5f7128
JL
2339 if ((frame_info->pc >= frame_info->frame
2340 && frame_info->pc <= (frame_info->frame + CALL_DUMMY_LENGTH
2341 + 32 * 4 + (NUM_REGS - FP0_REGNUM) * 8
2342 + 6 * 4)))
2343 find_dummy_frame_regs (frame_info, frame_saved_regs);
c598654a 2344
70e43abe
JL
2345 /* Interrupt handlers are special too. They lay out the register
2346 state in the exact same order as the register numbers in GDB. */
cb5f7128 2347 if (pc_in_interrupt_handler (frame_info->pc))
70e43abe
JL
2348 {
2349 for (i = 0; i < NUM_REGS; i++)
2350 {
2351 /* SP is a little special. */
2352 if (i == SP_REGNUM)
2353 frame_saved_regs->regs[SP_REGNUM]
cb5f7128 2354 = read_memory_integer (frame_info->frame + SP_REGNUM * 4, 4);
70e43abe 2355 else
cb5f7128 2356 frame_saved_regs->regs[i] = frame_info->frame + i * 4;
70e43abe
JL
2357 }
2358 return;
2359 }
2360
2361 /* Handle signal handler callers. */
cb5f7128 2362 if (frame_info->signal_handler_caller)
70e43abe 2363 {
cb5f7128 2364 FRAME_FIND_SAVED_REGS_IN_SIGTRAMP (frame_info, frame_saved_regs);
70e43abe
JL
2365 return;
2366 }
2367
c598654a 2368 /* Get the starting address of the function referred to by the PC
669caa9c 2369 saved in frame. */
cb5f7128 2370 pc = get_pc_function_start (frame_info->pc);
c598654a
JL
2371
2372 /* Yow! */
2373 u = find_unwind_entry (pc);
2374 if (!u)
2375 return;
2376
2377 /* This is how much of a frame adjustment we need to account for. */
2378 stack_remaining = u->Total_frame_size << 3;
2379
2380 /* Magic register saves we want to know about. */
2381 save_rp = u->Save_RP;
2382 save_sp = u->Save_SP;
2383
2384 /* Turn the Entry_GR field into a bitmask. */
2385 save_gr = 0;
2386 for (i = 3; i < u->Entry_GR + 3; i++)
2387 {
2388 /* Frame pointer gets saved into a special location. */
2389 if (u->Save_SP && i == FP_REGNUM)
2390 continue;
2391
2392 save_gr |= (1 << i);
2393 }
2394
2395 /* Turn the Entry_FR field into a bitmask too. */
2396 save_fr = 0;
2397 for (i = 12; i < u->Entry_FR + 12; i++)
2398 save_fr |= (1 << i);
2399
70e43abe
JL
2400 /* The frame always represents the value of %sp at entry to the
2401 current function (and is thus equivalent to the "saved" stack
2402 pointer. */
cb5f7128 2403 frame_saved_regs->regs[SP_REGNUM] = frame_info->frame;
70e43abe 2404
c598654a
JL
2405 /* Loop until we find everything of interest or hit a branch.
2406
2407 For unoptimized GCC code and for any HP CC code this will never ever
2408 examine any user instructions.
2409
2410 For optimzied GCC code we're faced with problems. GCC will schedule
2411 its prologue and make prologue instructions available for delay slot
2412 filling. The end result is user code gets mixed in with the prologue
2413 and a prologue instruction may be in the delay slot of the first branch
2414 or call.
2415
2416 Some unexpected things are expected with debugging optimized code, so
2417 we allow this routine to walk past user instructions in optimized
2418 GCC code. */
2419 while (save_gr || save_fr || save_rp || save_sp || stack_remaining > 0)
2420 {
2421 status = target_read_memory (pc, buf, 4);
2422 inst = extract_unsigned_integer (buf, 4);
2423
2424 /* Yow! */
2425 if (status != 0)
2426 return;
2427
2428 /* Note the interesting effects of this instruction. */
2429 stack_remaining -= prologue_inst_adjust_sp (inst);
2430
2431 /* There is only one instruction used for saving RP into the stack. */
2432 if (inst == 0x6bc23fd9)
2433 {
2434 save_rp = 0;
cb5f7128 2435 frame_saved_regs->regs[RP_REGNUM] = frame_info->frame - 20;
c598654a
JL
2436 }
2437
70e43abe
JL
2438 /* Just note that we found the save of SP into the stack. The
2439 value for frame_saved_regs was computed above. */
c598654a 2440 if ((inst & 0xffffc000) == 0x6fc10000)
70e43abe 2441 save_sp = 0;
c598654a
JL
2442
2443 /* Account for general and floating-point register saves. */
2444 reg = inst_saves_gr (inst);
2445 if (reg >= 3 && reg <= 18
2446 && (!u->Save_SP || reg != FP_REGNUM))
2447 {
2448 save_gr &= ~(1 << reg);
2449
2450 /* stwm with a positive displacement is a *post modify*. */
2451 if ((inst >> 26) == 0x1b
2452 && extract_14 (inst) >= 0)
cb5f7128 2453 frame_saved_regs->regs[reg] = frame_info->frame;
c598654a
JL
2454 else
2455 {
2456 /* Handle code with and without frame pointers. */
2457 if (u->Save_SP)
2458 frame_saved_regs->regs[reg]
cb5f7128 2459 = frame_info->frame + extract_14 (inst);
c598654a
JL
2460 else
2461 frame_saved_regs->regs[reg]
cb5f7128 2462 = frame_info->frame + (u->Total_frame_size << 3)
c598654a
JL
2463 + extract_14 (inst);
2464 }
2465 }
2466
2467
2468 /* GCC handles callee saved FP regs a little differently.
2469
2470 It emits an instruction to put the value of the start of
2471 the FP store area into %r1. It then uses fstds,ma with
2472 a basereg of %r1 for the stores.
2473
2474 HP CC emits them at the current stack pointer modifying
2475 the stack pointer as it stores each register. */
2476
2477 /* ldo X(%r3),%r1 or ldo X(%r30),%r1. */
2478 if ((inst & 0xffffc000) == 0x34610000
2479 || (inst & 0xffffc000) == 0x37c10000)
2480 fp_loc = extract_14 (inst);
2481
2482 reg = inst_saves_fr (inst);
2483 if (reg >= 12 && reg <= 21)
2484 {
2485 /* Note +4 braindamage below is necessary because the FP status
2486 registers are internally 8 registers rather than the expected
2487 4 registers. */
2488 save_fr &= ~(1 << reg);
2489 if (fp_loc == -1)
2490 {
2491 /* 1st HP CC FP register store. After this instruction
2492 we've set enough state that the GCC and HPCC code are
2493 both handled in the same manner. */
cb5f7128 2494 frame_saved_regs->regs[reg + FP4_REGNUM + 4] = frame_info->frame;
c598654a
JL
2495 fp_loc = 8;
2496 }
2497 else
2498 {
2499 frame_saved_regs->regs[reg + FP0_REGNUM + 4]
cb5f7128 2500 = frame_info->frame + fp_loc;
c598654a
JL
2501 fp_loc += 8;
2502 }
2503 }
2504
2505 /* Quit if we hit any kind of branch. This can happen if a prologue
2506 instruction is in the delay slot of the first call/branch. */
2507 if (is_branch (inst))
2508 break;
2509
2510 /* Bump the PC. */
2511 pc += 4;
2512 }
2513}
2514
63757ecd
JK
2515#ifdef MAINTENANCE_CMDS
2516
66a1aa07
SG
2517static void
2518unwind_command (exp, from_tty)
2519 char *exp;
2520 int from_tty;
2521{
2522 CORE_ADDR address;
2523 union
2524 {
2525 int *foo;
2526 struct unwind_table_entry *u;
2527 } xxx;
2528
2529 /* If we have an expression, evaluate it and use it as the address. */
2530
2531 if (exp != 0 && *exp != 0)
2532 address = parse_and_eval_address (exp);
2533 else
2534 return;
2535
2536 xxx.u = find_unwind_entry (address);
2537
2538 if (!xxx.u)
2539 {
199b2450 2540 printf_unfiltered ("Can't find unwind table entry for PC 0x%x\n", address);
66a1aa07
SG
2541 return;
2542 }
2543
199b2450 2544 printf_unfiltered ("%08x\n%08X\n%08X\n%08X\n", xxx.foo[0], xxx.foo[1], xxx.foo[2],
66a1aa07
SG
2545 xxx.foo[3]);
2546}
976bb0be 2547#endif /* MAINTENANCE_CMDS */
63757ecd
JK
2548
2549void
2550_initialize_hppa_tdep ()
2551{
976bb0be 2552#ifdef MAINTENANCE_CMDS
63757ecd
JK
2553 add_cmd ("unwind", class_maintenance, unwind_command,
2554 "Print unwind table entry at given address.",
2555 &maintenanceprintlist);
63757ecd 2556#endif /* MAINTENANCE_CMDS */
976bb0be 2557}
This page took 0.221924 seconds and 4 git commands to generate.