2003-05-15 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / ia64-tdep.c
CommitLineData
16461d7d 1/* Target-dependent code for the IA-64 for GDB, the GNU debugger.
ca557f44 2
51603483 3 Copyright 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
16461d7d
KB
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22#include "defs.h"
23#include "inferior.h"
24#include "symfile.h" /* for entry_point_address */
25#include "gdbcore.h"
8064c6ae 26#include "arch-utils.h"
16461d7d 27#include "floatformat.h"
4e052eda 28#include "regcache.h"
d16aafd8 29#include "doublest.h"
fd0407d6 30#include "value.h"
16461d7d
KB
31
32#include "objfiles.h"
33#include "elf/common.h" /* for DT_PLTGOT value */
244bc108 34#include "elf-bfd.h"
16461d7d 35
698cb3f0
KB
36/* Hook for determining the global pointer when calling functions in
37 the inferior under AIX. The initialization code in ia64-aix-nat.c
38 sets this hook to the address of a function which will find the
39 global pointer for a given address.
40
41 The generic code which uses the dynamic section in the inferior for
42 finding the global pointer is not of much use on AIX since the
43 values obtained from the inferior have not been relocated. */
44
45CORE_ADDR (*native_find_global_pointer) (CORE_ADDR) = 0;
46
47/* An enumeration of the different IA-64 instruction types. */
48
16461d7d
KB
49typedef enum instruction_type
50{
51 A, /* Integer ALU ; I-unit or M-unit */
52 I, /* Non-ALU integer; I-unit */
53 M, /* Memory ; M-unit */
54 F, /* Floating-point ; F-unit */
55 B, /* Branch ; B-unit */
56 L, /* Extended (L+X) ; I-unit */
57 X, /* Extended (L+X) ; I-unit */
58 undefined /* undefined or reserved */
59} instruction_type;
60
61/* We represent IA-64 PC addresses as the value of the instruction
62 pointer or'd with some bit combination in the low nibble which
63 represents the slot number in the bundle addressed by the
64 instruction pointer. The problem is that the Linux kernel
65 multiplies its slot numbers (for exceptions) by one while the
66 disassembler multiplies its slot numbers by 6. In addition, I've
67 heard it said that the simulator uses 1 as the multiplier.
68
69 I've fixed the disassembler so that the bytes_per_line field will
70 be the slot multiplier. If bytes_per_line comes in as zero, it
71 is set to six (which is how it was set up initially). -- objdump
72 displays pretty disassembly dumps with this value. For our purposes,
73 we'll set bytes_per_line to SLOT_MULTIPLIER. This is okay since we
74 never want to also display the raw bytes the way objdump does. */
75
76#define SLOT_MULTIPLIER 1
77
78/* Length in bytes of an instruction bundle */
79
80#define BUNDLE_LEN 16
81
d7fa2ae2 82/* FIXME: These extern declarations should go in ia64-tdep.h. */
244bc108 83extern CORE_ADDR ia64_linux_sigcontext_register_address (CORE_ADDR, int);
d7fa2ae2 84extern CORE_ADDR ia64_aix_sigcontext_register_address (CORE_ADDR, int);
244bc108 85
16461d7d
KB
86static gdbarch_init_ftype ia64_gdbarch_init;
87
88static gdbarch_register_name_ftype ia64_register_name;
89static gdbarch_register_raw_size_ftype ia64_register_raw_size;
90static gdbarch_register_virtual_size_ftype ia64_register_virtual_size;
91static gdbarch_register_virtual_type_ftype ia64_register_virtual_type;
92static gdbarch_register_byte_ftype ia64_register_byte;
93static gdbarch_breakpoint_from_pc_ftype ia64_breakpoint_from_pc;
16461d7d 94static gdbarch_skip_prologue_ftype ia64_skip_prologue;
26e9b323
AC
95static gdbarch_deprecated_extract_return_value_ftype ia64_extract_return_value;
96static gdbarch_deprecated_extract_struct_value_address_ftype ia64_extract_struct_value_address;
16461d7d
KB
97static gdbarch_use_struct_convention_ftype ia64_use_struct_convention;
98static gdbarch_frameless_function_invocation_ftype ia64_frameless_function_invocation;
6913c89a 99static gdbarch_deprecated_saved_pc_after_call_ftype ia64_saved_pc_after_call;
16461d7d 100static void ia64_pop_frame_regular (struct frame_info *frame);
64a5b29c 101static struct type *is_float_or_hfa_type (struct type *t);
16461d7d
KB
102
103static int ia64_num_regs = 590;
104
105static int pc_regnum = IA64_IP_REGNUM;
106static int sp_regnum = IA64_GR12_REGNUM;
107static int fp_regnum = IA64_VFP_REGNUM;
108static int lr_regnum = IA64_VRAP_REGNUM;
109
110static LONGEST ia64_call_dummy_words[] = {0};
111
112/* Array of register names; There should be ia64_num_regs strings in
113 the initializer. */
114
115static char *ia64_register_names[] =
116{ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
117 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
118 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
119 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
120 "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
121 "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
122 "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
123 "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
124 "r64", "r65", "r66", "r67", "r68", "r69", "r70", "r71",
125 "r72", "r73", "r74", "r75", "r76", "r77", "r78", "r79",
126 "r80", "r81", "r82", "r83", "r84", "r85", "r86", "r87",
127 "r88", "r89", "r90", "r91", "r92", "r93", "r94", "r95",
128 "r96", "r97", "r98", "r99", "r100", "r101", "r102", "r103",
129 "r104", "r105", "r106", "r107", "r108", "r109", "r110", "r111",
130 "r112", "r113", "r114", "r115", "r116", "r117", "r118", "r119",
131 "r120", "r121", "r122", "r123", "r124", "r125", "r126", "r127",
132
133 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
134 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
135 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
136 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
137 "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
138 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
139 "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
140 "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
141 "f64", "f65", "f66", "f67", "f68", "f69", "f70", "f71",
142 "f72", "f73", "f74", "f75", "f76", "f77", "f78", "f79",
143 "f80", "f81", "f82", "f83", "f84", "f85", "f86", "f87",
144 "f88", "f89", "f90", "f91", "f92", "f93", "f94", "f95",
145 "f96", "f97", "f98", "f99", "f100", "f101", "f102", "f103",
146 "f104", "f105", "f106", "f107", "f108", "f109", "f110", "f111",
147 "f112", "f113", "f114", "f115", "f116", "f117", "f118", "f119",
148 "f120", "f121", "f122", "f123", "f124", "f125", "f126", "f127",
149
150 "p0", "p1", "p2", "p3", "p4", "p5", "p6", "p7",
151 "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15",
152 "p16", "p17", "p18", "p19", "p20", "p21", "p22", "p23",
153 "p24", "p25", "p26", "p27", "p28", "p29", "p30", "p31",
154 "p32", "p33", "p34", "p35", "p36", "p37", "p38", "p39",
155 "p40", "p41", "p42", "p43", "p44", "p45", "p46", "p47",
156 "p48", "p49", "p50", "p51", "p52", "p53", "p54", "p55",
157 "p56", "p57", "p58", "p59", "p60", "p61", "p62", "p63",
158
159 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
160
161 "vfp", "vrap",
162
163 "pr", "ip", "psr", "cfm",
164
165 "kr0", "kr1", "kr2", "kr3", "kr4", "kr5", "kr6", "kr7",
166 "", "", "", "", "", "", "", "",
167 "rsc", "bsp", "bspstore", "rnat",
168 "", "fcr", "", "",
169 "eflag", "csd", "ssd", "cflg", "fsr", "fir", "fdr", "",
170 "ccv", "", "", "", "unat", "", "", "",
171 "fpsr", "", "", "", "itc",
172 "", "", "", "", "", "", "", "", "", "",
173 "", "", "", "", "", "", "", "", "",
174 "pfs", "lc", "ec",
175 "", "", "", "", "", "", "", "", "", "",
176 "", "", "", "", "", "", "", "", "", "",
177 "", "", "", "", "", "", "", "", "", "",
178 "", "", "", "", "", "", "", "", "", "",
179 "", "", "", "", "", "", "", "", "", "",
180 "", "", "", "", "", "", "", "", "", "",
181 "",
182 "nat0", "nat1", "nat2", "nat3", "nat4", "nat5", "nat6", "nat7",
183 "nat8", "nat9", "nat10", "nat11", "nat12", "nat13", "nat14", "nat15",
184 "nat16", "nat17", "nat18", "nat19", "nat20", "nat21", "nat22", "nat23",
185 "nat24", "nat25", "nat26", "nat27", "nat28", "nat29", "nat30", "nat31",
186 "nat32", "nat33", "nat34", "nat35", "nat36", "nat37", "nat38", "nat39",
187 "nat40", "nat41", "nat42", "nat43", "nat44", "nat45", "nat46", "nat47",
188 "nat48", "nat49", "nat50", "nat51", "nat52", "nat53", "nat54", "nat55",
189 "nat56", "nat57", "nat58", "nat59", "nat60", "nat61", "nat62", "nat63",
190 "nat64", "nat65", "nat66", "nat67", "nat68", "nat69", "nat70", "nat71",
191 "nat72", "nat73", "nat74", "nat75", "nat76", "nat77", "nat78", "nat79",
192 "nat80", "nat81", "nat82", "nat83", "nat84", "nat85", "nat86", "nat87",
193 "nat88", "nat89", "nat90", "nat91", "nat92", "nat93", "nat94", "nat95",
194 "nat96", "nat97", "nat98", "nat99", "nat100","nat101","nat102","nat103",
195 "nat104","nat105","nat106","nat107","nat108","nat109","nat110","nat111",
196 "nat112","nat113","nat114","nat115","nat116","nat117","nat118","nat119",
197 "nat120","nat121","nat122","nat123","nat124","nat125","nat126","nat127",
198};
199
200struct frame_extra_info
244bc108
KB
201 {
202 CORE_ADDR bsp; /* points at r32 for the current frame */
203 CORE_ADDR cfm; /* cfm value for current frame */
204 int sof; /* Size of frame (decoded from cfm value) */
205 int sol; /* Size of locals (decoded from cfm value) */
206 CORE_ADDR after_prologue;
207 /* Address of first instruction after the last
16461d7d
KB
208 prologue instruction; Note that there may
209 be instructions from the function's body
210 intermingled with the prologue. */
244bc108
KB
211 int mem_stack_frame_size;
212 /* Size of the memory stack frame (may be zero),
16461d7d 213 or -1 if it has not been determined yet. */
244bc108
KB
214 int fp_reg; /* Register number (if any) used a frame pointer
215 for this frame. 0 if no register is being used
16461d7d 216 as the frame pointer. */
244bc108
KB
217 };
218
219struct gdbarch_tdep
220 {
221 int os_ident; /* From the ELF header, one of the ELFOSABI_
ef58a6ac 222 constants: ELFOSABI_LINUX, ELFOSABI_AIX,
244bc108
KB
223 etc. */
224 CORE_ADDR (*sigcontext_register_address) (CORE_ADDR, int);
225 /* OS specific function which, given a frame address
226 and register number, returns the offset to the
227 given register from the start of the frame. */
698cb3f0 228 CORE_ADDR (*find_global_pointer) (CORE_ADDR);
244bc108
KB
229 };
230
698cb3f0
KB
231#define SIGCONTEXT_REGISTER_ADDRESS \
232 (gdbarch_tdep (current_gdbarch)->sigcontext_register_address)
233#define FIND_GLOBAL_POINTER \
234 (gdbarch_tdep (current_gdbarch)->find_global_pointer)
16461d7d 235
fa88f677 236static const char *
16461d7d
KB
237ia64_register_name (int reg)
238{
239 return ia64_register_names[reg];
240}
241
242int
243ia64_register_raw_size (int reg)
244{
245 return (IA64_FR0_REGNUM <= reg && reg <= IA64_FR127_REGNUM) ? 16 : 8;
246}
247
248int
249ia64_register_virtual_size (int reg)
250{
251 return (IA64_FR0_REGNUM <= reg && reg <= IA64_FR127_REGNUM) ? 16 : 8;
252}
253
254/* Return true iff register N's virtual format is different from
255 its raw format. */
256int
257ia64_register_convertible (int nr)
258{
259 return (IA64_FR0_REGNUM <= nr && nr <= IA64_FR127_REGNUM);
260}
261
262const struct floatformat floatformat_ia64_ext =
263{
264 floatformat_little, 82, 0, 1, 17, 65535, 0x1ffff, 18, 64,
265 floatformat_intbit_yes
266};
267
268void
269ia64_register_convert_to_virtual (int regnum, struct type *type,
270 char *from, char *to)
271{
272 if (regnum >= IA64_FR0_REGNUM && regnum <= IA64_FR127_REGNUM)
273 {
274 DOUBLEST val;
275 floatformat_to_doublest (&floatformat_ia64_ext, from, &val);
f1908289 276 deprecated_store_floating (to, TYPE_LENGTH(type), val);
16461d7d
KB
277 }
278 else
279 error("ia64_register_convert_to_virtual called with non floating point register number");
280}
281
282void
283ia64_register_convert_to_raw (struct type *type, int regnum,
284 char *from, char *to)
285{
286 if (regnum >= IA64_FR0_REGNUM && regnum <= IA64_FR127_REGNUM)
287 {
f1908289 288 DOUBLEST val = deprecated_extract_floating (from, TYPE_LENGTH(type));
16461d7d
KB
289 floatformat_from_doublest (&floatformat_ia64_ext, &val, to);
290 }
291 else
292 error("ia64_register_convert_to_raw called with non floating point register number");
293}
294
295struct type *
296ia64_register_virtual_type (int reg)
297{
298 if (reg >= IA64_FR0_REGNUM && reg <= IA64_FR127_REGNUM)
299 return builtin_type_long_double;
300 else
301 return builtin_type_long;
302}
303
304int
305ia64_register_byte (int reg)
306{
307 return (8 * reg) +
308 (reg <= IA64_FR0_REGNUM ? 0 : 8 * ((reg > IA64_FR127_REGNUM) ? 128 : reg - IA64_FR0_REGNUM));
309}
310
244bc108
KB
311/* Read the given register from a sigcontext structure in the
312 specified frame. */
313
314static CORE_ADDR
315read_sigcontext_register (struct frame_info *frame, int regnum)
316{
317 CORE_ADDR regaddr;
318
319 if (frame == NULL)
8e65ff28
AC
320 internal_error (__FILE__, __LINE__,
321 "read_sigcontext_register: NULL frame");
5a203e44 322 if (!(get_frame_type (frame) == SIGTRAMP_FRAME))
8e65ff28 323 internal_error (__FILE__, __LINE__,
5a203e44 324 "read_sigcontext_register: frame not a signal trampoline");
244bc108 325 if (SIGCONTEXT_REGISTER_ADDRESS == 0)
8e65ff28
AC
326 internal_error (__FILE__, __LINE__,
327 "read_sigcontext_register: SIGCONTEXT_REGISTER_ADDRESS is 0");
244bc108 328
1e2330ba 329 regaddr = SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), regnum);
244bc108
KB
330 if (regaddr)
331 return read_memory_integer (regaddr, REGISTER_RAW_SIZE (regnum));
332 else
8e65ff28
AC
333 internal_error (__FILE__, __LINE__,
334 "read_sigcontext_register: Register %d not in struct sigcontext", regnum);
244bc108
KB
335}
336
16461d7d
KB
337/* Extract ``len'' bits from an instruction bundle starting at
338 bit ``from''. */
339
244bc108 340static long long
16461d7d
KB
341extract_bit_field (char *bundle, int from, int len)
342{
343 long long result = 0LL;
344 int to = from + len;
345 int from_byte = from / 8;
346 int to_byte = to / 8;
347 unsigned char *b = (unsigned char *) bundle;
348 unsigned char c;
349 int lshift;
350 int i;
351
352 c = b[from_byte];
353 if (from_byte == to_byte)
354 c = ((unsigned char) (c << (8 - to % 8))) >> (8 - to % 8);
355 result = c >> (from % 8);
356 lshift = 8 - (from % 8);
357
358 for (i = from_byte+1; i < to_byte; i++)
359 {
360 result |= ((long long) b[i]) << lshift;
361 lshift += 8;
362 }
363
364 if (from_byte < to_byte && (to % 8 != 0))
365 {
366 c = b[to_byte];
367 c = ((unsigned char) (c << (8 - to % 8))) >> (8 - to % 8);
368 result |= ((long long) c) << lshift;
369 }
370
371 return result;
372}
373
374/* Replace the specified bits in an instruction bundle */
375
244bc108 376static void
16461d7d
KB
377replace_bit_field (char *bundle, long long val, int from, int len)
378{
379 int to = from + len;
380 int from_byte = from / 8;
381 int to_byte = to / 8;
382 unsigned char *b = (unsigned char *) bundle;
383 unsigned char c;
384
385 if (from_byte == to_byte)
386 {
387 unsigned char left, right;
388 c = b[from_byte];
389 left = (c >> (to % 8)) << (to % 8);
390 right = ((unsigned char) (c << (8 - from % 8))) >> (8 - from % 8);
391 c = (unsigned char) (val & 0xff);
392 c = (unsigned char) (c << (from % 8 + 8 - to % 8)) >> (8 - to % 8);
393 c |= right | left;
394 b[from_byte] = c;
395 }
396 else
397 {
398 int i;
399 c = b[from_byte];
400 c = ((unsigned char) (c << (8 - from % 8))) >> (8 - from % 8);
401 c = c | (val << (from % 8));
402 b[from_byte] = c;
403 val >>= 8 - from % 8;
404
405 for (i = from_byte+1; i < to_byte; i++)
406 {
407 c = val & 0xff;
408 val >>= 8;
409 b[i] = c;
410 }
411
412 if (to % 8 != 0)
413 {
414 unsigned char cv = (unsigned char) val;
415 c = b[to_byte];
416 c = c >> (to % 8) << (to % 8);
417 c |= ((unsigned char) (cv << (8 - to % 8))) >> (8 - to % 8);
418 b[to_byte] = c;
419 }
420 }
421}
422
423/* Return the contents of slot N (for N = 0, 1, or 2) in
424 and instruction bundle */
425
244bc108 426static long long
2fc3ac7e 427slotN_contents (char *bundle, int slotnum)
16461d7d
KB
428{
429 return extract_bit_field (bundle, 5+41*slotnum, 41);
430}
431
432/* Store an instruction in an instruction bundle */
433
244bc108 434static void
2fc3ac7e 435replace_slotN_contents (char *bundle, long long instr, int slotnum)
16461d7d
KB
436{
437 replace_bit_field (bundle, instr, 5+41*slotnum, 41);
438}
439
64a5b29c 440static enum instruction_type template_encoding_table[32][3] =
16461d7d
KB
441{
442 { M, I, I }, /* 00 */
443 { M, I, I }, /* 01 */
444 { M, I, I }, /* 02 */
445 { M, I, I }, /* 03 */
446 { M, L, X }, /* 04 */
447 { M, L, X }, /* 05 */
448 { undefined, undefined, undefined }, /* 06 */
449 { undefined, undefined, undefined }, /* 07 */
450 { M, M, I }, /* 08 */
451 { M, M, I }, /* 09 */
452 { M, M, I }, /* 0A */
453 { M, M, I }, /* 0B */
454 { M, F, I }, /* 0C */
455 { M, F, I }, /* 0D */
456 { M, M, F }, /* 0E */
457 { M, M, F }, /* 0F */
458 { M, I, B }, /* 10 */
459 { M, I, B }, /* 11 */
460 { M, B, B }, /* 12 */
461 { M, B, B }, /* 13 */
462 { undefined, undefined, undefined }, /* 14 */
463 { undefined, undefined, undefined }, /* 15 */
464 { B, B, B }, /* 16 */
465 { B, B, B }, /* 17 */
466 { M, M, B }, /* 18 */
467 { M, M, B }, /* 19 */
468 { undefined, undefined, undefined }, /* 1A */
469 { undefined, undefined, undefined }, /* 1B */
470 { M, F, B }, /* 1C */
471 { M, F, B }, /* 1D */
472 { undefined, undefined, undefined }, /* 1E */
473 { undefined, undefined, undefined }, /* 1F */
474};
475
476/* Fetch and (partially) decode an instruction at ADDR and return the
477 address of the next instruction to fetch. */
478
479static CORE_ADDR
480fetch_instruction (CORE_ADDR addr, instruction_type *it, long long *instr)
481{
482 char bundle[BUNDLE_LEN];
483 int slotnum = (int) (addr & 0x0f) / SLOT_MULTIPLIER;
484 long long template;
485 int val;
486
c26e1c2b
KB
487 /* Warn about slot numbers greater than 2. We used to generate
488 an error here on the assumption that the user entered an invalid
489 address. But, sometimes GDB itself requests an invalid address.
490 This can (easily) happen when execution stops in a function for
491 which there are no symbols. The prologue scanner will attempt to
492 find the beginning of the function - if the nearest symbol
493 happens to not be aligned on a bundle boundary (16 bytes), the
494 resulting starting address will cause GDB to think that the slot
495 number is too large.
496
497 So we warn about it and set the slot number to zero. It is
498 not necessarily a fatal condition, particularly if debugging
499 at the assembly language level. */
16461d7d 500 if (slotnum > 2)
c26e1c2b
KB
501 {
502 warning ("Can't fetch instructions for slot numbers greater than 2.\n"
503 "Using slot 0 instead");
504 slotnum = 0;
505 }
16461d7d
KB
506
507 addr &= ~0x0f;
508
509 val = target_read_memory (addr, bundle, BUNDLE_LEN);
510
511 if (val != 0)
512 return 0;
513
514 *instr = slotN_contents (bundle, slotnum);
515 template = extract_bit_field (bundle, 0, 5);
516 *it = template_encoding_table[(int)template][slotnum];
517
64a5b29c 518 if (slotnum == 2 || (slotnum == 1 && *it == L))
16461d7d
KB
519 addr += 16;
520 else
521 addr += (slotnum + 1) * SLOT_MULTIPLIER;
522
523 return addr;
524}
525
526/* There are 5 different break instructions (break.i, break.b,
527 break.m, break.f, and break.x), but they all have the same
528 encoding. (The five bit template in the low five bits of the
529 instruction bundle distinguishes one from another.)
530
531 The runtime architecture manual specifies that break instructions
532 used for debugging purposes must have the upper two bits of the 21
533 bit immediate set to a 0 and a 1 respectively. A breakpoint
534 instruction encodes the most significant bit of its 21 bit
535 immediate at bit 36 of the 41 bit instruction. The penultimate msb
536 is at bit 25 which leads to the pattern below.
537
538 Originally, I had this set up to do, e.g, a "break.i 0x80000" But
539 it turns out that 0x80000 was used as the syscall break in the early
540 simulators. So I changed the pattern slightly to do "break.i 0x080001"
541 instead. But that didn't work either (I later found out that this
542 pattern was used by the simulator that I was using.) So I ended up
543 using the pattern seen below. */
544
545#if 0
546#define BREAKPOINT 0x00002000040LL
547#endif
548#define BREAKPOINT 0x00003333300LL
549
550static int
551ia64_memory_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
552{
553 char bundle[BUNDLE_LEN];
554 int slotnum = (int) (addr & 0x0f) / SLOT_MULTIPLIER;
555 long long instr;
556 int val;
126fa72d 557 int template;
16461d7d
KB
558
559 if (slotnum > 2)
560 error("Can't insert breakpoint for slot numbers greater than 2.");
561
562 addr &= ~0x0f;
563
564 val = target_read_memory (addr, bundle, BUNDLE_LEN);
126fa72d
PS
565
566 /* Check for L type instruction in 2nd slot, if present then
567 bump up the slot number to the 3rd slot */
568 template = extract_bit_field (bundle, 0, 5);
569 if (slotnum == 1 && template_encoding_table[template][1] == L)
570 {
571 slotnum = 2;
572 }
573
16461d7d
KB
574 instr = slotN_contents (bundle, slotnum);
575 memcpy(contents_cache, &instr, sizeof(instr));
576 replace_slotN_contents (bundle, BREAKPOINT, slotnum);
577 if (val == 0)
578 target_write_memory (addr, bundle, BUNDLE_LEN);
579
580 return val;
581}
582
583static int
584ia64_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
585{
586 char bundle[BUNDLE_LEN];
587 int slotnum = (addr & 0x0f) / SLOT_MULTIPLIER;
588 long long instr;
589 int val;
126fa72d 590 int template;
16461d7d
KB
591
592 addr &= ~0x0f;
593
594 val = target_read_memory (addr, bundle, BUNDLE_LEN);
126fa72d
PS
595
596 /* Check for L type instruction in 2nd slot, if present then
597 bump up the slot number to the 3rd slot */
598 template = extract_bit_field (bundle, 0, 5);
599 if (slotnum == 1 && template_encoding_table[template][1] == L)
600 {
601 slotnum = 2;
602 }
603
16461d7d
KB
604 memcpy (&instr, contents_cache, sizeof instr);
605 replace_slotN_contents (bundle, instr, slotnum);
606 if (val == 0)
607 target_write_memory (addr, bundle, BUNDLE_LEN);
608
609 return val;
610}
611
612/* We don't really want to use this, but remote.c needs to call it in order
613 to figure out if Z-packets are supported or not. Oh, well. */
f4f9705a 614const unsigned char *
fba45db2 615ia64_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
16461d7d
KB
616{
617 static unsigned char breakpoint[] =
618 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
619 *lenptr = sizeof (breakpoint);
620#if 0
621 *pcptr &= ~0x0f;
622#endif
623 return breakpoint;
624}
625
626CORE_ADDR
39f77062 627ia64_read_pc (ptid_t ptid)
16461d7d 628{
39f77062
KB
629 CORE_ADDR psr_value = read_register_pid (IA64_PSR_REGNUM, ptid);
630 CORE_ADDR pc_value = read_register_pid (IA64_IP_REGNUM, ptid);
16461d7d
KB
631 int slot_num = (psr_value >> 41) & 3;
632
633 return pc_value | (slot_num * SLOT_MULTIPLIER);
634}
635
636void
39f77062 637ia64_write_pc (CORE_ADDR new_pc, ptid_t ptid)
16461d7d
KB
638{
639 int slot_num = (int) (new_pc & 0xf) / SLOT_MULTIPLIER;
39f77062 640 CORE_ADDR psr_value = read_register_pid (IA64_PSR_REGNUM, ptid);
16461d7d
KB
641 psr_value &= ~(3LL << 41);
642 psr_value |= (CORE_ADDR)(slot_num & 0x3) << 41;
643
644 new_pc &= ~0xfLL;
645
39f77062
KB
646 write_register_pid (IA64_PSR_REGNUM, psr_value, ptid);
647 write_register_pid (IA64_IP_REGNUM, new_pc, ptid);
16461d7d
KB
648}
649
650#define IS_NaT_COLLECTION_ADDR(addr) ((((addr) >> 3) & 0x3f) == 0x3f)
651
652/* Returns the address of the slot that's NSLOTS slots away from
653 the address ADDR. NSLOTS may be positive or negative. */
654static CORE_ADDR
655rse_address_add(CORE_ADDR addr, int nslots)
656{
657 CORE_ADDR new_addr;
658 int mandatory_nat_slots = nslots / 63;
659 int direction = nslots < 0 ? -1 : 1;
660
661 new_addr = addr + 8 * (nslots + mandatory_nat_slots);
662
663 if ((new_addr >> 9) != ((addr + 8 * 64 * mandatory_nat_slots) >> 9))
664 new_addr += 8 * direction;
665
666 if (IS_NaT_COLLECTION_ADDR(new_addr))
667 new_addr += 8 * direction;
668
669 return new_addr;
670}
671
672/* The IA-64 frame chain is a bit odd. We won't always have a frame
673 pointer, so we use the SP value as the FP for the purpose of
674 creating a frame. There is sometimes a register (not fixed) which
675 is used as a frame pointer. When this register exists, it is not
676 especially hard to determine which one is being used. It isn't
677 even really hard to compute the frame chain, but it can be
678 computationally expensive. So, instead of making life difficult
679 (and slow), we pick a more convenient representation of the frame
8227c0ff 680 chain, knowing that we'll have to make some small adjustments in
0ba6dca9
AC
681 other places. (E.g, note that deprecated_read_fp() is actually
682 read_sp() in ia64_gdbarch_init() below.)
16461d7d
KB
683
684 Okay, so what is the frame chain exactly? It'll be the SP value
685 at the time that the function in question was entered.
686
687 Note that this *should* actually the frame pointer for the current
688 function! But as I note above, if we were to attempt to find the
689 address of the beginning of the previous frame, we'd waste a lot
690 of cycles for no good reason. So instead, we simply choose to
691 represent the frame chain as the end of the previous frame instead
692 of the beginning. */
693
694CORE_ADDR
695ia64_frame_chain (struct frame_info *frame)
696{
5a203e44 697 if ((get_frame_type (frame) == SIGTRAMP_FRAME))
244bc108 698 return read_sigcontext_register (frame, sp_regnum);
1e2330ba
AC
699 else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
700 get_frame_base (frame),
701 get_frame_base (frame)))
702 return get_frame_base (frame);
16461d7d 703 else
244bc108 704 {
f30ee0bc 705 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
b2fb4676
AC
706 if (get_frame_saved_regs (frame)[IA64_VFP_REGNUM])
707 return read_memory_integer (get_frame_saved_regs (frame)[IA64_VFP_REGNUM], 8);
244bc108 708 else
1e2330ba 709 return (get_frame_base (frame)
da50a4b7 710 + get_frame_extra_info (frame)->mem_stack_frame_size);
244bc108 711 }
16461d7d
KB
712}
713
714CORE_ADDR
715ia64_frame_saved_pc (struct frame_info *frame)
716{
5a203e44 717 if ((get_frame_type (frame) == SIGTRAMP_FRAME))
244bc108 718 return read_sigcontext_register (frame, pc_regnum);
1e2330ba
AC
719 else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
720 get_frame_base (frame),
721 get_frame_base (frame)))
722 return deprecated_read_register_dummy (get_frame_pc (frame),
723 get_frame_base (frame), pc_regnum);
244bc108
KB
724 else
725 {
f30ee0bc 726 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
16461d7d 727
b2fb4676
AC
728 if (get_frame_saved_regs (frame)[IA64_VRAP_REGNUM])
729 return read_memory_integer (get_frame_saved_regs (frame)[IA64_VRAP_REGNUM], 8);
11c02a10
AC
730 else if (get_next_frame (frame)
731 && (get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME))
732 return read_sigcontext_register (get_next_frame (frame), IA64_BR0_REGNUM);
244bc108
KB
733 else /* either frameless, or not far enough along in the prologue... */
734 return ia64_saved_pc_after_call (frame);
735 }
16461d7d
KB
736}
737
58ab00f9
KB
738/* Limit the number of skipped non-prologue instructions since examining
739 of the prologue is expensive. */
5ea2bd7f 740static int max_skip_non_prologue_insns = 40;
58ab00f9
KB
741
742/* Given PC representing the starting address of a function, and
743 LIM_PC which is the (sloppy) limit to which to scan when looking
744 for a prologue, attempt to further refine this limit by using
745 the line data in the symbol table. If successful, a better guess
746 on where the prologue ends is returned, otherwise the previous
747 value of lim_pc is returned. TRUST_LIMIT is a pointer to a flag
748 which will be set to indicate whether the returned limit may be
749 used with no further scanning in the event that the function is
750 frameless. */
751
752static CORE_ADDR
753refine_prologue_limit (CORE_ADDR pc, CORE_ADDR lim_pc, int *trust_limit)
754{
755 struct symtab_and_line prologue_sal;
756 CORE_ADDR start_pc = pc;
757
758 /* Start off not trusting the limit. */
759 *trust_limit = 0;
760
761 prologue_sal = find_pc_line (pc, 0);
762 if (prologue_sal.line != 0)
763 {
764 int i;
765 CORE_ADDR addr = prologue_sal.end;
766
767 /* Handle the case in which compiler's optimizer/scheduler
768 has moved instructions into the prologue. We scan ahead
769 in the function looking for address ranges whose corresponding
770 line number is less than or equal to the first one that we
771 found for the function. (It can be less than when the
772 scheduler puts a body instruction before the first prologue
773 instruction.) */
774 for (i = 2 * max_skip_non_prologue_insns;
775 i > 0 && (lim_pc == 0 || addr < lim_pc);
776 i--)
777 {
778 struct symtab_and_line sal;
779
780 sal = find_pc_line (addr, 0);
781 if (sal.line == 0)
782 break;
783 if (sal.line <= prologue_sal.line
784 && sal.symtab == prologue_sal.symtab)
785 {
786 prologue_sal = sal;
787 }
788 addr = sal.end;
789 }
790
791 if (lim_pc == 0 || prologue_sal.end < lim_pc)
792 {
793 lim_pc = prologue_sal.end;
794 if (start_pc == get_pc_function_start (lim_pc))
795 *trust_limit = 1;
796 }
797 }
798 return lim_pc;
799}
800
16461d7d
KB
801#define isScratch(_regnum_) ((_regnum_) == 2 || (_regnum_) == 3 \
802 || (8 <= (_regnum_) && (_regnum_) <= 11) \
803 || (14 <= (_regnum_) && (_regnum_) <= 31))
804#define imm9(_instr_) \
805 ( ((((_instr_) & 0x01000000000LL) ? -1 : 0) << 8) \
806 | (((_instr_) & 0x00008000000LL) >> 20) \
807 | (((_instr_) & 0x00000001fc0LL) >> 6))
808
809static CORE_ADDR
810examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct frame_info *frame)
811{
812 CORE_ADDR next_pc;
813 CORE_ADDR last_prologue_pc = pc;
16461d7d
KB
814 instruction_type it;
815 long long instr;
816 int do_fsr_stuff = 0;
817
818 int cfm_reg = 0;
819 int ret_reg = 0;
820 int fp_reg = 0;
821 int unat_save_reg = 0;
822 int pr_save_reg = 0;
823 int mem_stack_frame_size = 0;
824 int spill_reg = 0;
825 CORE_ADDR spill_addr = 0;
0927a22b
KB
826 char instores[8];
827 char infpstores[8];
5ea2bd7f 828 char reg_contents[256];
58ab00f9 829 int trust_limit;
5ea2bd7f 830 int frameless = 0;
0927a22b
KB
831
832 memset (instores, 0, sizeof instores);
833 memset (infpstores, 0, sizeof infpstores);
5ea2bd7f 834 memset (reg_contents, 0, sizeof reg_contents);
16461d7d 835
b2fb4676 836 if (frame && !get_frame_saved_regs (frame))
16461d7d
KB
837 {
838 frame_saved_regs_zalloc (frame);
839 do_fsr_stuff = 1;
840 }
841
842 if (frame
843 && !do_fsr_stuff
da50a4b7
AC
844 && get_frame_extra_info (frame)->after_prologue != 0
845 && get_frame_extra_info (frame)->after_prologue <= lim_pc)
846 return get_frame_extra_info (frame)->after_prologue;
16461d7d 847
58ab00f9 848 lim_pc = refine_prologue_limit (pc, lim_pc, &trust_limit);
16461d7d 849 next_pc = fetch_instruction (pc, &it, &instr);
5ea2bd7f
JJ
850
851 /* We want to check if we have a recognizable function start before we
852 look ahead for a prologue. */
16461d7d
KB
853 if (pc < lim_pc && next_pc
854 && it == M && ((instr & 0x1ee0000003fLL) == 0x02c00000000LL))
855 {
5ea2bd7f 856 /* alloc - start of a regular function. */
16461d7d
KB
857 int sor = (int) ((instr & 0x00078000000LL) >> 27);
858 int sol = (int) ((instr & 0x00007f00000LL) >> 20);
859 int sof = (int) ((instr & 0x000000fe000LL) >> 13);
860 /* Okay, so sor, sol, and sof aren't used right now; but perhaps
861 we could compare against the size given to us via the cfm as
862 either a sanity check or possibly to see if the frame has been
863 changed by a later alloc instruction... */
864 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
865 cfm_reg = rN;
866 last_prologue_pc = next_pc;
867 pc = next_pc;
868 }
869 else
58ab00f9 870 {
5ea2bd7f
JJ
871 /* Look for a leaf routine. */
872 if (pc < lim_pc && next_pc
873 && (it == I || it == M)
874 && ((instr & 0x1ee00000000LL) == 0x10800000000LL))
875 {
876 /* adds rN = imm14, rM (or mov rN, rM when imm14 is 0) */
877 int imm = (int) ((((instr & 0x01000000000LL) ? -1 : 0) << 13)
878 | ((instr & 0x001f8000000LL) >> 20)
879 | ((instr & 0x000000fe000LL) >> 13));
880 int rM = (int) ((instr & 0x00007f00000LL) >> 20);
881 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
882 int qp = (int) (instr & 0x0000000003fLL);
883 if (qp == 0 && rN == 2 && imm == 0 && rM == 12 && fp_reg == 0)
884 {
885 /* mov r2, r12 - beginning of leaf routine */
886 fp_reg = rN;
887 frameless = 1;
888 last_prologue_pc = next_pc;
889 }
890 }
891
892 /* If we don't recognize a regular function or leaf routine, we are
893 done. */
894 if (!fp_reg)
895 {
896 pc = lim_pc;
897 if (trust_limit)
898 last_prologue_pc = lim_pc;
899 }
58ab00f9 900 }
16461d7d
KB
901
902 /* Loop, looking for prologue instructions, keeping track of
903 where preserved registers were spilled. */
904 while (pc < lim_pc)
905 {
906 next_pc = fetch_instruction (pc, &it, &instr);
907 if (next_pc == 0)
908 break;
909
902d7086
KB
910 if ((it == B && ((instr & 0x1e1f800003f) != 0x04000000000))
911 || ((instr & 0x3fLL) != 0LL))
0927a22b 912 {
902d7086
KB
913 /* Exit loop upon hitting a non-nop branch instruction
914 or a predicated instruction. */
5ea2bd7f
JJ
915 if (trust_limit)
916 lim_pc = pc;
0927a22b
KB
917 break;
918 }
919 else if (it == I && ((instr & 0x1eff8000000LL) == 0x00188000000LL))
16461d7d
KB
920 {
921 /* Move from BR */
922 int b2 = (int) ((instr & 0x0000000e000LL) >> 13);
923 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
924 int qp = (int) (instr & 0x0000000003f);
925
926 if (qp == 0 && b2 == 0 && rN >= 32 && ret_reg == 0)
927 {
928 ret_reg = rN;
929 last_prologue_pc = next_pc;
930 }
931 }
932 else if ((it == I || it == M)
933 && ((instr & 0x1ee00000000LL) == 0x10800000000LL))
934 {
935 /* adds rN = imm14, rM (or mov rN, rM when imm14 is 0) */
936 int imm = (int) ((((instr & 0x01000000000LL) ? -1 : 0) << 13)
937 | ((instr & 0x001f8000000LL) >> 20)
938 | ((instr & 0x000000fe000LL) >> 13));
939 int rM = (int) ((instr & 0x00007f00000LL) >> 20);
940 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
941 int qp = (int) (instr & 0x0000000003fLL);
942
943 if (qp == 0 && rN >= 32 && imm == 0 && rM == 12 && fp_reg == 0)
944 {
945 /* mov rN, r12 */
946 fp_reg = rN;
947 last_prologue_pc = next_pc;
948 }
949 else if (qp == 0 && rN == 12 && rM == 12)
950 {
951 /* adds r12, -mem_stack_frame_size, r12 */
952 mem_stack_frame_size -= imm;
953 last_prologue_pc = next_pc;
954 }
955 else if (qp == 0 && rN == 2
956 && ((rM == fp_reg && fp_reg != 0) || rM == 12))
957 {
958 /* adds r2, spilloffset, rFramePointer
959 or
960 adds r2, spilloffset, r12
961
962 Get ready for stf.spill or st8.spill instructions.
963 The address to start spilling at is loaded into r2.
964 FIXME: Why r2? That's what gcc currently uses; it
965 could well be different for other compilers. */
966
967 /* Hmm... whether or not this will work will depend on
968 where the pc is. If it's still early in the prologue
969 this'll be wrong. FIXME */
1e2330ba 970 spill_addr = (frame ? get_frame_base (frame) : 0)
16461d7d
KB
971 + (rM == 12 ? 0 : mem_stack_frame_size)
972 + imm;
973 spill_reg = rN;
974 last_prologue_pc = next_pc;
975 }
5ea2bd7f
JJ
976 else if (qp == 0 && rM >= 32 && rM < 40 && !instores[rM] &&
977 rN < 256 && imm == 0)
978 {
979 /* mov rN, rM where rM is an input register */
980 reg_contents[rN] = rM;
981 last_prologue_pc = next_pc;
982 }
983 else if (frameless && qp == 0 && rN == fp_reg && imm == 0 &&
984 rM == 2)
985 {
986 /* mov r12, r2 */
987 last_prologue_pc = next_pc;
988 break;
989 }
16461d7d
KB
990 }
991 else if (it == M
992 && ( ((instr & 0x1efc0000000LL) == 0x0eec0000000LL)
993 || ((instr & 0x1ffc8000000LL) == 0x0cec0000000LL) ))
994 {
995 /* stf.spill [rN] = fM, imm9
996 or
997 stf.spill [rN] = fM */
998
999 int imm = imm9(instr);
1000 int rN = (int) ((instr & 0x00007f00000LL) >> 20);
1001 int fM = (int) ((instr & 0x000000fe000LL) >> 13);
1002 int qp = (int) (instr & 0x0000000003fLL);
1003 if (qp == 0 && rN == spill_reg && spill_addr != 0
1004 && ((2 <= fM && fM <= 5) || (16 <= fM && fM <= 31)))
1005 {
1006 if (do_fsr_stuff)
b2fb4676 1007 get_frame_saved_regs (frame)[IA64_FR0_REGNUM + fM] = spill_addr;
16461d7d
KB
1008
1009 if ((instr & 0x1efc0000000) == 0x0eec0000000)
1010 spill_addr += imm;
1011 else
1012 spill_addr = 0; /* last one; must be done */
1013 last_prologue_pc = next_pc;
1014 }
1015 }
1016 else if ((it == M && ((instr & 0x1eff8000000LL) == 0x02110000000LL))
1017 || (it == I && ((instr & 0x1eff8000000LL) == 0x00050000000LL)) )
1018 {
1019 /* mov.m rN = arM
1020 or
1021 mov.i rN = arM */
1022
1023 int arM = (int) ((instr & 0x00007f00000LL) >> 20);
1024 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
1025 int qp = (int) (instr & 0x0000000003fLL);
1026 if (qp == 0 && isScratch (rN) && arM == 36 /* ar.unat */)
1027 {
1028 /* We have something like "mov.m r3 = ar.unat". Remember the
1029 r3 (or whatever) and watch for a store of this register... */
1030 unat_save_reg = rN;
1031 last_prologue_pc = next_pc;
1032 }
1033 }
1034 else if (it == I && ((instr & 0x1eff8000000LL) == 0x00198000000LL))
1035 {
1036 /* mov rN = pr */
1037 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
1038 int qp = (int) (instr & 0x0000000003fLL);
1039 if (qp == 0 && isScratch (rN))
1040 {
1041 pr_save_reg = rN;
1042 last_prologue_pc = next_pc;
1043 }
1044 }
1045 else if (it == M
1046 && ( ((instr & 0x1ffc8000000LL) == 0x08cc0000000LL)
1047 || ((instr & 0x1efc0000000LL) == 0x0acc0000000LL)))
1048 {
1049 /* st8 [rN] = rM
1050 or
1051 st8 [rN] = rM, imm9 */
1052 int rN = (int) ((instr & 0x00007f00000LL) >> 20);
1053 int rM = (int) ((instr & 0x000000fe000LL) >> 13);
1054 int qp = (int) (instr & 0x0000000003fLL);
5ea2bd7f 1055 int indirect = rM < 256 ? reg_contents[rM] : 0;
16461d7d
KB
1056 if (qp == 0 && rN == spill_reg && spill_addr != 0
1057 && (rM == unat_save_reg || rM == pr_save_reg))
1058 {
1059 /* We've found a spill of either the UNAT register or the PR
1060 register. (Well, not exactly; what we've actually found is
1061 a spill of the register that UNAT or PR was moved to).
1062 Record that fact and move on... */
1063 if (rM == unat_save_reg)
1064 {
1065 /* Track UNAT register */
1066 if (do_fsr_stuff)
b2fb4676 1067 get_frame_saved_regs (frame)[IA64_UNAT_REGNUM] = spill_addr;
16461d7d
KB
1068 unat_save_reg = 0;
1069 }
1070 else
1071 {
1072 /* Track PR register */
1073 if (do_fsr_stuff)
b2fb4676 1074 get_frame_saved_regs (frame)[IA64_PR_REGNUM] = spill_addr;
16461d7d
KB
1075 pr_save_reg = 0;
1076 }
1077 if ((instr & 0x1efc0000000LL) == 0x0acc0000000LL)
1078 /* st8 [rN] = rM, imm9 */
1079 spill_addr += imm9(instr);
1080 else
1081 spill_addr = 0; /* must be done spilling */
1082 last_prologue_pc = next_pc;
1083 }
0927a22b
KB
1084 else if (qp == 0 && 32 <= rM && rM < 40 && !instores[rM-32])
1085 {
1086 /* Allow up to one store of each input register. */
1087 instores[rM-32] = 1;
1088 last_prologue_pc = next_pc;
1089 }
5ea2bd7f
JJ
1090 else if (qp == 0 && 32 <= indirect && indirect < 40 &&
1091 !instores[indirect-32])
1092 {
1093 /* Allow an indirect store of an input register. */
1094 instores[indirect-32] = 1;
1095 last_prologue_pc = next_pc;
1096 }
0927a22b
KB
1097 }
1098 else if (it == M && ((instr & 0x1ff08000000LL) == 0x08c00000000LL))
1099 {
1100 /* One of
1101 st1 [rN] = rM
1102 st2 [rN] = rM
1103 st4 [rN] = rM
1104 st8 [rN] = rM
1105 Note that the st8 case is handled in the clause above.
1106
1107 Advance over stores of input registers. One store per input
1108 register is permitted. */
1109 int rM = (int) ((instr & 0x000000fe000LL) >> 13);
1110 int qp = (int) (instr & 0x0000000003fLL);
5ea2bd7f 1111 int indirect = rM < 256 ? reg_contents[rM] : 0;
0927a22b
KB
1112 if (qp == 0 && 32 <= rM && rM < 40 && !instores[rM-32])
1113 {
1114 instores[rM-32] = 1;
1115 last_prologue_pc = next_pc;
1116 }
5ea2bd7f
JJ
1117 else if (qp == 0 && 32 <= indirect && indirect < 40 &&
1118 !instores[indirect-32])
1119 {
1120 /* Allow an indirect store of an input register. */
1121 instores[indirect-32] = 1;
1122 last_prologue_pc = next_pc;
1123 }
0927a22b
KB
1124 }
1125 else if (it == M && ((instr & 0x1ff88000000LL) == 0x0cc80000000LL))
1126 {
1127 /* Either
1128 stfs [rN] = fM
1129 or
1130 stfd [rN] = fM
1131
1132 Advance over stores of floating point input registers. Again
1133 one store per register is permitted */
1134 int fM = (int) ((instr & 0x000000fe000LL) >> 13);
1135 int qp = (int) (instr & 0x0000000003fLL);
1136 if (qp == 0 && 8 <= fM && fM < 16 && !infpstores[fM - 8])
1137 {
1138 infpstores[fM-8] = 1;
1139 last_prologue_pc = next_pc;
1140 }
16461d7d
KB
1141 }
1142 else if (it == M
1143 && ( ((instr & 0x1ffc8000000LL) == 0x08ec0000000LL)
1144 || ((instr & 0x1efc0000000LL) == 0x0aec0000000LL)))
1145 {
1146 /* st8.spill [rN] = rM
1147 or
1148 st8.spill [rN] = rM, imm9 */
1149 int rN = (int) ((instr & 0x00007f00000LL) >> 20);
1150 int rM = (int) ((instr & 0x000000fe000LL) >> 13);
1151 int qp = (int) (instr & 0x0000000003fLL);
1152 if (qp == 0 && rN == spill_reg && 4 <= rM && rM <= 7)
1153 {
1154 /* We've found a spill of one of the preserved general purpose
1155 regs. Record the spill address and advance the spill
1156 register if appropriate. */
1157 if (do_fsr_stuff)
b2fb4676 1158 get_frame_saved_regs (frame)[IA64_GR0_REGNUM + rM] = spill_addr;
16461d7d
KB
1159 if ((instr & 0x1efc0000000LL) == 0x0aec0000000LL)
1160 /* st8.spill [rN] = rM, imm9 */
1161 spill_addr += imm9(instr);
1162 else
1163 spill_addr = 0; /* Done spilling */
1164 last_prologue_pc = next_pc;
1165 }
1166 }
16461d7d
KB
1167
1168 pc = next_pc;
1169 }
1170
1171 if (do_fsr_stuff) {
1172 int i;
1173 CORE_ADDR addr;
3a854e23
KB
1174 int sor, rrb_gr;
1175
1176 /* Extract the size of the rotating portion of the stack
1177 frame and the register rename base from the current
1178 frame marker. */
da50a4b7
AC
1179 sor = ((get_frame_extra_info (frame)->cfm >> 14) & 0xf) * 8;
1180 rrb_gr = (get_frame_extra_info (frame)->cfm >> 18) & 0x7f;
16461d7d 1181
da50a4b7
AC
1182 for (i = 0, addr = get_frame_extra_info (frame)->bsp;
1183 i < get_frame_extra_info (frame)->sof;
16461d7d
KB
1184 i++, addr += 8)
1185 {
1186 if (IS_NaT_COLLECTION_ADDR (addr))
1187 {
1188 addr += 8;
1189 }
3a854e23 1190 if (i < sor)
b2fb4676 1191 get_frame_saved_regs (frame)[IA64_GR32_REGNUM + ((i + (sor - rrb_gr)) % sor)]
3a854e23
KB
1192 = addr;
1193 else
b2fb4676 1194 get_frame_saved_regs (frame)[IA64_GR32_REGNUM + i] = addr;
16461d7d
KB
1195
1196 if (i+32 == cfm_reg)
b2fb4676 1197 get_frame_saved_regs (frame)[IA64_CFM_REGNUM] = addr;
16461d7d 1198 if (i+32 == ret_reg)
b2fb4676 1199 get_frame_saved_regs (frame)[IA64_VRAP_REGNUM] = addr;
16461d7d 1200 if (i+32 == fp_reg)
b2fb4676 1201 get_frame_saved_regs (frame)[IA64_VFP_REGNUM] = addr;
16461d7d
KB
1202 }
1203 }
1204
da50a4b7
AC
1205 if (frame && get_frame_extra_info (frame))
1206 {
1207 get_frame_extra_info (frame)->after_prologue = last_prologue_pc;
1208 get_frame_extra_info (frame)->mem_stack_frame_size = mem_stack_frame_size;
1209 get_frame_extra_info (frame)->fp_reg = fp_reg;
1210 }
16461d7d 1211
5ea2bd7f
JJ
1212 /* Try and trust the lim_pc value whenever possible. */
1213 if (trust_limit && lim_pc >= last_prologue_pc)
1214 return lim_pc;
1215
16461d7d
KB
1216 return last_prologue_pc;
1217}
1218
1219CORE_ADDR
1220ia64_skip_prologue (CORE_ADDR pc)
1221{
1222 return examine_prologue (pc, pc+1024, 0);
1223}
1224
1225void
1226ia64_frame_init_saved_regs (struct frame_info *frame)
1227{
b2fb4676 1228 if (get_frame_saved_regs (frame))
16461d7d
KB
1229 return;
1230
5a203e44 1231 if ((get_frame_type (frame) == SIGTRAMP_FRAME) && SIGCONTEXT_REGISTER_ADDRESS)
244bc108
KB
1232 {
1233 int regno;
16461d7d 1234
244bc108 1235 frame_saved_regs_zalloc (frame);
16461d7d 1236
b2fb4676 1237 get_frame_saved_regs (frame)[IA64_VRAP_REGNUM] =
1e2330ba 1238 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_IP_REGNUM);
b2fb4676 1239 get_frame_saved_regs (frame)[IA64_CFM_REGNUM] =
1e2330ba 1240 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_CFM_REGNUM);
b2fb4676 1241 get_frame_saved_regs (frame)[IA64_PSR_REGNUM] =
1e2330ba 1242 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_PSR_REGNUM);
244bc108 1243#if 0
b2fb4676 1244 get_frame_saved_regs (frame)[IA64_BSP_REGNUM] =
244bc108
KB
1245 SIGCONTEXT_REGISTER_ADDRESS (frame->frame, IA64_BSP_REGNUM);
1246#endif
b2fb4676 1247 get_frame_saved_regs (frame)[IA64_RNAT_REGNUM] =
1e2330ba 1248 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_RNAT_REGNUM);
b2fb4676 1249 get_frame_saved_regs (frame)[IA64_CCV_REGNUM] =
1e2330ba 1250 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_CCV_REGNUM);
b2fb4676 1251 get_frame_saved_regs (frame)[IA64_UNAT_REGNUM] =
1e2330ba 1252 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_UNAT_REGNUM);
b2fb4676 1253 get_frame_saved_regs (frame)[IA64_FPSR_REGNUM] =
1e2330ba 1254 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_FPSR_REGNUM);
b2fb4676 1255 get_frame_saved_regs (frame)[IA64_PFS_REGNUM] =
1e2330ba 1256 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_PFS_REGNUM);
b2fb4676 1257 get_frame_saved_regs (frame)[IA64_LC_REGNUM] =
1e2330ba 1258 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_LC_REGNUM);
244bc108
KB
1259 for (regno = IA64_GR1_REGNUM; regno <= IA64_GR31_REGNUM; regno++)
1260 if (regno != sp_regnum)
b2fb4676 1261 get_frame_saved_regs (frame)[regno] =
1e2330ba 1262 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), regno);
244bc108 1263 for (regno = IA64_BR0_REGNUM; regno <= IA64_BR7_REGNUM; regno++)
b2fb4676 1264 get_frame_saved_regs (frame)[regno] =
1e2330ba 1265 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), regno);
244bc108 1266 for (regno = IA64_FR2_REGNUM; regno <= IA64_BR7_REGNUM; regno++)
b2fb4676 1267 get_frame_saved_regs (frame)[regno] =
1e2330ba 1268 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), regno);
16461d7d
KB
1269 }
1270 else
1271 {
244bc108 1272 CORE_ADDR func_start;
16461d7d 1273
be41e9f4 1274 func_start = get_frame_func (frame);
50abf9e5 1275 examine_prologue (func_start, get_frame_pc (frame), frame);
244bc108 1276 }
16461d7d
KB
1277}
1278
1279void
1280ia64_get_saved_register (char *raw_buffer,
1281 int *optimized,
1282 CORE_ADDR *addrp,
1283 struct frame_info *frame,
1284 int regnum,
1285 enum lval_type *lval)
1286{
244bc108 1287 int is_dummy_frame;
16461d7d
KB
1288
1289 if (!target_has_registers)
1290 error ("No registers.");
1291
1292 if (optimized != NULL)
1293 *optimized = 0;
244bc108
KB
1294
1295 if (addrp != NULL)
1296 *addrp = 0;
1297
1298 if (lval != NULL)
1299 *lval = not_lval;
1300
1e2330ba
AC
1301 is_dummy_frame = DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
1302 get_frame_base (frame),
1303 get_frame_base (frame));
244bc108 1304
11c02a10 1305 if (regnum == SP_REGNUM && get_next_frame (frame))
16461d7d
KB
1306 {
1307 /* Handle SP values for all frames but the topmost. */
fbd9dcd3
AC
1308 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum),
1309 get_frame_base (frame));
16461d7d
KB
1310 }
1311 else if (regnum == IA64_BSP_REGNUM)
1312 {
fbd9dcd3
AC
1313 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum),
1314 get_frame_extra_info (frame)->bsp);
16461d7d
KB
1315 }
1316 else if (regnum == IA64_VFP_REGNUM)
1317 {
1318 /* If the function in question uses an automatic register (r32-r127)
1319 for the frame pointer, it'll be found by ia64_find_saved_register()
1320 above. If the function lacks one of these frame pointers, we can
1321 still provide a value since we know the size of the frame */
1e2330ba 1322 CORE_ADDR vfp = (get_frame_base (frame)
da50a4b7 1323 + get_frame_extra_info (frame)->mem_stack_frame_size);
fbd9dcd3 1324 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (IA64_VFP_REGNUM), vfp);
16461d7d
KB
1325 }
1326 else if (IA64_PR0_REGNUM <= regnum && regnum <= IA64_PR63_REGNUM)
1327 {
d9d9c31f 1328 char pr_raw_buffer[MAX_REGISTER_SIZE];
16461d7d
KB
1329 int pr_optim;
1330 enum lval_type pr_lval;
1331 CORE_ADDR pr_addr;
1332 int prN_val;
1333 ia64_get_saved_register (pr_raw_buffer, &pr_optim, &pr_addr,
1334 frame, IA64_PR_REGNUM, &pr_lval);
3a854e23
KB
1335 if (IA64_PR16_REGNUM <= regnum && regnum <= IA64_PR63_REGNUM)
1336 {
1337 /* Fetch predicate register rename base from current frame
1338 marker for this frame. */
da50a4b7 1339 int rrb_pr = (get_frame_extra_info (frame)->cfm >> 32) & 0x3f;
3a854e23
KB
1340
1341 /* Adjust the register number to account for register rotation. */
1342 regnum = IA64_PR16_REGNUM
1343 + ((regnum - IA64_PR16_REGNUM) + rrb_pr) % 48;
1344 }
16461d7d
KB
1345 prN_val = extract_bit_field ((unsigned char *) pr_raw_buffer,
1346 regnum - IA64_PR0_REGNUM, 1);
1347 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), prN_val);
16461d7d
KB
1348 }
1349 else if (IA64_NAT0_REGNUM <= regnum && regnum <= IA64_NAT31_REGNUM)
1350 {
d9d9c31f 1351 char unat_raw_buffer[MAX_REGISTER_SIZE];
16461d7d
KB
1352 int unat_optim;
1353 enum lval_type unat_lval;
1354 CORE_ADDR unat_addr;
1355 int unatN_val;
1356 ia64_get_saved_register (unat_raw_buffer, &unat_optim, &unat_addr,
1357 frame, IA64_UNAT_REGNUM, &unat_lval);
1358 unatN_val = extract_bit_field ((unsigned char *) unat_raw_buffer,
1359 regnum - IA64_NAT0_REGNUM, 1);
1360 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum),
1361 unatN_val);
16461d7d
KB
1362 }
1363 else if (IA64_NAT32_REGNUM <= regnum && regnum <= IA64_NAT127_REGNUM)
1364 {
1365 int natval = 0;
1366 /* Find address of general register corresponding to nat bit we're
1367 interested in. */
244bc108
KB
1368 CORE_ADDR gr_addr = 0;
1369
1370 if (!is_dummy_frame)
1371 {
f30ee0bc 1372 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
b2fb4676
AC
1373 gr_addr = get_frame_saved_regs (frame)[ regnum - IA64_NAT0_REGNUM
1374 + IA64_GR0_REGNUM];
244bc108 1375 }
16461d7d
KB
1376 if (gr_addr)
1377 {
1378 /* Compute address of nat collection bits */
1379 CORE_ADDR nat_addr = gr_addr | 0x1f8;
1380 CORE_ADDR bsp = read_register (IA64_BSP_REGNUM);
1381 CORE_ADDR nat_collection;
1382 int nat_bit;
1383 /* If our nat collection address is bigger than bsp, we have to get
1384 the nat collection from rnat. Otherwise, we fetch the nat
1385 collection from the computed address. */
1386 if (nat_addr >= bsp)
1387 nat_collection = read_register (IA64_RNAT_REGNUM);
1388 else
1389 nat_collection = read_memory_integer (nat_addr, 8);
1390 nat_bit = (gr_addr >> 3) & 0x3f;
1391 natval = (nat_collection >> nat_bit) & 1;
1392 }
1393 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), natval);
244bc108
KB
1394 }
1395 else if (regnum == IA64_IP_REGNUM)
1396 {
1397 CORE_ADDR pc;
11c02a10 1398 if (get_next_frame (frame))
244bc108
KB
1399 {
1400 /* FIXME: Set *addrp, *lval when possible. */
11c02a10 1401 pc = ia64_frame_saved_pc (get_next_frame (frame));
244bc108
KB
1402 }
1403 else
1404 {
1405 pc = read_pc ();
1406 }
fbd9dcd3 1407 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (IA64_IP_REGNUM), pc);
244bc108
KB
1408 }
1409 else if (IA64_GR32_REGNUM <= regnum && regnum <= IA64_GR127_REGNUM)
1410 {
1411 CORE_ADDR addr = 0;
1412 if (!is_dummy_frame)
1413 {
f30ee0bc 1414 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
b2fb4676 1415 addr = get_frame_saved_regs (frame)[regnum];
244bc108
KB
1416 }
1417
1418 if (addr != 0)
1419 {
1420 if (lval != NULL)
1421 *lval = lval_memory;
1422 if (addrp != NULL)
1423 *addrp = addr;
1424 read_memory (addr, raw_buffer, REGISTER_RAW_SIZE (regnum));
1425 }
1426 else
1427 {
1428 /* r32 - r127 must be fetchable via memory. If they aren't,
1429 then the register is unavailable */
1430 memset (raw_buffer, 0, REGISTER_RAW_SIZE (regnum));
1431 }
16461d7d
KB
1432 }
1433 else
1434 {
3a854e23
KB
1435 if (IA64_FR32_REGNUM <= regnum && regnum <= IA64_FR127_REGNUM)
1436 {
1437 /* Fetch floating point register rename base from current
1438 frame marker for this frame. */
da50a4b7 1439 int rrb_fr = (get_frame_extra_info (frame)->cfm >> 25) & 0x7f;
3a854e23
KB
1440
1441 /* Adjust the floating point register number to account for
1442 register rotation. */
1443 regnum = IA64_FR32_REGNUM
1444 + ((regnum - IA64_FR32_REGNUM) + rrb_fr) % 96;
1445 }
1446
bdcdd535
AC
1447 deprecated_generic_get_saved_register (raw_buffer, optimized, addrp,
1448 frame, regnum, lval);
16461d7d 1449 }
16461d7d
KB
1450}
1451
1452/* Should we use EXTRACT_STRUCT_VALUE_ADDRESS instead of
1453 EXTRACT_RETURN_VALUE? GCC_P is true if compiled with gcc
1454 and TYPE is the type (which is known to be struct, union or array). */
1455int
1456ia64_use_struct_convention (int gcc_p, struct type *type)
1457{
64a5b29c
KB
1458 struct type *float_elt_type;
1459
1460 /* HFAs are structures (or arrays) consisting entirely of floating
1461 point values of the same length. Up to 8 of these are returned
1462 in registers. Don't use the struct convention when this is the
1463 case. */
1464 float_elt_type = is_float_or_hfa_type (type);
1465 if (float_elt_type != NULL
1466 && TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type) <= 8)
1467 return 0;
1468
1469 /* Other structs of length 32 or less are returned in r8-r11.
1470 Don't use the struct convention for those either. */
16461d7d
KB
1471 return TYPE_LENGTH (type) > 32;
1472}
1473
1474void
1475ia64_extract_return_value (struct type *type, char *regbuf, char *valbuf)
1476{
64a5b29c
KB
1477 struct type *float_elt_type;
1478
1479 float_elt_type = is_float_or_hfa_type (type);
1480 if (float_elt_type != NULL)
1481 {
1482 int offset = 0;
1483 int regnum = IA64_FR8_REGNUM;
1484 int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
1485
1486 while (n-- > 0)
1487 {
1488 ia64_register_convert_to_virtual (regnum, float_elt_type,
1489 &regbuf[REGISTER_BYTE (regnum)], valbuf + offset);
1490 offset += TYPE_LENGTH (float_elt_type);
1491 regnum++;
1492 }
1493 }
16461d7d 1494 else
64a5b29c
KB
1495 memcpy (valbuf, &regbuf[REGISTER_BYTE (IA64_GR8_REGNUM)],
1496 TYPE_LENGTH (type));
16461d7d
KB
1497}
1498
1499/* FIXME: Turn this into a stack of some sort. Unfortunately, something
1500 like this is necessary though since the IA-64 calling conventions specify
1501 that r8 is not preserved. */
1502static CORE_ADDR struct_return_address;
1503
1504CORE_ADDR
1505ia64_extract_struct_value_address (char *regbuf)
1506{
1507 /* FIXME: See above. */
1508 return struct_return_address;
1509}
1510
1511void
1512ia64_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
1513{
1514 /* FIXME: See above. */
1515 /* Note that most of the work was done in ia64_push_arguments() */
1516 struct_return_address = addr;
1517}
1518
1519int
1520ia64_frameless_function_invocation (struct frame_info *frame)
1521{
f30ee0bc 1522 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
da50a4b7 1523 return (get_frame_extra_info (frame)->mem_stack_frame_size == 0);
16461d7d
KB
1524}
1525
1526CORE_ADDR
1527ia64_saved_pc_after_call (struct frame_info *frame)
1528{
1529 return read_register (IA64_BR0_REGNUM);
1530}
1531
1532CORE_ADDR
1533ia64_frame_args_address (struct frame_info *frame)
1534{
1535 /* frame->frame points at the SP for this frame; But we want the start
1536 of the frame, not the end. Calling frame chain will get his for us. */
1537 return ia64_frame_chain (frame);
1538}
1539
1540CORE_ADDR
1541ia64_frame_locals_address (struct frame_info *frame)
1542{
1543 /* frame->frame points at the SP for this frame; But we want the start
1544 of the frame, not the end. Calling frame chain will get his for us. */
1545 return ia64_frame_chain (frame);
1546}
1547
1548void
1549ia64_init_extra_frame_info (int fromleaf, struct frame_info *frame)
1550{
1551 CORE_ADDR bsp, cfm;
11c02a10
AC
1552 int next_frame_is_call_dummy = ((get_next_frame (frame) != NULL)
1553 && DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (get_next_frame (frame)),
1554 get_frame_base (get_next_frame (frame)),
1555 get_frame_base (get_next_frame (frame))));
16461d7d 1556
a00a19e9 1557 frame_extra_info_zalloc (frame, sizeof (struct frame_extra_info));
16461d7d 1558
11c02a10 1559 if (get_next_frame (frame) == 0)
16461d7d
KB
1560 {
1561 bsp = read_register (IA64_BSP_REGNUM);
1562 cfm = read_register (IA64_CFM_REGNUM);
1563
1564 }
11c02a10 1565 else if ((get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME))
244bc108 1566 {
11c02a10
AC
1567 bsp = read_sigcontext_register (get_next_frame (frame), IA64_BSP_REGNUM);
1568 cfm = read_sigcontext_register (get_next_frame (frame), IA64_CFM_REGNUM);
244bc108
KB
1569 }
1570 else if (next_frame_is_call_dummy)
1571 {
11c02a10
AC
1572 bsp = deprecated_read_register_dummy (get_frame_pc (get_next_frame (frame)),
1573 get_frame_base (get_next_frame (frame)),
135c175f 1574 IA64_BSP_REGNUM);
11c02a10
AC
1575 cfm = deprecated_read_register_dummy (get_frame_pc (get_next_frame (frame)),
1576 get_frame_base (get_next_frame (frame)),
135c175f 1577 IA64_CFM_REGNUM);
244bc108 1578 }
16461d7d
KB
1579 else
1580 {
11c02a10 1581 struct frame_info *frn = get_next_frame (frame);
16461d7d 1582
f30ee0bc 1583 DEPRECATED_FRAME_INIT_SAVED_REGS (frn);
16461d7d 1584
b2fb4676
AC
1585 if (get_frame_saved_regs (frn)[IA64_CFM_REGNUM] != 0)
1586 cfm = read_memory_integer (get_frame_saved_regs (frn)[IA64_CFM_REGNUM], 8);
11c02a10
AC
1587 else if (get_next_frame (frn) && (get_frame_type (get_next_frame (frn)) == SIGTRAMP_FRAME))
1588 cfm = read_sigcontext_register (get_next_frame (frn), IA64_PFS_REGNUM);
1589 else if (get_next_frame (frn)
1590 && DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (get_next_frame (frn)),
1591 get_frame_base (get_next_frame (frn)),
1592 get_frame_base (get_next_frame (frn))))
1593 cfm = deprecated_read_register_dummy (get_frame_pc (get_next_frame (frn)),
1594 get_frame_base (get_next_frame (frn)),
135c175f 1595 IA64_PFS_REGNUM);
16461d7d 1596 else
76d689a6 1597 cfm = read_register (IA64_PFS_REGNUM);
16461d7d 1598
da50a4b7 1599 bsp = get_frame_extra_info (frn)->bsp;
16461d7d 1600 }
da50a4b7
AC
1601 get_frame_extra_info (frame)->cfm = cfm;
1602 get_frame_extra_info (frame)->sof = cfm & 0x7f;
1603 get_frame_extra_info (frame)->sol = (cfm >> 7) & 0x7f;
11c02a10
AC
1604 if (get_next_frame (frame) == 0
1605 || (get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME)
244bc108 1606 || next_frame_is_call_dummy)
da50a4b7
AC
1607 get_frame_extra_info (frame)->bsp =
1608 rse_address_add (bsp, -get_frame_extra_info (frame)->sof);
16461d7d 1609 else
da50a4b7
AC
1610 get_frame_extra_info (frame)->bsp =
1611 rse_address_add (bsp, -get_frame_extra_info (frame)->sol);
16461d7d 1612
da50a4b7
AC
1613 get_frame_extra_info (frame)->after_prologue = 0;
1614 get_frame_extra_info (frame)->mem_stack_frame_size = -1; /* Not yet determined */
1615 get_frame_extra_info (frame)->fp_reg = 0;
16461d7d
KB
1616}
1617
64a5b29c
KB
1618static int
1619is_float_or_hfa_type_recurse (struct type *t, struct type **etp)
1620{
1621 switch (TYPE_CODE (t))
1622 {
1623 case TYPE_CODE_FLT:
1624 if (*etp)
1625 return TYPE_LENGTH (*etp) == TYPE_LENGTH (t);
1626 else
1627 {
1628 *etp = t;
1629 return 1;
1630 }
1631 break;
1632 case TYPE_CODE_ARRAY:
98f96ba1
KB
1633 return
1634 is_float_or_hfa_type_recurse (check_typedef (TYPE_TARGET_TYPE (t)),
1635 etp);
64a5b29c
KB
1636 break;
1637 case TYPE_CODE_STRUCT:
1638 {
1639 int i;
1640
1641 for (i = 0; i < TYPE_NFIELDS (t); i++)
98f96ba1
KB
1642 if (!is_float_or_hfa_type_recurse
1643 (check_typedef (TYPE_FIELD_TYPE (t, i)), etp))
64a5b29c
KB
1644 return 0;
1645 return 1;
1646 }
1647 break;
1648 default:
1649 return 0;
1650 break;
1651 }
1652}
1653
1654/* Determine if the given type is one of the floating point types or
1655 and HFA (which is a struct, array, or combination thereof whose
1656 bottom-most elements are all of the same floating point type.) */
1657
1658static struct type *
1659is_float_or_hfa_type (struct type *t)
1660{
1661 struct type *et = 0;
1662
1663 return is_float_or_hfa_type_recurse (t, &et) ? et : 0;
1664}
1665
1666
98f96ba1
KB
1667/* Return 1 if the alignment of T is such that the next even slot
1668 should be used. Return 0, if the next available slot should
1669 be used. (See section 8.5.1 of the IA-64 Software Conventions
1670 and Runtime manual.) */
1671
1672static int
1673slot_alignment_is_next_even (struct type *t)
1674{
1675 switch (TYPE_CODE (t))
1676 {
1677 case TYPE_CODE_INT:
1678 case TYPE_CODE_FLT:
1679 if (TYPE_LENGTH (t) > 8)
1680 return 1;
1681 else
1682 return 0;
1683 case TYPE_CODE_ARRAY:
1684 return
1685 slot_alignment_is_next_even (check_typedef (TYPE_TARGET_TYPE (t)));
1686 case TYPE_CODE_STRUCT:
1687 {
1688 int i;
1689
1690 for (i = 0; i < TYPE_NFIELDS (t); i++)
1691 if (slot_alignment_is_next_even
1692 (check_typedef (TYPE_FIELD_TYPE (t, i))))
1693 return 1;
1694 return 0;
1695 }
1696 default:
1697 return 0;
1698 }
1699}
1700
64a5b29c
KB
1701/* Attempt to find (and return) the global pointer for the given
1702 function.
1703
1704 This is a rather nasty bit of code searchs for the .dynamic section
1705 in the objfile corresponding to the pc of the function we're trying
1706 to call. Once it finds the addresses at which the .dynamic section
1707 lives in the child process, it scans the Elf64_Dyn entries for a
1708 DT_PLTGOT tag. If it finds one of these, the corresponding
1709 d_un.d_ptr value is the global pointer. */
1710
1711static CORE_ADDR
698cb3f0 1712generic_elf_find_global_pointer (CORE_ADDR faddr)
64a5b29c 1713{
76d689a6 1714 struct obj_section *faddr_sect;
64a5b29c 1715
76d689a6
KB
1716 faddr_sect = find_pc_section (faddr);
1717 if (faddr_sect != NULL)
64a5b29c
KB
1718 {
1719 struct obj_section *osect;
1720
76d689a6 1721 ALL_OBJFILE_OSECTIONS (faddr_sect->objfile, osect)
64a5b29c
KB
1722 {
1723 if (strcmp (osect->the_bfd_section->name, ".dynamic") == 0)
1724 break;
1725 }
1726
76d689a6 1727 if (osect < faddr_sect->objfile->sections_end)
64a5b29c
KB
1728 {
1729 CORE_ADDR addr;
1730
1731 addr = osect->addr;
1732 while (addr < osect->endaddr)
1733 {
1734 int status;
1735 LONGEST tag;
1736 char buf[8];
1737
1738 status = target_read_memory (addr, buf, sizeof (buf));
1739 if (status != 0)
1740 break;
1741 tag = extract_signed_integer (buf, sizeof (buf));
1742
1743 if (tag == DT_PLTGOT)
1744 {
1745 CORE_ADDR global_pointer;
1746
1747 status = target_read_memory (addr + 8, buf, sizeof (buf));
1748 if (status != 0)
1749 break;
1750 global_pointer = extract_address (buf, sizeof (buf));
1751
1752 /* The payoff... */
1753 return global_pointer;
1754 }
1755
1756 if (tag == DT_NULL)
1757 break;
1758
1759 addr += 16;
1760 }
1761 }
1762 }
1763 return 0;
1764}
1765
1766/* Given a function's address, attempt to find (and return) the
1767 corresponding (canonical) function descriptor. Return 0 if
1768 not found. */
1769static CORE_ADDR
1770find_extant_func_descr (CORE_ADDR faddr)
1771{
76d689a6 1772 struct obj_section *faddr_sect;
64a5b29c
KB
1773
1774 /* Return early if faddr is already a function descriptor */
76d689a6
KB
1775 faddr_sect = find_pc_section (faddr);
1776 if (faddr_sect && strcmp (faddr_sect->the_bfd_section->name, ".opd") == 0)
64a5b29c
KB
1777 return faddr;
1778
76d689a6 1779 if (faddr_sect != NULL)
64a5b29c 1780 {
76d689a6
KB
1781 struct obj_section *osect;
1782 ALL_OBJFILE_OSECTIONS (faddr_sect->objfile, osect)
64a5b29c
KB
1783 {
1784 if (strcmp (osect->the_bfd_section->name, ".opd") == 0)
1785 break;
1786 }
1787
76d689a6 1788 if (osect < faddr_sect->objfile->sections_end)
64a5b29c
KB
1789 {
1790 CORE_ADDR addr;
1791
1792 addr = osect->addr;
1793 while (addr < osect->endaddr)
1794 {
1795 int status;
1796 LONGEST faddr2;
1797 char buf[8];
1798
1799 status = target_read_memory (addr, buf, sizeof (buf));
1800 if (status != 0)
1801 break;
1802 faddr2 = extract_signed_integer (buf, sizeof (buf));
1803
1804 if (faddr == faddr2)
1805 return addr;
1806
1807 addr += 16;
1808 }
1809 }
1810 }
1811 return 0;
1812}
1813
1814/* Attempt to find a function descriptor corresponding to the
1815 given address. If none is found, construct one on the
1816 stack using the address at fdaptr */
1817
1818static CORE_ADDR
1819find_func_descr (CORE_ADDR faddr, CORE_ADDR *fdaptr)
1820{
1821 CORE_ADDR fdesc;
1822
1823 fdesc = find_extant_func_descr (faddr);
1824
1825 if (fdesc == 0)
1826 {
1827 CORE_ADDR global_pointer;
1828 char buf[16];
1829
1830 fdesc = *fdaptr;
1831 *fdaptr += 16;
1832
698cb3f0 1833 global_pointer = FIND_GLOBAL_POINTER (faddr);
64a5b29c
KB
1834
1835 if (global_pointer == 0)
1836 global_pointer = read_register (IA64_GR1_REGNUM);
1837
fbd9dcd3
AC
1838 store_unsigned_integer (buf, 8, faddr);
1839 store_unsigned_integer (buf + 8, 8, global_pointer);
64a5b29c
KB
1840
1841 write_memory (fdesc, buf, 16);
1842 }
1843
1844 return fdesc;
1845}
16461d7d
KB
1846
1847CORE_ADDR
ea7c478f 1848ia64_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
16461d7d
KB
1849 int struct_return, CORE_ADDR struct_addr)
1850{
1851 int argno;
ea7c478f 1852 struct value *arg;
16461d7d
KB
1853 struct type *type;
1854 int len, argoffset;
64a5b29c 1855 int nslots, rseslots, memslots, slotnum, nfuncargs;
16461d7d 1856 int floatreg;
64a5b29c 1857 CORE_ADDR bsp, cfm, pfs, new_bsp, funcdescaddr;
16461d7d
KB
1858
1859 nslots = 0;
64a5b29c 1860 nfuncargs = 0;
16461d7d
KB
1861 /* Count the number of slots needed for the arguments */
1862 for (argno = 0; argno < nargs; argno++)
1863 {
1864 arg = args[argno];
1865 type = check_typedef (VALUE_TYPE (arg));
1866 len = TYPE_LENGTH (type);
1867
98f96ba1 1868 if ((nslots & 1) && slot_alignment_is_next_even (type))
16461d7d
KB
1869 nslots++;
1870
64a5b29c
KB
1871 if (TYPE_CODE (type) == TYPE_CODE_FUNC)
1872 nfuncargs++;
1873
16461d7d
KB
1874 nslots += (len + 7) / 8;
1875 }
1876
64a5b29c 1877 /* Divvy up the slots between the RSE and the memory stack */
16461d7d
KB
1878 rseslots = (nslots > 8) ? 8 : nslots;
1879 memslots = nslots - rseslots;
1880
64a5b29c 1881 /* Allocate a new RSE frame */
16461d7d
KB
1882 cfm = read_register (IA64_CFM_REGNUM);
1883
1884 bsp = read_register (IA64_BSP_REGNUM);
1885 bsp = rse_address_add (bsp, cfm & 0x7f);
1886 new_bsp = rse_address_add (bsp, rseslots);
1887 write_register (IA64_BSP_REGNUM, new_bsp);
1888
1889 pfs = read_register (IA64_PFS_REGNUM);
1890 pfs &= 0xc000000000000000LL;
1891 pfs |= (cfm & 0xffffffffffffLL);
1892 write_register (IA64_PFS_REGNUM, pfs);
1893
1894 cfm &= 0xc000000000000000LL;
1895 cfm |= rseslots;
1896 write_register (IA64_CFM_REGNUM, cfm);
1897
64a5b29c
KB
1898 /* We will attempt to find function descriptors in the .opd segment,
1899 but if we can't we'll construct them ourselves. That being the
1900 case, we'll need to reserve space on the stack for them. */
1901 funcdescaddr = sp - nfuncargs * 16;
1902 funcdescaddr &= ~0xfLL;
1903
1904 /* Adjust the stack pointer to it's new value. The calling conventions
1905 require us to have 16 bytes of scratch, plus whatever space is
1906 necessary for the memory slots and our function descriptors */
1907 sp = sp - 16 - (memslots + nfuncargs) * 8;
16461d7d
KB
1908 sp &= ~0xfLL; /* Maintain 16 byte alignment */
1909
64a5b29c
KB
1910 /* Place the arguments where they belong. The arguments will be
1911 either placed in the RSE backing store or on the memory stack.
1912 In addition, floating point arguments or HFAs are placed in
1913 floating point registers. */
16461d7d
KB
1914 slotnum = 0;
1915 floatreg = IA64_FR8_REGNUM;
1916 for (argno = 0; argno < nargs; argno++)
1917 {
64a5b29c
KB
1918 struct type *float_elt_type;
1919
16461d7d
KB
1920 arg = args[argno];
1921 type = check_typedef (VALUE_TYPE (arg));
1922 len = TYPE_LENGTH (type);
64a5b29c
KB
1923
1924 /* Special handling for function parameters */
1925 if (len == 8
1926 && TYPE_CODE (type) == TYPE_CODE_PTR
1927 && TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC)
1928 {
1929 char val_buf[8];
1930
fbd9dcd3
AC
1931 store_unsigned_integer (val_buf, 8,
1932 find_func_descr (extract_address (VALUE_CONTENTS (arg), 8),
1933 &funcdescaddr));
64a5b29c
KB
1934 if (slotnum < rseslots)
1935 write_memory (rse_address_add (bsp, slotnum), val_buf, 8);
1936 else
1937 write_memory (sp + 16 + 8 * (slotnum - rseslots), val_buf, 8);
1938 slotnum++;
1939 continue;
1940 }
1941
1942 /* Normal slots */
98f96ba1
KB
1943
1944 /* Skip odd slot if necessary... */
1945 if ((slotnum & 1) && slot_alignment_is_next_even (type))
16461d7d 1946 slotnum++;
98f96ba1 1947
16461d7d
KB
1948 argoffset = 0;
1949 while (len > 0)
1950 {
1951 char val_buf[8];
1952
1953 memset (val_buf, 0, 8);
1954 memcpy (val_buf, VALUE_CONTENTS (arg) + argoffset, (len > 8) ? 8 : len);
1955
1956 if (slotnum < rseslots)
1957 write_memory (rse_address_add (bsp, slotnum), val_buf, 8);
1958 else
1959 write_memory (sp + 16 + 8 * (slotnum - rseslots), val_buf, 8);
1960
1961 argoffset += 8;
1962 len -= 8;
1963 slotnum++;
1964 }
64a5b29c
KB
1965
1966 /* Handle floating point types (including HFAs) */
1967 float_elt_type = is_float_or_hfa_type (type);
1968 if (float_elt_type != NULL)
1969 {
1970 argoffset = 0;
1971 len = TYPE_LENGTH (type);
1972 while (len > 0 && floatreg < IA64_FR16_REGNUM)
1973 {
1974 ia64_register_convert_to_raw (
1975 float_elt_type,
1976 floatreg,
1977 VALUE_CONTENTS (arg) + argoffset,
524d7c18 1978 &deprecated_registers[REGISTER_BYTE (floatreg)]);
64a5b29c
KB
1979 floatreg++;
1980 argoffset += TYPE_LENGTH (float_elt_type);
1981 len -= TYPE_LENGTH (float_elt_type);
1982 }
16461d7d
KB
1983 }
1984 }
1985
64a5b29c 1986 /* Store the struct return value in r8 if necessary. */
16461d7d
KB
1987 if (struct_return)
1988 {
fbd9dcd3
AC
1989 store_unsigned_integer (&deprecated_registers[REGISTER_BYTE (IA64_GR8_REGNUM)],
1990 REGISTER_RAW_SIZE (IA64_GR8_REGNUM),
1991 struct_addr);
16461d7d
KB
1992 }
1993
64a5b29c 1994 /* Sync gdb's idea of what the registers are with the target. */
16461d7d
KB
1995 target_store_registers (-1);
1996
1997 /* FIXME: This doesn't belong here! Instead, SAVE_DUMMY_FRAME_TOS needs
1998 to be defined to call generic_save_dummy_frame_tos(). But at the
1999 time of this writing, SAVE_DUMMY_FRAME_TOS wasn't gdbarch'd, so
2000 I chose to put this call here instead of using the old mechanisms.
2001 Once SAVE_DUMMY_FRAME_TOS is gdbarch'd, all we need to do is add the
2002 line
2003
2004 set_gdbarch_save_dummy_frame_tos (gdbarch, generic_save_dummy_frame_tos);
2005
2006 to ia64_gdbarch_init() and remove the line below. */
2007 generic_save_dummy_frame_tos (sp);
2008
2009 return sp;
2010}
2011
2012CORE_ADDR
2013ia64_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
2014{
698cb3f0 2015 CORE_ADDR global_pointer = FIND_GLOBAL_POINTER (pc);
16461d7d 2016
64a5b29c
KB
2017 if (global_pointer != 0)
2018 write_register (IA64_GR1_REGNUM, global_pointer);
16461d7d
KB
2019
2020 write_register (IA64_BR0_REGNUM, CALL_DUMMY_ADDRESS ());
2021 return sp;
2022}
2023
2024void
2025ia64_store_return_value (struct type *type, char *valbuf)
2026{
2027 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2028 {
2029 ia64_register_convert_to_raw (type, IA64_FR8_REGNUM, valbuf,
524d7c18 2030 &deprecated_registers[REGISTER_BYTE (IA64_FR8_REGNUM)]);
16461d7d
KB
2031 target_store_registers (IA64_FR8_REGNUM);
2032 }
2033 else
73937e03
AC
2034 deprecated_write_register_bytes (REGISTER_BYTE (IA64_GR8_REGNUM),
2035 valbuf, TYPE_LENGTH (type));
16461d7d
KB
2036}
2037
2038void
2039ia64_pop_frame (void)
2040{
2041 generic_pop_current_frame (ia64_pop_frame_regular);
2042}
2043
2044static void
2045ia64_pop_frame_regular (struct frame_info *frame)
2046{
2047 int regno;
2048 CORE_ADDR bsp, cfm, pfs;
2049
f30ee0bc 2050 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
16461d7d
KB
2051
2052 for (regno = 0; regno < ia64_num_regs; regno++)
2053 {
b2fb4676 2054 if (get_frame_saved_regs (frame)[regno]
16461d7d
KB
2055 && (!(IA64_GR32_REGNUM <= regno && regno <= IA64_GR127_REGNUM))
2056 && regno != pc_regnum
2057 && regno != sp_regnum
2058 && regno != IA64_PFS_REGNUM
2059 && regno != IA64_CFM_REGNUM
2060 && regno != IA64_BSP_REGNUM
2061 && regno != IA64_BSPSTORE_REGNUM)
2062 {
2063 write_register (regno,
b2fb4676 2064 read_memory_integer (get_frame_saved_regs (frame)[regno],
16461d7d
KB
2065 REGISTER_RAW_SIZE (regno)));
2066 }
2067 }
2068
618ce49f 2069 write_register (sp_regnum, DEPRECATED_FRAME_CHAIN (frame));
8bedc050 2070 write_pc (DEPRECATED_FRAME_SAVED_PC (frame));
16461d7d
KB
2071
2072 cfm = read_register (IA64_CFM_REGNUM);
2073
b2fb4676 2074 if (get_frame_saved_regs (frame)[IA64_PFS_REGNUM])
16461d7d 2075 {
b2fb4676 2076 pfs = read_memory_integer (get_frame_saved_regs (frame)[IA64_PFS_REGNUM],
16461d7d
KB
2077 REGISTER_RAW_SIZE (IA64_PFS_REGNUM));
2078 }
2079 else
2080 pfs = read_register (IA64_PFS_REGNUM);
2081
2082 /* Compute the new bsp by *adding* the difference between the
2083 size of the frame and the size of the locals (both wrt the
2084 frame that we're going back to). This seems kind of strange,
2085 especially since it seems like we ought to be subtracting the
ca557f44 2086 size of the locals... and we should; but the Linux kernel
16461d7d
KB
2087 wants bsp to be set at the end of all used registers. It's
2088 likely that this code will need to be revised to accomodate
2089 other operating systems. */
da50a4b7 2090 bsp = rse_address_add (get_frame_extra_info (frame)->bsp,
16461d7d
KB
2091 (pfs & 0x7f) - ((pfs >> 7) & 0x7f));
2092 write_register (IA64_BSP_REGNUM, bsp);
2093
2094 /* FIXME: What becomes of the epilog count in the PFS? */
2095 cfm = (cfm & ~0xffffffffffffLL) | (pfs & 0xffffffffffffLL);
2096 write_register (IA64_CFM_REGNUM, cfm);
2097
2098 flush_cached_frames ();
2099}
2100
2101static void
1750fa04
AC
2102ia64_remote_translate_xfer_address (struct gdbarch *gdbarch,
2103 struct regcache *regcache,
2104 CORE_ADDR memaddr, int nr_bytes,
16461d7d
KB
2105 CORE_ADDR *targ_addr, int *targ_len)
2106{
2107 *targ_addr = memaddr;
2108 *targ_len = nr_bytes;
2109}
2110
244bc108
KB
2111static void
2112process_note_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
2113{
2114 int *os_ident_ptr = obj;
2115 const char *name;
2116 unsigned int sectsize;
2117
2118 name = bfd_get_section_name (abfd, sect);
2119 sectsize = bfd_section_size (abfd, sect);
2120 if (strcmp (name, ".note.ABI-tag") == 0 && sectsize > 0)
2121 {
2122 unsigned int name_length, data_length, note_type;
2123 char *note = alloca (sectsize);
2124
2125 bfd_get_section_contents (abfd, sect, note,
2126 (file_ptr) 0, (bfd_size_type) sectsize);
2127
2128 name_length = bfd_h_get_32 (abfd, note);
2129 data_length = bfd_h_get_32 (abfd, note + 4);
2130 note_type = bfd_h_get_32 (abfd, note + 8);
2131
2132 if (name_length == 4 && data_length == 16 && note_type == 1
2133 && strcmp (note + 12, "GNU") == 0)
2134 {
2135 int os_number = bfd_h_get_32 (abfd, note + 16);
2136
2137 /* The case numbers are from abi-tags in glibc */
2138 switch (os_number)
2139 {
2140 case 0 :
2141 *os_ident_ptr = ELFOSABI_LINUX;
2142 break;
244bc108
KB
2143 case 1 :
2144 *os_ident_ptr = ELFOSABI_HURD;
2145 break;
2146 case 2 :
2147 *os_ident_ptr = ELFOSABI_SOLARIS;
2148 break;
244bc108 2149 default :
8e65ff28
AC
2150 internal_error (__FILE__, __LINE__,
2151 "process_note_abi_sections: unknown OS number %d", os_number);
244bc108
KB
2152 break;
2153 }
2154 }
2155 }
2156}
2157
16461d7d
KB
2158static struct gdbarch *
2159ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2160{
2161 struct gdbarch *gdbarch;
244bc108
KB
2162 struct gdbarch_tdep *tdep;
2163 int os_ident;
2164
2165 if (info.abfd != NULL
2166 && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
2167 {
2168 os_ident = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
2169
ca557f44
AC
2170 /* If os_ident is 0, it is not necessarily the case that we're
2171 on a SYSV system. (ELFOSABI_NONE is defined to be 0.)
2172 GNU/Linux uses a note section to record OS/ABI info, but
2173 leaves e_ident[EI_OSABI] zero. So we have to check for note
2174 sections too. */
244bc108
KB
2175 if (os_ident == 0)
2176 {
2177 bfd_map_over_sections (info.abfd,
2178 process_note_abi_tag_sections,
2179 &os_ident);
2180 }
2181 }
2182 else
2183 os_ident = -1;
16461d7d 2184
244bc108
KB
2185 for (arches = gdbarch_list_lookup_by_info (arches, &info);
2186 arches != NULL;
2187 arches = gdbarch_list_lookup_by_info (arches->next, &info))
2188 {
57bc8964
KB
2189 tdep = gdbarch_tdep (arches->gdbarch);
2190 if (tdep &&tdep->os_ident == os_ident)
2191 return arches->gdbarch;
244bc108 2192 }
16461d7d 2193
244bc108
KB
2194 tdep = xmalloc (sizeof (struct gdbarch_tdep));
2195 gdbarch = gdbarch_alloc (&info, tdep);
2196 tdep->os_ident = os_ident;
2197
a5afb99f
AC
2198 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
2199 ready to unwind the PC first (see frame.c:get_prev_frame()). */
2200 set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
d7fa2ae2
KB
2201
2202 /* Set the method of obtaining the sigcontext addresses at which
2203 registers are saved. The method of checking to see if
2204 native_find_global_pointer is nonzero to indicate that we're
2205 on AIX is kind of hokey, but I can't think of a better way
2206 to do it. */
244bc108
KB
2207 if (os_ident == ELFOSABI_LINUX)
2208 tdep->sigcontext_register_address = ia64_linux_sigcontext_register_address;
d7fa2ae2
KB
2209 else if (native_find_global_pointer != 0)
2210 tdep->sigcontext_register_address = ia64_aix_sigcontext_register_address;
244bc108
KB
2211 else
2212 tdep->sigcontext_register_address = 0;
16461d7d 2213
ca557f44
AC
2214 /* We know that GNU/Linux won't have to resort to the
2215 native_find_global_pointer hackery. But that's the only one we
2216 know about so far, so if native_find_global_pointer is set to
2217 something non-zero, then use it. Otherwise fall back to using
2218 generic_elf_find_global_pointer. This arrangement should (in
2219 theory) allow us to cross debug GNU/Linux binaries from an AIX
2220 machine. */
698cb3f0
KB
2221 if (os_ident == ELFOSABI_LINUX)
2222 tdep->find_global_pointer = generic_elf_find_global_pointer;
2223 else if (native_find_global_pointer != 0)
2224 tdep->find_global_pointer = native_find_global_pointer;
2225 else
2226 tdep->find_global_pointer = generic_elf_find_global_pointer;
2227
16461d7d
KB
2228 set_gdbarch_short_bit (gdbarch, 16);
2229 set_gdbarch_int_bit (gdbarch, 32);
2230 set_gdbarch_long_bit (gdbarch, 64);
2231 set_gdbarch_long_long_bit (gdbarch, 64);
2232 set_gdbarch_float_bit (gdbarch, 32);
2233 set_gdbarch_double_bit (gdbarch, 64);
2234 set_gdbarch_long_double_bit (gdbarch, 64);
2235 set_gdbarch_ptr_bit (gdbarch, 64);
2236
2237 set_gdbarch_num_regs (gdbarch, ia64_num_regs);
2238 set_gdbarch_sp_regnum (gdbarch, sp_regnum);
0ba6dca9 2239 set_gdbarch_deprecated_fp_regnum (gdbarch, fp_regnum);
16461d7d 2240 set_gdbarch_pc_regnum (gdbarch, pc_regnum);
698cb3f0 2241 set_gdbarch_fp0_regnum (gdbarch, IA64_FR0_REGNUM);
16461d7d
KB
2242
2243 set_gdbarch_register_name (gdbarch, ia64_register_name);
b1e29e33 2244 set_gdbarch_deprecated_register_size (gdbarch, 8);
16461d7d
KB
2245 set_gdbarch_register_bytes (gdbarch, ia64_num_regs * 8 + 128*8);
2246 set_gdbarch_register_byte (gdbarch, ia64_register_byte);
2247 set_gdbarch_register_raw_size (gdbarch, ia64_register_raw_size);
a0ed5532 2248 set_gdbarch_deprecated_max_register_raw_size (gdbarch, 16);
16461d7d 2249 set_gdbarch_register_virtual_size (gdbarch, ia64_register_virtual_size);
a0ed5532 2250 set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 16);
16461d7d
KB
2251 set_gdbarch_register_virtual_type (gdbarch, ia64_register_virtual_type);
2252
2253 set_gdbarch_skip_prologue (gdbarch, ia64_skip_prologue);
2254
2255 set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
2256 set_gdbarch_frameless_function_invocation (gdbarch, ia64_frameless_function_invocation);
2257
6913c89a 2258 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, ia64_saved_pc_after_call);
16461d7d 2259
618ce49f 2260 set_gdbarch_deprecated_frame_chain (gdbarch, ia64_frame_chain);
8bedc050 2261 set_gdbarch_deprecated_frame_saved_pc (gdbarch, ia64_frame_saved_pc);
16461d7d 2262
f30ee0bc 2263 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, ia64_frame_init_saved_regs);
129c1cd6 2264 set_gdbarch_deprecated_get_saved_register (gdbarch, ia64_get_saved_register);
16461d7d
KB
2265
2266 set_gdbarch_register_convertible (gdbarch, ia64_register_convertible);
2267 set_gdbarch_register_convert_to_virtual (gdbarch, ia64_register_convert_to_virtual);
2268 set_gdbarch_register_convert_to_raw (gdbarch, ia64_register_convert_to_raw);
2269
2270 set_gdbarch_use_struct_convention (gdbarch, ia64_use_struct_convention);
26e9b323 2271 set_gdbarch_deprecated_extract_return_value (gdbarch, ia64_extract_return_value);
16461d7d 2272
4183d812 2273 set_gdbarch_deprecated_store_struct_return (gdbarch, ia64_store_struct_return);
ebba8386 2274 set_gdbarch_deprecated_store_return_value (gdbarch, ia64_store_return_value);
26e9b323 2275 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, ia64_extract_struct_value_address);
16461d7d
KB
2276
2277 set_gdbarch_memory_insert_breakpoint (gdbarch, ia64_memory_insert_breakpoint);
2278 set_gdbarch_memory_remove_breakpoint (gdbarch, ia64_memory_remove_breakpoint);
2279 set_gdbarch_breakpoint_from_pc (gdbarch, ia64_breakpoint_from_pc);
2280 set_gdbarch_read_pc (gdbarch, ia64_read_pc);
2281 set_gdbarch_write_pc (gdbarch, ia64_write_pc);
2282
2283 /* Settings for calling functions in the inferior. */
b81774d8 2284 set_gdbarch_deprecated_push_arguments (gdbarch, ia64_push_arguments);
28f617b3 2285 set_gdbarch_deprecated_push_return_address (gdbarch, ia64_push_return_address);
749b82f6 2286 set_gdbarch_deprecated_pop_frame (gdbarch, ia64_pop_frame);
16461d7d 2287
b1e29e33
AC
2288 set_gdbarch_deprecated_call_dummy_words (gdbarch, ia64_call_dummy_words);
2289 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof (ia64_call_dummy_words));
e9582e71 2290 set_gdbarch_deprecated_init_extra_frame_info (gdbarch, ia64_init_extra_frame_info);
16461d7d
KB
2291 set_gdbarch_frame_args_address (gdbarch, ia64_frame_args_address);
2292 set_gdbarch_frame_locals_address (gdbarch, ia64_frame_locals_address);
2293
0ba6dca9
AC
2294 /* We won't necessarily have a frame pointer and even if we do, it
2295 winds up being extraordinarly messy when attempting to find the
2296 frame chain. So for the purposes of creating frames (which is
2297 all deprecated_read_fp() is used for), simply use the stack
2298 pointer value instead. */
2299 set_gdbarch_deprecated_target_read_fp (gdbarch, generic_target_read_sp);
16461d7d
KB
2300
2301 /* Settings that should be unnecessary. */
2302 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
2303
2304 set_gdbarch_read_sp (gdbarch, generic_target_read_sp);
6c0e89ed 2305 set_gdbarch_deprecated_dummy_write_sp (gdbarch, generic_target_write_sp);
16461d7d 2306
16461d7d
KB
2307 set_gdbarch_decr_pc_after_break (gdbarch, 0);
2308 set_gdbarch_function_start_offset (gdbarch, 0);
4156bb53 2309 set_gdbarch_frame_args_skip (gdbarch, 0);
16461d7d
KB
2310
2311 set_gdbarch_remote_translate_xfer_address (
2312 gdbarch, ia64_remote_translate_xfer_address);
2313
2314 return gdbarch;
2315}
2316
2317void
2318_initialize_ia64_tdep (void)
2319{
2320 register_gdbarch_init (bfd_arch_ia64, ia64_gdbarch_init);
2321
d7a27068 2322 deprecated_tm_print_insn = print_insn_ia64;
810ecf9f 2323 deprecated_tm_print_insn_info.bytes_per_line = SLOT_MULTIPLIER;
16461d7d 2324}
This page took 0.481746 seconds and 4 git commands to generate.