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