Thu Oct 26 10:23:14 1995 steve chamberlain <sac@slash.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / rs6000-tdep.c
CommitLineData
41abdfbd 1/* Target-dependent code for GDB, the GNU debugger.
18b46e7c 2 Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995
07aa9fdc 3 Free Software Foundation, Inc.
41abdfbd
JG
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
6c9638b4 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
41abdfbd 20
41abdfbd 21#include "defs.h"
41abdfbd
JG
22#include "frame.h"
23#include "inferior.h"
24#include "symtab.h"
25#include "target.h"
030fb5cb 26#include "gdbcore.h"
65eaea27
JL
27#include "symfile.h"
28#include "objfiles.h"
2aefe6e4
JK
29#include "xcoffsolib.h"
30
d6434f39
JG
31extern struct obstack frame_cache_obstack;
32
41abdfbd 33extern int errno;
41abdfbd
JG
34
35/* Nonzero if we just simulated a single step break. */
36int one_stepped;
37
41abdfbd
JG
38/* Breakpoint shadows for the single step instructions will be kept here. */
39
40static struct sstep_breaks {
030fb5cb
JK
41 /* Address, or 0 if this is not in use. */
42 CORE_ADDR address;
43 /* Shadow contents. */
44 char data[4];
41abdfbd
JG
45} stepBreaks[2];
46
ecf4059f
JG
47/* Static function prototypes */
48
cd8a3d84 49static CORE_ADDR find_toc_address PARAMS ((CORE_ADDR pc));
ecf4059f 50
cd8a3d84
SS
51static CORE_ADDR branch_dest PARAMS ((int opcode, int instr, CORE_ADDR pc,
52 CORE_ADDR safety));
ecf4059f 53
cd8a3d84
SS
54static void frame_get_cache_fsr PARAMS ((struct frame_info *fi,
55 struct rs6000_framedata *fdatap));
56
57/* Calculate the destination of a branch/jump. Return -1 if not a branch. */
41abdfbd 58
ecf4059f 59static CORE_ADDR
41abdfbd 60branch_dest (opcode, instr, pc, safety)
ecf4059f
JG
61 int opcode;
62 int instr;
63 CORE_ADDR pc;
64 CORE_ADDR safety;
41abdfbd
JG
65{
66 register long offset;
ecf4059f 67 CORE_ADDR dest;
41abdfbd
JG
68 int immediate;
69 int absolute;
70 int ext_op;
71
72 absolute = (int) ((instr >> 1) & 1);
73
74 switch (opcode) {
75 case 18 :
ecf4059f 76 immediate = ((instr & ~3) << 6) >> 6; /* br unconditional */
dc59e982
MM
77 if (absolute)
78 dest = immediate;
79 else
80 dest = pc + immediate;
81 break;
41abdfbd
JG
82
83 case 16 :
dc59e982 84 immediate = ((instr & ~3) << 16) >> 16; /* br conditional */
41abdfbd
JG
85 if (absolute)
86 dest = immediate;
87 else
88 dest = pc + immediate;
89 break;
90
91 case 19 :
92 ext_op = (instr>>1) & 0x3ff;
93
94 if (ext_op == 16) /* br conditional register */
95 dest = read_register (LR_REGNUM) & ~3;
96
97 else if (ext_op == 528) /* br cond to count reg */
9aa31e91
JK
98 {
99 dest = read_register (CTR_REGNUM) & ~3;
100
101 /* If we are about to execute a system call, dest is something
102 like 0x22fc or 0x3b00. Upon completion the system call
103 will return to the address in the link register. */
104 if (dest < TEXT_SEGMENT_BASE)
105 dest = read_register (LR_REGNUM) & ~3;
106 }
41abdfbd
JG
107 else return -1;
108 break;
109
110 default: return -1;
111 }
818de002 112 return (dest < TEXT_SEGMENT_BASE) ? safety : dest;
41abdfbd
JG
113}
114
115
116
117/* AIX does not support PT_STEP. Simulate it. */
118
997cc2c0 119void
41abdfbd 120single_step (signal)
997cc2c0 121 int signal;
41abdfbd
JG
122{
123#define INSNLEN(OPCODE) 4
124
5c172b4b
MM
125 static char le_breakp[] = LITTLE_BREAKPOINT;
126 static char be_breakp[] = BIG_BREAKPOINT;
127 char *breakp = TARGET_BYTE_ORDER == BIG_ENDIAN ? be_breakp : le_breakp;
030fb5cb
JK
128 int ii, insn;
129 CORE_ADDR loc;
130 CORE_ADDR breaks[2];
131 int opcode;
41abdfbd
JG
132
133 if (!one_stepped) {
41abdfbd
JG
134 loc = read_pc ();
135
b112f2ae 136 insn = read_memory_integer (loc, 4);
41abdfbd
JG
137
138 breaks[0] = loc + INSNLEN(insn);
139 opcode = insn >> 26;
140 breaks[1] = branch_dest (opcode, insn, loc, breaks[0]);
141
818de002
PB
142 /* Don't put two breakpoints on the same address. */
143 if (breaks[1] == breaks[0])
144 breaks[1] = -1;
145
030fb5cb 146 stepBreaks[1].address = 0;
41abdfbd
JG
147
148 for (ii=0; ii < 2; ++ii) {
149
150 /* ignore invalid breakpoint. */
151 if ( breaks[ii] == -1)
152 continue;
153
030fb5cb 154 read_memory (breaks[ii], stepBreaks[ii].data, 4);
41abdfbd 155
030fb5cb 156 write_memory (breaks[ii], breakp, 4);
41abdfbd
JG
157 stepBreaks[ii].address = breaks[ii];
158 }
159
160 one_stepped = 1;
997cc2c0 161 } else {
41abdfbd
JG
162
163 /* remove step breakpoints. */
164 for (ii=0; ii < 2; ++ii)
030fb5cb 165 if (stepBreaks[ii].address != 0)
41abdfbd 166 write_memory
030fb5cb 167 (stepBreaks[ii].address, stepBreaks[ii].data, 4);
41abdfbd
JG
168
169 one_stepped = 0;
170 }
997cc2c0 171 errno = 0; /* FIXME, don't ignore errors! */
030fb5cb 172 /* What errors? {read,write}_memory call error(). */
41abdfbd 173}
41abdfbd
JG
174
175
068c9fd6
MM
176/* return pc value after skipping a function prologue and also return
177 information about a function frame.
41abdfbd 178
068c9fd6
MM
179 in struct rs6000_frameinfo fdata:
180 - frameless is TRUE, if function does not have a frame.
181 - nosavedpc is TRUE, if function does not save %pc value in its frame.
182 - offset is the number of bytes used in the frame to save registers.
183 - saved_gpr is the number of the first saved gpr.
184 - saved_fpr is the number of the first saved fpr.
185 - alloca_reg is the number of the register used for alloca() handling.
186 Otherwise -1.
187 - gpr_offset is the offset of the saved gprs
188 - fpr_offset is the offset of the saved fprs
189 - lr_offset is the offset of the saved lr
190 - cr_offset is the offset of the saved cr
191 */
192
193#define SIGNED_SHORT(x) \
194 ((sizeof (short) == 2) \
195 ? ((int)(short)(x)) \
196 : ((int)((((x) & 0xffff) ^ 0x8000) - 0x8000)))
197
198#define GET_SRC_REG(x) (((x) >> 21) & 0x1f)
199
200CORE_ADDR
201skip_prologue (pc, fdata)
202 CORE_ADDR pc;
203 struct rs6000_framedata *fdata;
41abdfbd 204{
068c9fd6 205 CORE_ADDR orig_pc = pc;
34df79fc 206 char buf[4];
34df79fc 207 unsigned long op;
4b4c6c96 208 long offset = 0;
068c9fd6
MM
209 int lr_reg = 0;
210 int cr_reg = 0;
211 int reg;
4b4c6c96 212 int framep = 0;
65eaea27 213 int minimal_toc_loaded = 0;
068c9fd6
MM
214 static struct rs6000_framedata zero_frame;
215
216 *fdata = zero_frame;
217 fdata->saved_gpr = -1;
218 fdata->saved_fpr = -1;
219 fdata->alloca_reg = -1;
220 fdata->frameless = 1;
221 fdata->nosavedpc = 1;
41abdfbd 222
34df79fc 223 if (target_read_memory (pc, buf, 4))
41abdfbd 224 return pc; /* Can't access it -- assume no prologue. */
41abdfbd
JG
225
226 /* Assume that subsequent fetches can fail with low probability. */
068c9fd6
MM
227 pc -= 4;
228 for (;;)
229 {
230 pc += 4;
231 op = read_memory_integer (pc, 4);
41abdfbd 232
068c9fd6
MM
233 if ((op & 0xfc1fffff) == 0x7c0802a6) { /* mflr Rx */
234 lr_reg = (op & 0x03e00000) | 0x90010000;
235 continue;
236
237 } else if ((op & 0xfc1fffff) == 0x7c000026) { /* mfcr Rx */
238 cr_reg = (op & 0x03e00000) | 0x90010000;
239 continue;
240
241 } else if ((op & 0xfc1f0000) == 0xd8010000) { /* stfd Rx,NUM(r1) */
242 reg = GET_SRC_REG (op);
243 if (fdata->saved_fpr == -1 || fdata->saved_fpr > reg) {
244 fdata->saved_fpr = reg;
4b4c6c96 245 fdata->fpr_offset = SIGNED_SHORT (op) + offset;
068c9fd6
MM
246 }
247 continue;
248
249 } else if (((op & 0xfc1f0000) == 0xbc010000) || /* stm Rx, NUM(r1) */
250 ((op & 0xfc1f0000) == 0x90010000 && /* st rx,NUM(r1), rx >= r13 */
251 (op & 0x03e00000) >= 0x01a00000)) {
252
253 reg = GET_SRC_REG (op);
254 if (fdata->saved_gpr == -1 || fdata->saved_gpr > reg) {
255 fdata->saved_gpr = reg;
4b4c6c96 256 fdata->gpr_offset = SIGNED_SHORT (op) + offset;
068c9fd6
MM
257 }
258 continue;
259
260 } else if ((op & 0xffff0000) == 0x3c000000) { /* addis 0,0,NUM, used for >= 32k frames */
261 fdata->offset = (op & 0x0000ffff) << 16;
65eaea27 262 fdata->frameless = 0;
068c9fd6
MM
263 continue;
264
265 } else if ((op & 0xffff0000) == 0x60000000) { /* ori 0,0,NUM, 2nd half of >= 32k frames */
266 fdata->offset |= (op & 0x0000ffff);
65eaea27 267 fdata->frameless = 0;
068c9fd6
MM
268 continue;
269
270 } else if ((op & 0xffff0000) == lr_reg) { /* st Rx,NUM(r1) where Rx == lr */
4b4c6c96 271 fdata->lr_offset = SIGNED_SHORT (op) + offset;
068c9fd6
MM
272 fdata->nosavedpc = 0;
273 lr_reg = 0;
274 continue;
275
276 } else if ((op & 0xffff0000) == cr_reg) { /* st Rx,NUM(r1) where Rx == cr */
4b4c6c96 277 fdata->cr_offset = SIGNED_SHORT (op) + offset;
068c9fd6
MM
278 cr_reg = 0;
279 continue;
280
4b4c6c96
MM
281 } else if (op == 0x48000005) { /* bl .+4 used in -mrelocatable */
282 continue;
283
65eaea27
JL
284 } else if (op == 0x48000004) { /* b .+4 (xlc) */
285 break;
286
4b4c6c96
MM
287 } else if (((op & 0xffff0000) == 0x801e0000 || /* lwz 0,NUM(r30), used in V.4 -mrelocatable */
288 op == 0x7fc0f214) && /* add r30,r0,r30, used in V.4 -mrelocatable */
289 lr_reg == 0x901e0000) {
290 continue;
291
292 } else if ((op & 0xffff0000) == 0x3fc00000 || /* addis 30,0,foo@ha, used in V.4 -mminimal-toc */
293 (op & 0xffff0000) == 0x3bde0000) { /* addi 30,30,foo@l */
294 continue;
295
068c9fd6 296 } else if ((op & 0xfc000000) == 0x48000000) { /* bl foo, to save fprs??? */
965dde97 297
65eaea27 298 fdata->frameless = 0;
965dde97
PS
299 /* Don't skip over the subroutine call if it is not within the first
300 three instructions of the prologue. */
301 if ((pc - orig_pc) > 8)
302 break;
303
068c9fd6
MM
304 op = read_memory_integer (pc+4, 4);
305
306 /* At this point, make sure this is not a trampoline function
307 (a function that simply calls another functions, and nothing else).
308 If the next is not a nop, this branch was part of the function
309 prologue. */
310
311 if (op == 0x4def7b82 || op == 0) /* crorc 15, 15, 15 */
965dde97 312 break; /* don't skip over this branch */
068c9fd6
MM
313
314 continue;
315
4b4c6c96 316 /* update stack pointer */
068c9fd6 317 } else if ((op & 0xffff0000) == 0x94210000) { /* stu r1,NUM(r1) */
65eaea27 318 fdata->frameless = 0;
4b4c6c96
MM
319 fdata->offset = SIGNED_SHORT (op);
320 offset = fdata->offset;
321 continue;
1eeba686 322
068c9fd6 323 } else if (op == 0x7c21016e) { /* stwux 1,1,0 */
65eaea27 324 fdata->frameless = 0;
4b4c6c96
MM
325 offset = fdata->offset;
326 continue;
41abdfbd 327
4b4c6c96 328 /* Load up minimal toc pointer */
65eaea27
JL
329 } else if ((op >> 22) == 0x20f
330 && ! minimal_toc_loaded) { /* l r31,... or l r30,... */
331 minimal_toc_loaded = 1;
4b4c6c96 332 continue;
cdb1cc92 333
4b4c6c96
MM
334 /* store parameters in stack */
335 } else if ((op & 0xfc1f0000) == 0x90010000 || /* st rx,NUM(r1) */
336 (op & 0xfc1f0000) == 0xd8010000 || /* stfd Rx,NUM(r1) */
337 (op & 0xfc1f0000) == 0xfc010000) { /* frsp, fp?,NUM(r1) */
338 continue;
e137e850 339
4b4c6c96
MM
340 /* store parameters in stack via frame pointer */
341 } else if (framep &&
342 (op & 0xfc1f0000) == 0x901f0000 || /* st rx,NUM(r1) */
343 (op & 0xfc1f0000) == 0xd81f0000 || /* stfd Rx,NUM(r1) */
344 (op & 0xfc1f0000) == 0xfc1f0000) { /* frsp, fp?,NUM(r1) */
345 continue;
e137e850 346
4b4c6c96
MM
347 /* Set up frame pointer */
348 } else if (op == 0x603f0000 /* oril r31, r1, 0x0 */
349 || op == 0x7c3f0b78) { /* mr r31, r1 */
65eaea27 350 fdata->frameless = 0;
4b4c6c96 351 framep = 1;
965dde97 352 fdata->alloca_reg = 31;
4b4c6c96 353 continue;
41abdfbd 354
65eaea27
JL
355 /* Another way to set up the frame pointer. */
356 } else if ((op & 0xfc1fffff) == 0x38010000) { /* addi rX, r1, 0x0 */
357 fdata->frameless = 0;
358 framep = 1;
359 fdata->alloca_reg = (op & ~0x38010000) >> 21;
360 continue;
361
4b4c6c96
MM
362 } else {
363 break;
364 }
41abdfbd 365 }
068c9fd6 366
507e4004
PB
367#if 0
368/* I have problems with skipping over __main() that I need to address
369 * sometime. Previously, I used to use misc_function_vector which
370 * didn't work as well as I wanted to be. -MGO */
371
372 /* If the first thing after skipping a prolog is a branch to a function,
373 this might be a call to an initializer in main(), introduced by gcc2.
374 We'd like to skip over it as well. Fortunately, xlc does some extra
375 work before calling a function right after a prologue, thus we can
376 single out such gcc2 behaviour. */
377
378
379 if ((op & 0xfc000001) == 0x48000001) { /* bl foo, an initializer function? */
380 op = read_memory_integer (pc+4, 4);
381
382 if (op == 0x4def7b82) { /* cror 0xf, 0xf, 0xf (nop) */
383
384 /* check and see if we are in main. If so, skip over this initializer
385 function as well. */
386
387 tmp = find_pc_misc_function (pc);
2e4964ad 388 if (tmp >= 0 && STREQ (misc_function_vector [tmp].name, "main"))
507e4004
PB
389 return pc + 8;
390 }
391 }
392#endif /* 0 */
393
4b4c6c96 394 fdata->offset = - fdata->offset;
41abdfbd
JG
395 return pc;
396}
397
818de002 398
41abdfbd
JG
399/*************************************************************************
400 Support for creating pushind a dummy frame into the stack, and popping
401 frames, etc.
402*************************************************************************/
403
818de002
PB
404/* The total size of dummy frame is 436, which is;
405
406 32 gpr's - 128 bytes
407 32 fpr's - 256 "
408 7 the rest - 28 "
409 and 24 extra bytes for the callee's link area. The last 24 bytes
410 for the link area might not be necessary, since it will be taken
411 care of by push_arguments(). */
412
413#define DUMMY_FRAME_SIZE 436
414
41abdfbd
JG
415#define DUMMY_FRAME_ADDR_SIZE 10
416
417/* Make sure you initialize these in somewhere, in case gdb gives up what it
818de002 418 was debugging and starts debugging something else. FIXMEibm */
41abdfbd
JG
419
420static int dummy_frame_count = 0;
421static int dummy_frame_size = 0;
422static CORE_ADDR *dummy_frame_addr = 0;
423
424extern int stop_stack_dummy;
425
426/* push a dummy frame into stack, save all register. Currently we are saving
427 only gpr's and fpr's, which is not good enough! FIXMEmgo */
428
ecf4059f 429void
41abdfbd
JG
430push_dummy_frame ()
431{
359a097f
JK
432 /* stack pointer. */
433 CORE_ADDR sp;
b112f2ae
JK
434 /* Same thing, target byte order. */
435 char sp_targ[4];
359a097f
JK
436
437 /* link register. */
438 CORE_ADDR pc;
439 /* Same thing, target byte order. */
440 char pc_targ[4];
441
3a4f9786
MT
442 /* Needed to figure out where to save the dummy link area.
443 FIXME: There should be an easier way to do this, no? tiemann 9/9/95. */
444 struct rs6000_framedata fdata;
445
41abdfbd
JG
446 int ii;
447
5f1c39ef 448 target_fetch_registers (-1);
6c6afbb9 449
41abdfbd
JG
450 if (dummy_frame_count >= dummy_frame_size) {
451 dummy_frame_size += DUMMY_FRAME_ADDR_SIZE;
452 if (dummy_frame_addr)
453 dummy_frame_addr = (CORE_ADDR*) xrealloc
454 (dummy_frame_addr, sizeof(CORE_ADDR) * (dummy_frame_size));
455 else
456 dummy_frame_addr = (CORE_ADDR*)
457 xmalloc (sizeof(CORE_ADDR) * (dummy_frame_size));
458 }
459
460 sp = read_register(SP_REGNUM);
359a097f 461 pc = read_register(PC_REGNUM);
5816555b 462 store_address (pc_targ, 4, pc);
41abdfbd 463
3a4f9786
MT
464 (void) skip_prologue (get_pc_function_start (pc) + FUNCTION_START_OFFSET, &fdata);
465
41abdfbd
JG
466 dummy_frame_addr [dummy_frame_count++] = sp;
467
468 /* Be careful! If the stack pointer is not decremented first, then kernel
6c6afbb9 469 thinks he is free to use the space underneath it. And kernel actually
41abdfbd
JG
470 uses that area for IPC purposes when executing ptrace(2) calls. So
471 before writing register values into the new frame, decrement and update
472 %sp first in order to secure your frame. */
473
3a4f9786
MT
474 /* FIXME: We don't check if the stack really has this much space.
475 This is a problem on the ppc simulator (which only grants one page
476 (4096 bytes) by default. */
477
818de002 478 write_register (SP_REGNUM, sp-DUMMY_FRAME_SIZE);
41abdfbd 479
41abdfbd
JG
480 /* gdb relies on the state of current_frame. We'd better update it,
481 otherwise things like do_registers_info() wouldn't work properly! */
482
483 flush_cached_frames ();
41abdfbd
JG
484
485 /* save program counter in link register's space. */
4f8710e6
PS
486 write_memory (sp + (fdata.lr_offset ? fdata.lr_offset : DEFAULT_LR_SAVE),
487 pc_targ, 4);
41abdfbd 488
6c6afbb9 489 /* save all floating point and general purpose registers here. */
41abdfbd
JG
490
491 /* fpr's, f0..f31 */
492 for (ii = 0; ii < 32; ++ii)
493 write_memory (sp-8-(ii*8), &registers[REGISTER_BYTE (31-ii+FP0_REGNUM)], 8);
494
495 /* gpr's r0..r31 */
496 for (ii=1; ii <=32; ++ii)
497 write_memory (sp-256-(ii*4), &registers[REGISTER_BYTE (32-ii)], 4);
498
818de002
PB
499 /* so far, 32*2 + 32 words = 384 bytes have been written.
500 7 extra registers in our register set: pc, ps, cnd, lr, cnt, xer, mq */
501
502 for (ii=1; ii <= (LAST_SP_REGNUM-FIRST_SP_REGNUM+1); ++ii) {
503 write_memory (sp-384-(ii*4),
504 &registers[REGISTER_BYTE (FPLAST_REGNUM + ii)], 4);
505 }
506
507 /* Save sp or so called back chain right here. */
b112f2ae
JK
508 store_address (sp_targ, 4, sp);
509 write_memory (sp-DUMMY_FRAME_SIZE, sp_targ, 4);
818de002 510 sp -= DUMMY_FRAME_SIZE;
41abdfbd
JG
511
512 /* And finally, this is the back chain. */
359a097f 513 write_memory (sp+8, pc_targ, 4);
41abdfbd
JG
514}
515
516
517/* Pop a dummy frame.
518
519 In rs6000 when we push a dummy frame, we save all of the registers. This
520 is usually done before user calls a function explicitly.
521
818de002
PB
522 After a dummy frame is pushed, some instructions are copied into stack,
523 and stack pointer is decremented even more. Since we don't have a frame
524 pointer to get back to the parent frame of the dummy, we start having
525 trouble poping it. Therefore, we keep a dummy frame stack, keeping
526 addresses of dummy frames as such. When poping happens and when we
527 detect that was a dummy frame, we pop it back to its parent by using
528 dummy frame stack (`dummy_frame_addr' array).
ecf4059f
JG
529
530FIXME: This whole concept is broken. You should be able to detect
531a dummy stack frame *on the user's stack itself*. When you do,
532then you know the format of that stack frame -- including its
533saved SP register! There should *not* be a separate stack in the
d6434f39 534GDB process that keeps track of these dummy frames! -- gnu@cygnus.com Aug92
41abdfbd
JG
535 */
536
537pop_dummy_frame ()
538{
539 CORE_ADDR sp, pc;
540 int ii;
541 sp = dummy_frame_addr [--dummy_frame_count];
542
543 /* restore all fpr's. */
544 for (ii = 1; ii <= 32; ++ii)
545 read_memory (sp-(ii*8), &registers[REGISTER_BYTE (32-ii+FP0_REGNUM)], 8);
546
547 /* restore all gpr's */
548 for (ii=1; ii <= 32; ++ii) {
549 read_memory (sp-256-(ii*4), &registers[REGISTER_BYTE (32-ii)], 4);
550 }
551
818de002
PB
552 /* restore the rest of the registers. */
553 for (ii=1; ii <=(LAST_SP_REGNUM-FIRST_SP_REGNUM+1); ++ii)
554 read_memory (sp-384-(ii*4),
555 &registers[REGISTER_BYTE (FPLAST_REGNUM + ii)], 4);
556
557 read_memory (sp-(DUMMY_FRAME_SIZE-8),
3a4f9786 558 &registers [REGISTER_BYTE(PC_REGNUM)], 4);
41abdfbd
JG
559
560 /* when a dummy frame was being pushed, we had to decrement %sp first, in
561 order to secure astack space. Thus, saved %sp (or %r1) value, is not the
562 one we should restore. Change it with the one we need. */
563
564 *(int*)&registers [REGISTER_BYTE(FP_REGNUM)] = sp;
565
566 /* Now we can restore all registers. */
567
5f1c39ef 568 target_store_registers (-1);
41abdfbd
JG
569 pc = read_pc ();
570 flush_cached_frames ();
41abdfbd
JG
571}
572
573
574/* pop the innermost frame, go back to the caller. */
575
ecf4059f 576void
41abdfbd
JG
577pop_frame ()
578{
359a097f 579 CORE_ADDR pc, lr, sp, prev_sp; /* %pc, %lr, %sp */
63641491 580 struct rs6000_framedata fdata;
669caa9c 581 struct frame_info *frame = get_current_frame ();
41abdfbd 582 int addr, ii;
41abdfbd
JG
583
584 pc = read_pc ();
669caa9c 585 sp = FRAME_FP (frame);
41abdfbd
JG
586
587 if (stop_stack_dummy && dummy_frame_count) {
588 pop_dummy_frame ();
589 return;
590 }
591
07aa9fdc
PS
592 /* Make sure that all registers are valid. */
593 read_register_bytes (0, NULL, REGISTER_BYTES);
594
41abdfbd
JG
595 /* figure out previous %pc value. If the function is frameless, it is
596 still in the link register, otherwise walk the frames and retrieve the
597 saved %pc value in the previous frame. */
598
34a1a3bf 599 addr = get_pc_function_start (frame->pc) + FUNCTION_START_OFFSET;
068c9fd6 600 (void) skip_prologue (addr, &fdata);
41abdfbd 601
6c6afbb9 602 if (fdata.frameless)
07aa9fdc
PS
603 prev_sp = sp;
604 else
605 prev_sp = read_memory_integer (sp, 4);
068c9fd6 606 if (fdata.lr_offset == 0)
41abdfbd
JG
607 lr = read_register (LR_REGNUM);
608 else
068c9fd6 609 lr = read_memory_integer (prev_sp + fdata.lr_offset, 4);
41abdfbd
JG
610
611 /* reset %pc value. */
612 write_register (PC_REGNUM, lr);
613
614 /* reset register values if any was saved earlier. */
6c6afbb9 615 addr = prev_sp - fdata.offset;
41abdfbd 616
6c6afbb9 617 if (fdata.saved_gpr != -1)
669caa9c 618 for (ii = fdata.saved_gpr; ii <= 31; ++ii) {
41abdfbd 619 read_memory (addr, &registers [REGISTER_BYTE (ii)], 4);
cdb1cc92 620 addr += 4;
41abdfbd
JG
621 }
622
6c6afbb9 623 if (fdata.saved_fpr != -1)
669caa9c 624 for (ii = fdata.saved_fpr; ii <= 31; ++ii) {
41abdfbd
JG
625 read_memory (addr, &registers [REGISTER_BYTE (ii+FP0_REGNUM)], 8);
626 addr += 8;
627 }
628
629 write_register (SP_REGNUM, prev_sp);
5f1c39ef 630 target_store_registers (-1);
41abdfbd 631 flush_cached_frames ();
41abdfbd
JG
632}
633
41abdfbd
JG
634/* fixup the call sequence of a dummy function, with the real function address.
635 its argumets will be passed by gdb. */
636
ecf4059f 637void
cd8a3d84
SS
638fix_call_dummy (dummyname, pc, fun, nargs, type)
639 char *dummyname;
640 CORE_ADDR pc;
641 CORE_ADDR fun;
642 int nargs; /* not used */
643 int type; /* not used */
41abdfbd
JG
644{
645#define TOC_ADDR_OFFSET 20
646#define TARGET_ADDR_OFFSET 28
647
648 int ii;
ecf4059f
JG
649 CORE_ADDR target_addr;
650 CORE_ADDR tocvalue;
41abdfbd
JG
651
652 target_addr = fun;
653 tocvalue = find_toc_address (target_addr);
654
655 ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET);
656 ii = (ii & 0xffff0000) | (tocvalue >> 16);
657 *(int*)((char*)dummyname + TOC_ADDR_OFFSET) = ii;
658
659 ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET+4);
660 ii = (ii & 0xffff0000) | (tocvalue & 0x0000ffff);
661 *(int*)((char*)dummyname + TOC_ADDR_OFFSET+4) = ii;
662
663 ii = *(int*)((char*)dummyname + TARGET_ADDR_OFFSET);
664 ii = (ii & 0xffff0000) | (target_addr >> 16);
665 *(int*)((char*)dummyname + TARGET_ADDR_OFFSET) = ii;
666
667 ii = *(int*)((char*)dummyname + TARGET_ADDR_OFFSET+4);
668 ii = (ii & 0xffff0000) | (target_addr & 0x0000ffff);
669 *(int*)((char*)dummyname + TARGET_ADDR_OFFSET+4) = ii;
670}
671
cd8a3d84
SS
672/* Pass the arguments in either registers, or in the stack. In RS6000,
673 the first eight words of the argument list (that might be less than
674 eight parameters if some parameters occupy more than one word) are
675 passed in r3..r11 registers. float and double parameters are
676 passed in fpr's, in addition to that. Rest of the parameters if any
677 are passed in user stack. There might be cases in which half of the
678 parameter is copied into registers, the other half is pushed into
41abdfbd
JG
679 stack.
680
681 If the function is returning a structure, then the return address is passed
682 in r3, then the first 7 words of the parametes can be passed in registers,
683 starting from r4. */
684
685CORE_ADDR
686push_arguments (nargs, args, sp, struct_return, struct_addr)
cd8a3d84
SS
687 int nargs;
688 value_ptr *args;
689 CORE_ADDR sp;
690 int struct_return;
691 CORE_ADDR struct_addr;
41abdfbd
JG
692{
693 int ii, len;
694 int argno; /* current argument number */
695 int argbytes; /* current argument byte */
696 char tmp_buffer [50];
17221e41 697 value_ptr arg;
41abdfbd
JG
698 int f_argno = 0; /* current floating point argno */
699
700 CORE_ADDR saved_sp, pc;
701
702 if ( dummy_frame_count <= 0)
199b2450 703 printf_unfiltered ("FATAL ERROR -push_arguments()! frame not found!!\n");
41abdfbd
JG
704
705 /* The first eight words of ther arguments are passed in registers. Copy
706 them appropriately.
707
708 If the function is returning a `struct', then the first word (which
709 will be passed in r3) is used for struct return address. In that
710 case we should advance one word and start from r4 register to copy
711 parameters. */
712
713 ii = struct_return ? 1 : 0;
714
715 for (argno=0, argbytes=0; argno < nargs && ii<8; ++ii) {
716
5222ca60 717 arg = args[argno];
41abdfbd
JG
718 len = TYPE_LENGTH (VALUE_TYPE (arg));
719
720 if (TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_FLT) {
721
722 /* floating point arguments are passed in fpr's, as well as gpr's.
723 There are 13 fpr's reserved for passing parameters. At this point
724 there is no way we would run out of them. */
725
726 if (len > 8)
199b2450 727 printf_unfiltered (
41abdfbd
JG
728"Fatal Error: a floating point parameter #%d with a size > 8 is found!\n", argno);
729
ade40d31
RP
730 memcpy (&registers[REGISTER_BYTE(FP0_REGNUM + 1 + f_argno)], VALUE_CONTENTS (arg),
731 len);
41abdfbd
JG
732 ++f_argno;
733 }
734
735 if (len > 4) {
736
737 /* Argument takes more than one register. */
738 while (argbytes < len) {
739
740 *(int*)&registers[REGISTER_BYTE(ii+3)] = 0;
ade40d31
RP
741 memcpy (&registers[REGISTER_BYTE(ii+3)],
742 ((char*)VALUE_CONTENTS (arg))+argbytes,
41abdfbd
JG
743 (len - argbytes) > 4 ? 4 : len - argbytes);
744 ++ii, argbytes += 4;
745
746 if (ii >= 8)
747 goto ran_out_of_registers_for_arguments;
748 }
749 argbytes = 0;
750 --ii;
751 }
752 else { /* Argument can fit in one register. No problem. */
753 *(int*)&registers[REGISTER_BYTE(ii+3)] = 0;
ade40d31 754 memcpy (&registers[REGISTER_BYTE(ii+3)], VALUE_CONTENTS (arg), len);
41abdfbd
JG
755 }
756 ++argno;
757 }
758
759ran_out_of_registers_for_arguments:
760
761 /* location for 8 parameters are always reserved. */
762 sp -= 4 * 8;
763
764 /* another six words for back chain, TOC register, link register, etc. */
765 sp -= 24;
766
767 /* if there are more arguments, allocate space for them in
768 the stack, then push them starting from the ninth one. */
769
770 if ((argno < nargs) || argbytes) {
771 int space = 0, jj;
17221e41 772 value_ptr val;
41abdfbd
JG
773
774 if (argbytes) {
775 space += ((len - argbytes + 3) & -4);
776 jj = argno + 1;
777 }
778 else
779 jj = argno;
780
781 for (; jj < nargs; ++jj) {
5222ca60 782 val = args[jj];
41abdfbd
JG
783 space += ((TYPE_LENGTH (VALUE_TYPE (val))) + 3) & -4;
784 }
785
786 /* add location required for the rest of the parameters */
787 space = (space + 7) & -8;
788 sp -= space;
789
790 /* This is another instance we need to be concerned about securing our
791 stack space. If we write anything underneath %sp (r1), we might conflict
792 with the kernel who thinks he is free to use this area. So, update %sp
793 first before doing anything else. */
794
795 write_register (SP_REGNUM, sp);
796
41abdfbd
JG
797 /* if the last argument copied into the registers didn't fit there
798 completely, push the rest of it into stack. */
799
800 if (argbytes) {
801 write_memory (
802 sp+24+(ii*4), ((char*)VALUE_CONTENTS (arg))+argbytes, len - argbytes);
803 ++argno;
804 ii += ((len - argbytes + 3) & -4) / 4;
805 }
806
807 /* push the rest of the arguments into stack. */
808 for (; argno < nargs; ++argno) {
809
5222ca60 810 arg = args[argno];
41abdfbd
JG
811 len = TYPE_LENGTH (VALUE_TYPE (arg));
812
813
814 /* float types should be passed in fpr's, as well as in the stack. */
815 if (TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_FLT && f_argno < 13) {
816
817 if (len > 8)
199b2450 818 printf_unfiltered (
41abdfbd
JG
819"Fatal Error: a floating point parameter #%d with a size > 8 is found!\n", argno);
820
ade40d31
RP
821 memcpy (&registers[REGISTER_BYTE(FP0_REGNUM + 1 + f_argno)], VALUE_CONTENTS (arg),
822 len);
41abdfbd
JG
823 ++f_argno;
824 }
825
359a097f 826 write_memory (sp+24+(ii*4), (char *) VALUE_CONTENTS (arg), len);
41abdfbd
JG
827 ii += ((len + 3) & -4) / 4;
828 }
829 }
6c6afbb9 830 else
41abdfbd
JG
831 /* Secure stack areas first, before doing anything else. */
832 write_register (SP_REGNUM, sp);
833
41abdfbd
JG
834 saved_sp = dummy_frame_addr [dummy_frame_count - 1];
835 read_memory (saved_sp, tmp_buffer, 24);
836 write_memory (sp, tmp_buffer, 24);
837
b112f2ae
JK
838 /* set back chain properly */
839 store_address (tmp_buffer, 4, saved_sp);
840 write_memory (sp, tmp_buffer, 4);
41abdfbd 841
5f1c39ef 842 target_store_registers (-1);
41abdfbd
JG
843 return sp;
844}
845
846/* a given return value in `regbuf' with a type `valtype', extract and copy its
847 value into `valbuf' */
848
ecf4059f 849void
41abdfbd 850extract_return_value (valtype, regbuf, valbuf)
cd8a3d84
SS
851 struct type *valtype;
852 char regbuf[REGISTER_BYTES];
853 char *valbuf;
41abdfbd 854{
07781ac0 855 int offset = 0;
41abdfbd
JG
856
857 if (TYPE_CODE (valtype) == TYPE_CODE_FLT) {
858
859 double dd; float ff;
860 /* floats and doubles are returned in fpr1. fpr's have a size of 8 bytes.
861 We need to truncate the return value into float size (4 byte) if
862 necessary. */
863
864 if (TYPE_LENGTH (valtype) > 4) /* this is a double */
ade40d31 865 memcpy (valbuf, &regbuf[REGISTER_BYTE (FP0_REGNUM + 1)],
41abdfbd
JG
866 TYPE_LENGTH (valtype));
867 else { /* float */
ade40d31 868 memcpy (&dd, &regbuf[REGISTER_BYTE (FP0_REGNUM + 1)], 8);
41abdfbd 869 ff = (float)dd;
ade40d31 870 memcpy (valbuf, &ff, sizeof(float));
41abdfbd
JG
871 }
872 }
07781ac0 873 else {
41abdfbd 874 /* return value is copied starting from r3. */
07781ac0
PS
875 if (TARGET_BYTE_ORDER == BIG_ENDIAN
876 && TYPE_LENGTH (valtype) < REGISTER_RAW_SIZE (3))
877 offset = REGISTER_RAW_SIZE (3) - TYPE_LENGTH (valtype);
878
879 memcpy (valbuf, regbuf + REGISTER_BYTE (3) + offset,
880 TYPE_LENGTH (valtype));
881 }
41abdfbd
JG
882}
883
884
ecf4059f
JG
885/* keep structure return address in this variable.
886 FIXME: This is a horrid kludge which should not be allowed to continue
887 living. This only allows a single nested call to a structure-returning
888 function. Come on, guys! -- gnu@cygnus.com, Aug 92 */
41abdfbd
JG
889
890CORE_ADDR rs6000_struct_return_address;
891
892
c2e4669f
JG
893/* Indirect function calls use a piece of trampoline code to do context
894 switching, i.e. to set the new TOC table. Skip such code if we are on
895 its first instruction (as when we have single-stepped to here).
07aa9fdc
PS
896 Also skip shared library trampoline code (which is different from
897 indirect function call trampolines).
c2e4669f
JG
898 Result is desired PC to step until, or NULL if we are not in
899 trampoline code. */
41abdfbd 900
ecf4059f 901CORE_ADDR
41abdfbd 902skip_trampoline_code (pc)
cd8a3d84 903 CORE_ADDR pc;
41abdfbd
JG
904{
905 register unsigned int ii, op;
07aa9fdc 906 CORE_ADDR solib_target_pc;
41abdfbd
JG
907
908 static unsigned trampoline_code[] = {
909 0x800b0000, /* l r0,0x0(r11) */
910 0x90410014, /* st r2,0x14(r1) */
911 0x7c0903a6, /* mtctr r0 */
912 0x804b0004, /* l r2,0x4(r11) */
913 0x816b0008, /* l r11,0x8(r11) */
914 0x4e800420, /* bctr */
915 0x4e800020, /* br */
916 0
917 };
918
07aa9fdc
PS
919 /* If pc is in a shared library trampoline, return its target. */
920 solib_target_pc = find_solib_trampoline_target (pc);
921 if (solib_target_pc)
922 return solib_target_pc;
923
41abdfbd
JG
924 for (ii=0; trampoline_code[ii]; ++ii) {
925 op = read_memory_integer (pc + (ii*4), 4);
926 if (op != trampoline_code [ii])
359a097f 927 return 0;
41abdfbd
JG
928 }
929 ii = read_register (11); /* r11 holds destination addr */
930 pc = read_memory_integer (ii, 4); /* (r11) value */
931 return pc;
932}
933
068c9fd6 934/* Determines whether the function FI has a frame on the stack or not. */
cd8a3d84 935
ecf4059f 936int
068c9fd6
MM
937frameless_function_invocation (fi)
938 struct frame_info *fi;
ecf4059f
JG
939{
940 CORE_ADDR func_start;
63641491 941 struct rs6000_framedata fdata;
ecf4059f 942
b0e932ad
JK
943 if (fi->next != NULL)
944 /* Don't even think about framelessness except on the innermost frame. */
3f528883
JK
945 /* FIXME: Can also be frameless if fi->next->signal_handler_caller (if
946 a signal happens while executing in a frameless function). */
b0e932ad
JK
947 return 0;
948
ecf4059f
JG
949 func_start = get_pc_function_start (fi->pc) + FUNCTION_START_OFFSET;
950
951 /* If we failed to find the start of the function, it is a mistake
952 to inspect the instructions. */
953
954 if (!func_start)
955 return 0;
956
068c9fd6
MM
957 (void) skip_prologue (func_start, &fdata);
958 return fdata.frameless;
ecf4059f
JG
959}
960
068c9fd6 961/* Return the PC saved in a frame */
cd8a3d84 962
068c9fd6
MM
963unsigned long
964frame_saved_pc (fi)
965 struct frame_info *fi;
966{
967 CORE_ADDR func_start;
968 struct rs6000_framedata fdata;
969 int frameless;
970
965dde97
PS
971 if (fi->signal_handler_caller)
972 return read_memory_integer (fi->frame + SIG_FRAME_PC_OFFSET, 4);
973
068c9fd6
MM
974 func_start = get_pc_function_start (fi->pc) + FUNCTION_START_OFFSET;
975
976 /* If we failed to find the start of the function, it is a mistake
977 to inspect the instructions. */
978 if (!func_start)
979 return 0;
980
981 (void) skip_prologue (func_start, &fdata);
068c9fd6 982
4b4c6c96
MM
983 if (fdata.lr_offset == 0 && fi->next != NULL)
984 return read_memory_integer (rs6000_frame_chain (fi) + DEFAULT_LR_SAVE, 4);
985
986 if (fdata.lr_offset == 0)
987 return read_register (LR_REGNUM);
988
068c9fd6
MM
989 return read_memory_integer (rs6000_frame_chain (fi) + fdata.lr_offset, 4);
990}
ecf4059f
JG
991
992/* If saved registers of frame FI are not known yet, read and cache them.
63641491 993 &FDATAP contains rs6000_framedata; TDATAP can be NULL,
ecf4059f
JG
994 in which case the framedata are read. */
995
996static void
997frame_get_cache_fsr (fi, fdatap)
998 struct frame_info *fi;
63641491 999 struct rs6000_framedata *fdatap;
ecf4059f
JG
1000{
1001 int ii;
1002 CORE_ADDR frame_addr;
63641491 1003 struct rs6000_framedata work_fdata;
ecf4059f
JG
1004
1005 if (fi->cache_fsr)
1006 return;
1007
1008 if (fdatap == NULL) {
1009 fdatap = &work_fdata;
068c9fd6 1010 (void) skip_prologue (get_pc_function_start (fi->pc), fdatap);
ecf4059f
JG
1011 }
1012
1013 fi->cache_fsr = (struct frame_saved_regs *)
1014 obstack_alloc (&frame_cache_obstack, sizeof (struct frame_saved_regs));
4ed97c9a 1015 memset (fi->cache_fsr, '\0', sizeof (struct frame_saved_regs));
ecf4059f
JG
1016
1017 if (fi->prev && fi->prev->frame)
1018 frame_addr = fi->prev->frame;
1019 else
1020 frame_addr = read_memory_integer (fi->frame, 4);
1021
1022 /* if != -1, fdatap->saved_fpr is the smallest number of saved_fpr.
965dde97 1023 All fpr's from saved_fpr to fp31 are saved. */
ecf4059f
JG
1024
1025 if (fdatap->saved_fpr >= 0) {
965dde97
PS
1026 int fpr_offset = frame_addr + fdatap->fpr_offset;
1027 for (ii = fdatap->saved_fpr; ii < 32; ii++) {
1028 fi->cache_fsr->regs [FP0_REGNUM + ii] = fpr_offset;
1029 fpr_offset += 8;
1030 }
ecf4059f
JG
1031 }
1032
1033 /* if != -1, fdatap->saved_gpr is the smallest number of saved_gpr.
965dde97 1034 All gpr's from saved_gpr to gpr31 are saved. */
ecf4059f 1035
965dde97
PS
1036 if (fdatap->saved_gpr >= 0) {
1037 int gpr_offset = frame_addr + fdatap->gpr_offset;
1038 for (ii = fdatap->saved_gpr; ii < 32; ii++) {
1039 fi->cache_fsr->regs [ii] = gpr_offset;
1040 gpr_offset += 4;
1041 }
1042 }
1043
1044 /* If != 0, fdatap->cr_offset is the offset from the frame that holds
1045 the CR. */
1046 if (fdatap->cr_offset != 0)
1047 fi->cache_fsr->regs [CR_REGNUM] = frame_addr + fdatap->cr_offset;
1048
1049 /* If != 0, fdatap->lr_offset is the offset from the frame that holds
1050 the LR. */
1051 if (fdatap->lr_offset != 0)
1052 fi->cache_fsr->regs [LR_REGNUM] = frame_addr + fdatap->lr_offset;
ecf4059f
JG
1053}
1054
1055/* Return the address of a frame. This is the inital %sp value when the frame
1056 was first allocated. For functions calling alloca(), it might be saved in
1057 an alloca register. */
1058
1059CORE_ADDR
1060frame_initial_stack_address (fi)
1061 struct frame_info *fi;
1062{
1063 CORE_ADDR tmpaddr;
63641491 1064 struct rs6000_framedata fdata;
ecf4059f
JG
1065 struct frame_info *callee_fi;
1066
1067 /* if the initial stack pointer (frame address) of this frame is known,
1068 just return it. */
1069
1070 if (fi->initial_sp)
1071 return fi->initial_sp;
1072
1073 /* find out if this function is using an alloca register.. */
1074
068c9fd6 1075 (void) skip_prologue (get_pc_function_start (fi->pc), &fdata);
ecf4059f
JG
1076
1077 /* if saved registers of this frame are not known yet, read and cache them. */
1078
1079 if (!fi->cache_fsr)
1080 frame_get_cache_fsr (fi, &fdata);
1081
1082 /* If no alloca register used, then fi->frame is the value of the %sp for
1083 this frame, and it is good enough. */
1084
1085 if (fdata.alloca_reg < 0) {
1086 fi->initial_sp = fi->frame;
1087 return fi->initial_sp;
1088 }
1089
1090 /* This function has an alloca register. If this is the top-most frame
1091 (with the lowest address), the value in alloca register is good. */
1092
1093 if (!fi->next)
1094 return fi->initial_sp = read_register (fdata.alloca_reg);
1095
1096 /* Otherwise, this is a caller frame. Callee has usually already saved
1097 registers, but there are exceptions (such as when the callee
1098 has no parameters). Find the address in which caller's alloca
1099 register is saved. */
1100
1101 for (callee_fi = fi->next; callee_fi; callee_fi = callee_fi->next) {
1102
1103 if (!callee_fi->cache_fsr)
cdb1cc92 1104 frame_get_cache_fsr (callee_fi, NULL);
ecf4059f
JG
1105
1106 /* this is the address in which alloca register is saved. */
1107
1108 tmpaddr = callee_fi->cache_fsr->regs [fdata.alloca_reg];
1109 if (tmpaddr) {
1110 fi->initial_sp = read_memory_integer (tmpaddr, 4);
1111 return fi->initial_sp;
1112 }
1113
1114 /* Go look into deeper levels of the frame chain to see if any one of
1115 the callees has saved alloca register. */
1116 }
1117
1118 /* If alloca register was not saved, by the callee (or any of its callees)
1119 then the value in the register is still good. */
1120
1121 return fi->initial_sp = read_register (fdata.alloca_reg);
1122}
1123
669caa9c 1124CORE_ADDR
f3649227
JK
1125rs6000_frame_chain (thisframe)
1126 struct frame_info *thisframe;
1127{
669caa9c 1128 CORE_ADDR fp;
f3649227
JK
1129 if (inside_entry_file ((thisframe)->pc))
1130 return 0;
cee86be3 1131 if (thisframe->signal_handler_caller)
9ed8604f 1132 fp = read_memory_integer (thisframe->frame + SIG_FRAME_FP_OFFSET, 4);
cee86be3
JK
1133 else
1134 fp = read_memory_integer ((thisframe)->frame, 4);
1135
f3649227
JK
1136 return fp;
1137}
ecf4059f
JG
1138\f
1139/* Keep an array of load segment information and their TOC table addresses.
1140 This info will be useful when calling a shared library function by hand. */
1141
1142struct loadinfo {
1143 CORE_ADDR textorg, dataorg;
1144 unsigned long toc_offset;
1145};
1146
1147#define LOADINFOLEN 10
1148
ecf4059f
JG
1149static struct loadinfo *loadinfo = NULL;
1150static int loadinfolen = 0;
1151static int loadinfotocindex = 0;
3c02636b 1152static int loadinfotextindex = 0;
ecf4059f
JG
1153
1154
1155void
1156xcoff_init_loadinfo ()
1157{
1158 loadinfotocindex = 0;
1159 loadinfotextindex = 0;
1160
1161 if (loadinfolen == 0) {
1162 loadinfo = (struct loadinfo *)
1163 xmalloc (sizeof (struct loadinfo) * LOADINFOLEN);
1164 loadinfolen = LOADINFOLEN;
1165 }
1166}
1167
1168
1169/* FIXME -- this is never called! */
1170void
1171free_loadinfo ()
1172{
1173 if (loadinfo)
1174 free (loadinfo);
1175 loadinfo = NULL;
1176 loadinfolen = 0;
1177 loadinfotocindex = 0;
1178 loadinfotextindex = 0;
1179}
1180
1181/* this is called from xcoffread.c */
1182
1183void
07dc1e42
MM
1184xcoff_add_toc_to_loadinfo (tocoff)
1185 unsigned long tocoff;
ecf4059f
JG
1186{
1187 while (loadinfotocindex >= loadinfolen) {
1188 loadinfolen += LOADINFOLEN;
1189 loadinfo = (struct loadinfo *)
1190 xrealloc (loadinfo, sizeof(struct loadinfo) * loadinfolen);
1191 }
1192 loadinfo [loadinfotocindex++].toc_offset = tocoff;
1193}
1194
2aefe6e4 1195void
ecf4059f
JG
1196add_text_to_loadinfo (textaddr, dataaddr)
1197 CORE_ADDR textaddr;
1198 CORE_ADDR dataaddr;
1199{
1200 while (loadinfotextindex >= loadinfolen) {
1201 loadinfolen += LOADINFOLEN;
1202 loadinfo = (struct loadinfo *)
1203 xrealloc (loadinfo, sizeof(struct loadinfo) * loadinfolen);
1204 }
1205 loadinfo [loadinfotextindex].textorg = textaddr;
1206 loadinfo [loadinfotextindex].dataorg = dataaddr;
1207 ++loadinfotextindex;
1208}
1209
1210
cd8a3d84
SS
1211/* Note that this assumes that the "textorg" and "dataorg" elements of
1212 a member of this array are correlated with the "toc_offset" element
1213 of the same member. This is taken care of because the loops which
1214 assign the former (in xcoff_relocate_symtab or xcoff_relocate_core)
1215 and the latter (in scan_xcoff_symtab, via vmap_symtab, in
1216 vmap_ldinfo or xcoff_relocate_core) traverse the same objfiles in
1217 the same order. */
ecf4059f
JG
1218
1219static CORE_ADDR
1220find_toc_address (pc)
1221 CORE_ADDR pc;
1222{
1223 int ii, toc_entry, tocbase = 0;
1224
65eaea27 1225 toc_entry = -1;
ecf4059f
JG
1226 for (ii=0; ii < loadinfotextindex; ++ii)
1227 if (pc > loadinfo[ii].textorg && loadinfo[ii].textorg > tocbase) {
1228 toc_entry = ii;
1229 tocbase = loadinfo[ii].textorg;
1230 }
1231
65eaea27
JL
1232 if (toc_entry == -1)
1233 error ("Unable to find TOC entry for pc 0x%x\n", pc);
ecf4059f
JG
1234 return loadinfo[toc_entry].dataorg + loadinfo[toc_entry].toc_offset;
1235}
18b46e7c 1236
65eaea27
JL
1237/* Return nonzero if ADDR (a function pointer) is in the data space and
1238 is therefore a special function pointer. */
1239
1240int
1241is_magic_function_pointer (addr)
1242 CORE_ADDR addr;
1243{
1244 struct obj_section *s;
1245
1246 s = find_pc_section (addr);
1247 if (s && s->the_bfd_section->flags & SEC_CODE)
1248 return 0;
1249 else
1250 return 1;
1251}
1252
5c172b4b
MM
1253#ifdef GDB_TARGET_POWERPC
1254int
1255gdb_print_insn_powerpc (memaddr, info)
1256 bfd_vma memaddr;
1257 disassemble_info *info;
1258{
1259 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1260 return print_insn_big_powerpc (memaddr, info);
1261 else
1262 return print_insn_little_powerpc (memaddr, info);
1263}
1264#endif
1265
18b46e7c
SS
1266void
1267_initialize_rs6000_tdep ()
1268{
1269 /* FIXME, this should not be decided via ifdef. */
1270#ifdef GDB_TARGET_POWERPC
5c172b4b 1271 tm_print_insn = gdb_print_insn_powerpc;
18b46e7c
SS
1272#else
1273 tm_print_insn = print_insn_rs6000;
1274#endif
1275}
This page took 0.305076 seconds and 4 git commands to generate.