libiberty/ChangeLog:
[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. */
740static int max_skip_non_prologue_insns = 10;
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];
58ab00f9 828 int trust_limit;
0927a22b
KB
829
830 memset (instores, 0, sizeof instores);
831 memset (infpstores, 0, sizeof infpstores);
16461d7d 832
b2fb4676 833 if (frame && !get_frame_saved_regs (frame))
16461d7d
KB
834 {
835 frame_saved_regs_zalloc (frame);
836 do_fsr_stuff = 1;
837 }
838
839 if (frame
840 && !do_fsr_stuff
da50a4b7
AC
841 && get_frame_extra_info (frame)->after_prologue != 0
842 && get_frame_extra_info (frame)->after_prologue <= lim_pc)
843 return get_frame_extra_info (frame)->after_prologue;
16461d7d 844
58ab00f9
KB
845 lim_pc = refine_prologue_limit (pc, lim_pc, &trust_limit);
846
16461d7d
KB
847 /* Must start with an alloc instruction */
848 next_pc = fetch_instruction (pc, &it, &instr);
849 if (pc < lim_pc && next_pc
850 && it == M && ((instr & 0x1ee0000003fLL) == 0x02c00000000LL))
851 {
852 /* alloc */
853 int sor = (int) ((instr & 0x00078000000LL) >> 27);
854 int sol = (int) ((instr & 0x00007f00000LL) >> 20);
855 int sof = (int) ((instr & 0x000000fe000LL) >> 13);
856 /* Okay, so sor, sol, and sof aren't used right now; but perhaps
857 we could compare against the size given to us via the cfm as
858 either a sanity check or possibly to see if the frame has been
859 changed by a later alloc instruction... */
860 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
861 cfm_reg = rN;
862 last_prologue_pc = next_pc;
863 pc = next_pc;
864 }
865 else
58ab00f9
KB
866 {
867 pc = lim_pc; /* Frameless: We're done early. */
868 if (trust_limit)
869 last_prologue_pc = lim_pc;
870 }
16461d7d
KB
871
872 /* Loop, looking for prologue instructions, keeping track of
873 where preserved registers were spilled. */
874 while (pc < lim_pc)
875 {
876 next_pc = fetch_instruction (pc, &it, &instr);
877 if (next_pc == 0)
878 break;
879
902d7086
KB
880 if ((it == B && ((instr & 0x1e1f800003f) != 0x04000000000))
881 || ((instr & 0x3fLL) != 0LL))
0927a22b 882 {
902d7086
KB
883 /* Exit loop upon hitting a non-nop branch instruction
884 or a predicated instruction. */
0927a22b
KB
885 break;
886 }
887 else if (it == I && ((instr & 0x1eff8000000LL) == 0x00188000000LL))
16461d7d
KB
888 {
889 /* Move from BR */
890 int b2 = (int) ((instr & 0x0000000e000LL) >> 13);
891 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
892 int qp = (int) (instr & 0x0000000003f);
893
894 if (qp == 0 && b2 == 0 && rN >= 32 && ret_reg == 0)
895 {
896 ret_reg = rN;
897 last_prologue_pc = next_pc;
898 }
899 }
900 else if ((it == I || it == M)
901 && ((instr & 0x1ee00000000LL) == 0x10800000000LL))
902 {
903 /* adds rN = imm14, rM (or mov rN, rM when imm14 is 0) */
904 int imm = (int) ((((instr & 0x01000000000LL) ? -1 : 0) << 13)
905 | ((instr & 0x001f8000000LL) >> 20)
906 | ((instr & 0x000000fe000LL) >> 13));
907 int rM = (int) ((instr & 0x00007f00000LL) >> 20);
908 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
909 int qp = (int) (instr & 0x0000000003fLL);
910
911 if (qp == 0 && rN >= 32 && imm == 0 && rM == 12 && fp_reg == 0)
912 {
913 /* mov rN, r12 */
914 fp_reg = rN;
915 last_prologue_pc = next_pc;
916 }
917 else if (qp == 0 && rN == 12 && rM == 12)
918 {
919 /* adds r12, -mem_stack_frame_size, r12 */
920 mem_stack_frame_size -= imm;
921 last_prologue_pc = next_pc;
922 }
923 else if (qp == 0 && rN == 2
924 && ((rM == fp_reg && fp_reg != 0) || rM == 12))
925 {
926 /* adds r2, spilloffset, rFramePointer
927 or
928 adds r2, spilloffset, r12
929
930 Get ready for stf.spill or st8.spill instructions.
931 The address to start spilling at is loaded into r2.
932 FIXME: Why r2? That's what gcc currently uses; it
933 could well be different for other compilers. */
934
935 /* Hmm... whether or not this will work will depend on
936 where the pc is. If it's still early in the prologue
937 this'll be wrong. FIXME */
1e2330ba 938 spill_addr = (frame ? get_frame_base (frame) : 0)
16461d7d
KB
939 + (rM == 12 ? 0 : mem_stack_frame_size)
940 + imm;
941 spill_reg = rN;
942 last_prologue_pc = next_pc;
943 }
944 }
945 else if (it == M
946 && ( ((instr & 0x1efc0000000LL) == 0x0eec0000000LL)
947 || ((instr & 0x1ffc8000000LL) == 0x0cec0000000LL) ))
948 {
949 /* stf.spill [rN] = fM, imm9
950 or
951 stf.spill [rN] = fM */
952
953 int imm = imm9(instr);
954 int rN = (int) ((instr & 0x00007f00000LL) >> 20);
955 int fM = (int) ((instr & 0x000000fe000LL) >> 13);
956 int qp = (int) (instr & 0x0000000003fLL);
957 if (qp == 0 && rN == spill_reg && spill_addr != 0
958 && ((2 <= fM && fM <= 5) || (16 <= fM && fM <= 31)))
959 {
960 if (do_fsr_stuff)
b2fb4676 961 get_frame_saved_regs (frame)[IA64_FR0_REGNUM + fM] = spill_addr;
16461d7d
KB
962
963 if ((instr & 0x1efc0000000) == 0x0eec0000000)
964 spill_addr += imm;
965 else
966 spill_addr = 0; /* last one; must be done */
967 last_prologue_pc = next_pc;
968 }
969 }
970 else if ((it == M && ((instr & 0x1eff8000000LL) == 0x02110000000LL))
971 || (it == I && ((instr & 0x1eff8000000LL) == 0x00050000000LL)) )
972 {
973 /* mov.m rN = arM
974 or
975 mov.i rN = arM */
976
977 int arM = (int) ((instr & 0x00007f00000LL) >> 20);
978 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
979 int qp = (int) (instr & 0x0000000003fLL);
980 if (qp == 0 && isScratch (rN) && arM == 36 /* ar.unat */)
981 {
982 /* We have something like "mov.m r3 = ar.unat". Remember the
983 r3 (or whatever) and watch for a store of this register... */
984 unat_save_reg = rN;
985 last_prologue_pc = next_pc;
986 }
987 }
988 else if (it == I && ((instr & 0x1eff8000000LL) == 0x00198000000LL))
989 {
990 /* mov rN = pr */
991 int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
992 int qp = (int) (instr & 0x0000000003fLL);
993 if (qp == 0 && isScratch (rN))
994 {
995 pr_save_reg = rN;
996 last_prologue_pc = next_pc;
997 }
998 }
999 else if (it == M
1000 && ( ((instr & 0x1ffc8000000LL) == 0x08cc0000000LL)
1001 || ((instr & 0x1efc0000000LL) == 0x0acc0000000LL)))
1002 {
1003 /* st8 [rN] = rM
1004 or
1005 st8 [rN] = rM, imm9 */
1006 int rN = (int) ((instr & 0x00007f00000LL) >> 20);
1007 int rM = (int) ((instr & 0x000000fe000LL) >> 13);
1008 int qp = (int) (instr & 0x0000000003fLL);
1009 if (qp == 0 && rN == spill_reg && spill_addr != 0
1010 && (rM == unat_save_reg || rM == pr_save_reg))
1011 {
1012 /* We've found a spill of either the UNAT register or the PR
1013 register. (Well, not exactly; what we've actually found is
1014 a spill of the register that UNAT or PR was moved to).
1015 Record that fact and move on... */
1016 if (rM == unat_save_reg)
1017 {
1018 /* Track UNAT register */
1019 if (do_fsr_stuff)
b2fb4676 1020 get_frame_saved_regs (frame)[IA64_UNAT_REGNUM] = spill_addr;
16461d7d
KB
1021 unat_save_reg = 0;
1022 }
1023 else
1024 {
1025 /* Track PR register */
1026 if (do_fsr_stuff)
b2fb4676 1027 get_frame_saved_regs (frame)[IA64_PR_REGNUM] = spill_addr;
16461d7d
KB
1028 pr_save_reg = 0;
1029 }
1030 if ((instr & 0x1efc0000000LL) == 0x0acc0000000LL)
1031 /* st8 [rN] = rM, imm9 */
1032 spill_addr += imm9(instr);
1033 else
1034 spill_addr = 0; /* must be done spilling */
1035 last_prologue_pc = next_pc;
1036 }
0927a22b
KB
1037 else if (qp == 0 && 32 <= rM && rM < 40 && !instores[rM-32])
1038 {
1039 /* Allow up to one store of each input register. */
1040 instores[rM-32] = 1;
1041 last_prologue_pc = next_pc;
1042 }
1043 }
1044 else if (it == M && ((instr & 0x1ff08000000LL) == 0x08c00000000LL))
1045 {
1046 /* One of
1047 st1 [rN] = rM
1048 st2 [rN] = rM
1049 st4 [rN] = rM
1050 st8 [rN] = rM
1051 Note that the st8 case is handled in the clause above.
1052
1053 Advance over stores of input registers. One store per input
1054 register is permitted. */
1055 int rM = (int) ((instr & 0x000000fe000LL) >> 13);
1056 int qp = (int) (instr & 0x0000000003fLL);
1057 if (qp == 0 && 32 <= rM && rM < 40 && !instores[rM-32])
1058 {
1059 instores[rM-32] = 1;
1060 last_prologue_pc = next_pc;
1061 }
1062 }
1063 else if (it == M && ((instr & 0x1ff88000000LL) == 0x0cc80000000LL))
1064 {
1065 /* Either
1066 stfs [rN] = fM
1067 or
1068 stfd [rN] = fM
1069
1070 Advance over stores of floating point input registers. Again
1071 one store per register is permitted */
1072 int fM = (int) ((instr & 0x000000fe000LL) >> 13);
1073 int qp = (int) (instr & 0x0000000003fLL);
1074 if (qp == 0 && 8 <= fM && fM < 16 && !infpstores[fM - 8])
1075 {
1076 infpstores[fM-8] = 1;
1077 last_prologue_pc = next_pc;
1078 }
16461d7d
KB
1079 }
1080 else if (it == M
1081 && ( ((instr & 0x1ffc8000000LL) == 0x08ec0000000LL)
1082 || ((instr & 0x1efc0000000LL) == 0x0aec0000000LL)))
1083 {
1084 /* st8.spill [rN] = rM
1085 or
1086 st8.spill [rN] = rM, imm9 */
1087 int rN = (int) ((instr & 0x00007f00000LL) >> 20);
1088 int rM = (int) ((instr & 0x000000fe000LL) >> 13);
1089 int qp = (int) (instr & 0x0000000003fLL);
1090 if (qp == 0 && rN == spill_reg && 4 <= rM && rM <= 7)
1091 {
1092 /* We've found a spill of one of the preserved general purpose
1093 regs. Record the spill address and advance the spill
1094 register if appropriate. */
1095 if (do_fsr_stuff)
b2fb4676 1096 get_frame_saved_regs (frame)[IA64_GR0_REGNUM + rM] = spill_addr;
16461d7d
KB
1097 if ((instr & 0x1efc0000000LL) == 0x0aec0000000LL)
1098 /* st8.spill [rN] = rM, imm9 */
1099 spill_addr += imm9(instr);
1100 else
1101 spill_addr = 0; /* Done spilling */
1102 last_prologue_pc = next_pc;
1103 }
1104 }
16461d7d
KB
1105
1106 pc = next_pc;
1107 }
1108
1109 if (do_fsr_stuff) {
1110 int i;
1111 CORE_ADDR addr;
3a854e23
KB
1112 int sor, rrb_gr;
1113
1114 /* Extract the size of the rotating portion of the stack
1115 frame and the register rename base from the current
1116 frame marker. */
da50a4b7
AC
1117 sor = ((get_frame_extra_info (frame)->cfm >> 14) & 0xf) * 8;
1118 rrb_gr = (get_frame_extra_info (frame)->cfm >> 18) & 0x7f;
16461d7d 1119
da50a4b7
AC
1120 for (i = 0, addr = get_frame_extra_info (frame)->bsp;
1121 i < get_frame_extra_info (frame)->sof;
16461d7d
KB
1122 i++, addr += 8)
1123 {
1124 if (IS_NaT_COLLECTION_ADDR (addr))
1125 {
1126 addr += 8;
1127 }
3a854e23 1128 if (i < sor)
b2fb4676 1129 get_frame_saved_regs (frame)[IA64_GR32_REGNUM + ((i + (sor - rrb_gr)) % sor)]
3a854e23
KB
1130 = addr;
1131 else
b2fb4676 1132 get_frame_saved_regs (frame)[IA64_GR32_REGNUM + i] = addr;
16461d7d
KB
1133
1134 if (i+32 == cfm_reg)
b2fb4676 1135 get_frame_saved_regs (frame)[IA64_CFM_REGNUM] = addr;
16461d7d 1136 if (i+32 == ret_reg)
b2fb4676 1137 get_frame_saved_regs (frame)[IA64_VRAP_REGNUM] = addr;
16461d7d 1138 if (i+32 == fp_reg)
b2fb4676 1139 get_frame_saved_regs (frame)[IA64_VFP_REGNUM] = addr;
16461d7d
KB
1140 }
1141 }
1142
da50a4b7
AC
1143 if (frame && get_frame_extra_info (frame))
1144 {
1145 get_frame_extra_info (frame)->after_prologue = last_prologue_pc;
1146 get_frame_extra_info (frame)->mem_stack_frame_size = mem_stack_frame_size;
1147 get_frame_extra_info (frame)->fp_reg = fp_reg;
1148 }
16461d7d
KB
1149
1150 return last_prologue_pc;
1151}
1152
1153CORE_ADDR
1154ia64_skip_prologue (CORE_ADDR pc)
1155{
1156 return examine_prologue (pc, pc+1024, 0);
1157}
1158
1159void
1160ia64_frame_init_saved_regs (struct frame_info *frame)
1161{
b2fb4676 1162 if (get_frame_saved_regs (frame))
16461d7d
KB
1163 return;
1164
5a203e44 1165 if ((get_frame_type (frame) == SIGTRAMP_FRAME) && SIGCONTEXT_REGISTER_ADDRESS)
244bc108
KB
1166 {
1167 int regno;
16461d7d 1168
244bc108 1169 frame_saved_regs_zalloc (frame);
16461d7d 1170
b2fb4676 1171 get_frame_saved_regs (frame)[IA64_VRAP_REGNUM] =
1e2330ba 1172 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_IP_REGNUM);
b2fb4676 1173 get_frame_saved_regs (frame)[IA64_CFM_REGNUM] =
1e2330ba 1174 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_CFM_REGNUM);
b2fb4676 1175 get_frame_saved_regs (frame)[IA64_PSR_REGNUM] =
1e2330ba 1176 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_PSR_REGNUM);
244bc108 1177#if 0
b2fb4676 1178 get_frame_saved_regs (frame)[IA64_BSP_REGNUM] =
244bc108
KB
1179 SIGCONTEXT_REGISTER_ADDRESS (frame->frame, IA64_BSP_REGNUM);
1180#endif
b2fb4676 1181 get_frame_saved_regs (frame)[IA64_RNAT_REGNUM] =
1e2330ba 1182 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_RNAT_REGNUM);
b2fb4676 1183 get_frame_saved_regs (frame)[IA64_CCV_REGNUM] =
1e2330ba 1184 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_CCV_REGNUM);
b2fb4676 1185 get_frame_saved_regs (frame)[IA64_UNAT_REGNUM] =
1e2330ba 1186 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_UNAT_REGNUM);
b2fb4676 1187 get_frame_saved_regs (frame)[IA64_FPSR_REGNUM] =
1e2330ba 1188 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_FPSR_REGNUM);
b2fb4676 1189 get_frame_saved_regs (frame)[IA64_PFS_REGNUM] =
1e2330ba 1190 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_PFS_REGNUM);
b2fb4676 1191 get_frame_saved_regs (frame)[IA64_LC_REGNUM] =
1e2330ba 1192 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), IA64_LC_REGNUM);
244bc108
KB
1193 for (regno = IA64_GR1_REGNUM; regno <= IA64_GR31_REGNUM; regno++)
1194 if (regno != sp_regnum)
b2fb4676 1195 get_frame_saved_regs (frame)[regno] =
1e2330ba 1196 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), regno);
244bc108 1197 for (regno = IA64_BR0_REGNUM; regno <= IA64_BR7_REGNUM; regno++)
b2fb4676 1198 get_frame_saved_regs (frame)[regno] =
1e2330ba 1199 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), regno);
244bc108 1200 for (regno = IA64_FR2_REGNUM; regno <= IA64_BR7_REGNUM; regno++)
b2fb4676 1201 get_frame_saved_regs (frame)[regno] =
1e2330ba 1202 SIGCONTEXT_REGISTER_ADDRESS (get_frame_base (frame), regno);
16461d7d
KB
1203 }
1204 else
1205 {
244bc108 1206 CORE_ADDR func_start;
16461d7d 1207
be41e9f4 1208 func_start = get_frame_func (frame);
50abf9e5 1209 examine_prologue (func_start, get_frame_pc (frame), frame);
244bc108 1210 }
16461d7d
KB
1211}
1212
1213void
1214ia64_get_saved_register (char *raw_buffer,
1215 int *optimized,
1216 CORE_ADDR *addrp,
1217 struct frame_info *frame,
1218 int regnum,
1219 enum lval_type *lval)
1220{
244bc108 1221 int is_dummy_frame;
16461d7d
KB
1222
1223 if (!target_has_registers)
1224 error ("No registers.");
1225
1226 if (optimized != NULL)
1227 *optimized = 0;
244bc108
KB
1228
1229 if (addrp != NULL)
1230 *addrp = 0;
1231
1232 if (lval != NULL)
1233 *lval = not_lval;
1234
1e2330ba
AC
1235 is_dummy_frame = DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
1236 get_frame_base (frame),
1237 get_frame_base (frame));
244bc108 1238
11c02a10 1239 if (regnum == SP_REGNUM && get_next_frame (frame))
16461d7d
KB
1240 {
1241 /* Handle SP values for all frames but the topmost. */
fbd9dcd3
AC
1242 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum),
1243 get_frame_base (frame));
16461d7d
KB
1244 }
1245 else if (regnum == IA64_BSP_REGNUM)
1246 {
fbd9dcd3
AC
1247 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum),
1248 get_frame_extra_info (frame)->bsp);
16461d7d
KB
1249 }
1250 else if (regnum == IA64_VFP_REGNUM)
1251 {
1252 /* If the function in question uses an automatic register (r32-r127)
1253 for the frame pointer, it'll be found by ia64_find_saved_register()
1254 above. If the function lacks one of these frame pointers, we can
1255 still provide a value since we know the size of the frame */
1e2330ba 1256 CORE_ADDR vfp = (get_frame_base (frame)
da50a4b7 1257 + get_frame_extra_info (frame)->mem_stack_frame_size);
fbd9dcd3 1258 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (IA64_VFP_REGNUM), vfp);
16461d7d
KB
1259 }
1260 else if (IA64_PR0_REGNUM <= regnum && regnum <= IA64_PR63_REGNUM)
1261 {
d9d9c31f 1262 char pr_raw_buffer[MAX_REGISTER_SIZE];
16461d7d
KB
1263 int pr_optim;
1264 enum lval_type pr_lval;
1265 CORE_ADDR pr_addr;
1266 int prN_val;
1267 ia64_get_saved_register (pr_raw_buffer, &pr_optim, &pr_addr,
1268 frame, IA64_PR_REGNUM, &pr_lval);
3a854e23
KB
1269 if (IA64_PR16_REGNUM <= regnum && regnum <= IA64_PR63_REGNUM)
1270 {
1271 /* Fetch predicate register rename base from current frame
1272 marker for this frame. */
da50a4b7 1273 int rrb_pr = (get_frame_extra_info (frame)->cfm >> 32) & 0x3f;
3a854e23
KB
1274
1275 /* Adjust the register number to account for register rotation. */
1276 regnum = IA64_PR16_REGNUM
1277 + ((regnum - IA64_PR16_REGNUM) + rrb_pr) % 48;
1278 }
16461d7d
KB
1279 prN_val = extract_bit_field ((unsigned char *) pr_raw_buffer,
1280 regnum - IA64_PR0_REGNUM, 1);
1281 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), prN_val);
16461d7d
KB
1282 }
1283 else if (IA64_NAT0_REGNUM <= regnum && regnum <= IA64_NAT31_REGNUM)
1284 {
d9d9c31f 1285 char unat_raw_buffer[MAX_REGISTER_SIZE];
16461d7d
KB
1286 int unat_optim;
1287 enum lval_type unat_lval;
1288 CORE_ADDR unat_addr;
1289 int unatN_val;
1290 ia64_get_saved_register (unat_raw_buffer, &unat_optim, &unat_addr,
1291 frame, IA64_UNAT_REGNUM, &unat_lval);
1292 unatN_val = extract_bit_field ((unsigned char *) unat_raw_buffer,
1293 regnum - IA64_NAT0_REGNUM, 1);
1294 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum),
1295 unatN_val);
16461d7d
KB
1296 }
1297 else if (IA64_NAT32_REGNUM <= regnum && regnum <= IA64_NAT127_REGNUM)
1298 {
1299 int natval = 0;
1300 /* Find address of general register corresponding to nat bit we're
1301 interested in. */
244bc108
KB
1302 CORE_ADDR gr_addr = 0;
1303
1304 if (!is_dummy_frame)
1305 {
f30ee0bc 1306 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
b2fb4676
AC
1307 gr_addr = get_frame_saved_regs (frame)[ regnum - IA64_NAT0_REGNUM
1308 + IA64_GR0_REGNUM];
244bc108 1309 }
16461d7d
KB
1310 if (gr_addr)
1311 {
1312 /* Compute address of nat collection bits */
1313 CORE_ADDR nat_addr = gr_addr | 0x1f8;
1314 CORE_ADDR bsp = read_register (IA64_BSP_REGNUM);
1315 CORE_ADDR nat_collection;
1316 int nat_bit;
1317 /* If our nat collection address is bigger than bsp, we have to get
1318 the nat collection from rnat. Otherwise, we fetch the nat
1319 collection from the computed address. */
1320 if (nat_addr >= bsp)
1321 nat_collection = read_register (IA64_RNAT_REGNUM);
1322 else
1323 nat_collection = read_memory_integer (nat_addr, 8);
1324 nat_bit = (gr_addr >> 3) & 0x3f;
1325 natval = (nat_collection >> nat_bit) & 1;
1326 }
1327 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), natval);
244bc108
KB
1328 }
1329 else if (regnum == IA64_IP_REGNUM)
1330 {
1331 CORE_ADDR pc;
11c02a10 1332 if (get_next_frame (frame))
244bc108
KB
1333 {
1334 /* FIXME: Set *addrp, *lval when possible. */
11c02a10 1335 pc = ia64_frame_saved_pc (get_next_frame (frame));
244bc108
KB
1336 }
1337 else
1338 {
1339 pc = read_pc ();
1340 }
fbd9dcd3 1341 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (IA64_IP_REGNUM), pc);
244bc108
KB
1342 }
1343 else if (IA64_GR32_REGNUM <= regnum && regnum <= IA64_GR127_REGNUM)
1344 {
1345 CORE_ADDR addr = 0;
1346 if (!is_dummy_frame)
1347 {
f30ee0bc 1348 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
b2fb4676 1349 addr = get_frame_saved_regs (frame)[regnum];
244bc108
KB
1350 }
1351
1352 if (addr != 0)
1353 {
1354 if (lval != NULL)
1355 *lval = lval_memory;
1356 if (addrp != NULL)
1357 *addrp = addr;
1358 read_memory (addr, raw_buffer, REGISTER_RAW_SIZE (regnum));
1359 }
1360 else
1361 {
1362 /* r32 - r127 must be fetchable via memory. If they aren't,
1363 then the register is unavailable */
1364 memset (raw_buffer, 0, REGISTER_RAW_SIZE (regnum));
1365 }
16461d7d
KB
1366 }
1367 else
1368 {
3a854e23
KB
1369 if (IA64_FR32_REGNUM <= regnum && regnum <= IA64_FR127_REGNUM)
1370 {
1371 /* Fetch floating point register rename base from current
1372 frame marker for this frame. */
da50a4b7 1373 int rrb_fr = (get_frame_extra_info (frame)->cfm >> 25) & 0x7f;
3a854e23
KB
1374
1375 /* Adjust the floating point register number to account for
1376 register rotation. */
1377 regnum = IA64_FR32_REGNUM
1378 + ((regnum - IA64_FR32_REGNUM) + rrb_fr) % 96;
1379 }
1380
bdcdd535
AC
1381 deprecated_generic_get_saved_register (raw_buffer, optimized, addrp,
1382 frame, regnum, lval);
16461d7d 1383 }
16461d7d
KB
1384}
1385
1386/* Should we use EXTRACT_STRUCT_VALUE_ADDRESS instead of
1387 EXTRACT_RETURN_VALUE? GCC_P is true if compiled with gcc
1388 and TYPE is the type (which is known to be struct, union or array). */
1389int
1390ia64_use_struct_convention (int gcc_p, struct type *type)
1391{
64a5b29c
KB
1392 struct type *float_elt_type;
1393
1394 /* HFAs are structures (or arrays) consisting entirely of floating
1395 point values of the same length. Up to 8 of these are returned
1396 in registers. Don't use the struct convention when this is the
1397 case. */
1398 float_elt_type = is_float_or_hfa_type (type);
1399 if (float_elt_type != NULL
1400 && TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type) <= 8)
1401 return 0;
1402
1403 /* Other structs of length 32 or less are returned in r8-r11.
1404 Don't use the struct convention for those either. */
16461d7d
KB
1405 return TYPE_LENGTH (type) > 32;
1406}
1407
1408void
1409ia64_extract_return_value (struct type *type, char *regbuf, char *valbuf)
1410{
64a5b29c
KB
1411 struct type *float_elt_type;
1412
1413 float_elt_type = is_float_or_hfa_type (type);
1414 if (float_elt_type != NULL)
1415 {
1416 int offset = 0;
1417 int regnum = IA64_FR8_REGNUM;
1418 int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type);
1419
1420 while (n-- > 0)
1421 {
1422 ia64_register_convert_to_virtual (regnum, float_elt_type,
1423 &regbuf[REGISTER_BYTE (regnum)], valbuf + offset);
1424 offset += TYPE_LENGTH (float_elt_type);
1425 regnum++;
1426 }
1427 }
16461d7d 1428 else
64a5b29c
KB
1429 memcpy (valbuf, &regbuf[REGISTER_BYTE (IA64_GR8_REGNUM)],
1430 TYPE_LENGTH (type));
16461d7d
KB
1431}
1432
1433/* FIXME: Turn this into a stack of some sort. Unfortunately, something
1434 like this is necessary though since the IA-64 calling conventions specify
1435 that r8 is not preserved. */
1436static CORE_ADDR struct_return_address;
1437
1438CORE_ADDR
1439ia64_extract_struct_value_address (char *regbuf)
1440{
1441 /* FIXME: See above. */
1442 return struct_return_address;
1443}
1444
1445void
1446ia64_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
1447{
1448 /* FIXME: See above. */
1449 /* Note that most of the work was done in ia64_push_arguments() */
1450 struct_return_address = addr;
1451}
1452
1453int
1454ia64_frameless_function_invocation (struct frame_info *frame)
1455{
f30ee0bc 1456 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
da50a4b7 1457 return (get_frame_extra_info (frame)->mem_stack_frame_size == 0);
16461d7d
KB
1458}
1459
1460CORE_ADDR
1461ia64_saved_pc_after_call (struct frame_info *frame)
1462{
1463 return read_register (IA64_BR0_REGNUM);
1464}
1465
1466CORE_ADDR
1467ia64_frame_args_address (struct frame_info *frame)
1468{
1469 /* frame->frame points at the SP for this frame; But we want the start
1470 of the frame, not the end. Calling frame chain will get his for us. */
1471 return ia64_frame_chain (frame);
1472}
1473
1474CORE_ADDR
1475ia64_frame_locals_address (struct frame_info *frame)
1476{
1477 /* frame->frame points at the SP for this frame; But we want the start
1478 of the frame, not the end. Calling frame chain will get his for us. */
1479 return ia64_frame_chain (frame);
1480}
1481
1482void
1483ia64_init_extra_frame_info (int fromleaf, struct frame_info *frame)
1484{
1485 CORE_ADDR bsp, cfm;
11c02a10
AC
1486 int next_frame_is_call_dummy = ((get_next_frame (frame) != NULL)
1487 && DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (get_next_frame (frame)),
1488 get_frame_base (get_next_frame (frame)),
1489 get_frame_base (get_next_frame (frame))));
16461d7d 1490
a00a19e9 1491 frame_extra_info_zalloc (frame, sizeof (struct frame_extra_info));
16461d7d 1492
11c02a10 1493 if (get_next_frame (frame) == 0)
16461d7d
KB
1494 {
1495 bsp = read_register (IA64_BSP_REGNUM);
1496 cfm = read_register (IA64_CFM_REGNUM);
1497
1498 }
11c02a10 1499 else if ((get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME))
244bc108 1500 {
11c02a10
AC
1501 bsp = read_sigcontext_register (get_next_frame (frame), IA64_BSP_REGNUM);
1502 cfm = read_sigcontext_register (get_next_frame (frame), IA64_CFM_REGNUM);
244bc108
KB
1503 }
1504 else if (next_frame_is_call_dummy)
1505 {
11c02a10
AC
1506 bsp = deprecated_read_register_dummy (get_frame_pc (get_next_frame (frame)),
1507 get_frame_base (get_next_frame (frame)),
135c175f 1508 IA64_BSP_REGNUM);
11c02a10
AC
1509 cfm = deprecated_read_register_dummy (get_frame_pc (get_next_frame (frame)),
1510 get_frame_base (get_next_frame (frame)),
135c175f 1511 IA64_CFM_REGNUM);
244bc108 1512 }
16461d7d
KB
1513 else
1514 {
11c02a10 1515 struct frame_info *frn = get_next_frame (frame);
16461d7d 1516
f30ee0bc 1517 DEPRECATED_FRAME_INIT_SAVED_REGS (frn);
16461d7d 1518
b2fb4676
AC
1519 if (get_frame_saved_regs (frn)[IA64_CFM_REGNUM] != 0)
1520 cfm = read_memory_integer (get_frame_saved_regs (frn)[IA64_CFM_REGNUM], 8);
11c02a10
AC
1521 else if (get_next_frame (frn) && (get_frame_type (get_next_frame (frn)) == SIGTRAMP_FRAME))
1522 cfm = read_sigcontext_register (get_next_frame (frn), IA64_PFS_REGNUM);
1523 else if (get_next_frame (frn)
1524 && DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (get_next_frame (frn)),
1525 get_frame_base (get_next_frame (frn)),
1526 get_frame_base (get_next_frame (frn))))
1527 cfm = deprecated_read_register_dummy (get_frame_pc (get_next_frame (frn)),
1528 get_frame_base (get_next_frame (frn)),
135c175f 1529 IA64_PFS_REGNUM);
16461d7d 1530 else
76d689a6 1531 cfm = read_register (IA64_PFS_REGNUM);
16461d7d 1532
da50a4b7 1533 bsp = get_frame_extra_info (frn)->bsp;
16461d7d 1534 }
da50a4b7
AC
1535 get_frame_extra_info (frame)->cfm = cfm;
1536 get_frame_extra_info (frame)->sof = cfm & 0x7f;
1537 get_frame_extra_info (frame)->sol = (cfm >> 7) & 0x7f;
11c02a10
AC
1538 if (get_next_frame (frame) == 0
1539 || (get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME)
244bc108 1540 || next_frame_is_call_dummy)
da50a4b7
AC
1541 get_frame_extra_info (frame)->bsp =
1542 rse_address_add (bsp, -get_frame_extra_info (frame)->sof);
16461d7d 1543 else
da50a4b7
AC
1544 get_frame_extra_info (frame)->bsp =
1545 rse_address_add (bsp, -get_frame_extra_info (frame)->sol);
16461d7d 1546
da50a4b7
AC
1547 get_frame_extra_info (frame)->after_prologue = 0;
1548 get_frame_extra_info (frame)->mem_stack_frame_size = -1; /* Not yet determined */
1549 get_frame_extra_info (frame)->fp_reg = 0;
16461d7d
KB
1550}
1551
64a5b29c
KB
1552static int
1553is_float_or_hfa_type_recurse (struct type *t, struct type **etp)
1554{
1555 switch (TYPE_CODE (t))
1556 {
1557 case TYPE_CODE_FLT:
1558 if (*etp)
1559 return TYPE_LENGTH (*etp) == TYPE_LENGTH (t);
1560 else
1561 {
1562 *etp = t;
1563 return 1;
1564 }
1565 break;
1566 case TYPE_CODE_ARRAY:
98f96ba1
KB
1567 return
1568 is_float_or_hfa_type_recurse (check_typedef (TYPE_TARGET_TYPE (t)),
1569 etp);
64a5b29c
KB
1570 break;
1571 case TYPE_CODE_STRUCT:
1572 {
1573 int i;
1574
1575 for (i = 0; i < TYPE_NFIELDS (t); i++)
98f96ba1
KB
1576 if (!is_float_or_hfa_type_recurse
1577 (check_typedef (TYPE_FIELD_TYPE (t, i)), etp))
64a5b29c
KB
1578 return 0;
1579 return 1;
1580 }
1581 break;
1582 default:
1583 return 0;
1584 break;
1585 }
1586}
1587
1588/* Determine if the given type is one of the floating point types or
1589 and HFA (which is a struct, array, or combination thereof whose
1590 bottom-most elements are all of the same floating point type.) */
1591
1592static struct type *
1593is_float_or_hfa_type (struct type *t)
1594{
1595 struct type *et = 0;
1596
1597 return is_float_or_hfa_type_recurse (t, &et) ? et : 0;
1598}
1599
1600
98f96ba1
KB
1601/* Return 1 if the alignment of T is such that the next even slot
1602 should be used. Return 0, if the next available slot should
1603 be used. (See section 8.5.1 of the IA-64 Software Conventions
1604 and Runtime manual.) */
1605
1606static int
1607slot_alignment_is_next_even (struct type *t)
1608{
1609 switch (TYPE_CODE (t))
1610 {
1611 case TYPE_CODE_INT:
1612 case TYPE_CODE_FLT:
1613 if (TYPE_LENGTH (t) > 8)
1614 return 1;
1615 else
1616 return 0;
1617 case TYPE_CODE_ARRAY:
1618 return
1619 slot_alignment_is_next_even (check_typedef (TYPE_TARGET_TYPE (t)));
1620 case TYPE_CODE_STRUCT:
1621 {
1622 int i;
1623
1624 for (i = 0; i < TYPE_NFIELDS (t); i++)
1625 if (slot_alignment_is_next_even
1626 (check_typedef (TYPE_FIELD_TYPE (t, i))))
1627 return 1;
1628 return 0;
1629 }
1630 default:
1631 return 0;
1632 }
1633}
1634
64a5b29c
KB
1635/* Attempt to find (and return) the global pointer for the given
1636 function.
1637
1638 This is a rather nasty bit of code searchs for the .dynamic section
1639 in the objfile corresponding to the pc of the function we're trying
1640 to call. Once it finds the addresses at which the .dynamic section
1641 lives in the child process, it scans the Elf64_Dyn entries for a
1642 DT_PLTGOT tag. If it finds one of these, the corresponding
1643 d_un.d_ptr value is the global pointer. */
1644
1645static CORE_ADDR
698cb3f0 1646generic_elf_find_global_pointer (CORE_ADDR faddr)
64a5b29c 1647{
76d689a6 1648 struct obj_section *faddr_sect;
64a5b29c 1649
76d689a6
KB
1650 faddr_sect = find_pc_section (faddr);
1651 if (faddr_sect != NULL)
64a5b29c
KB
1652 {
1653 struct obj_section *osect;
1654
76d689a6 1655 ALL_OBJFILE_OSECTIONS (faddr_sect->objfile, osect)
64a5b29c
KB
1656 {
1657 if (strcmp (osect->the_bfd_section->name, ".dynamic") == 0)
1658 break;
1659 }
1660
76d689a6 1661 if (osect < faddr_sect->objfile->sections_end)
64a5b29c
KB
1662 {
1663 CORE_ADDR addr;
1664
1665 addr = osect->addr;
1666 while (addr < osect->endaddr)
1667 {
1668 int status;
1669 LONGEST tag;
1670 char buf[8];
1671
1672 status = target_read_memory (addr, buf, sizeof (buf));
1673 if (status != 0)
1674 break;
1675 tag = extract_signed_integer (buf, sizeof (buf));
1676
1677 if (tag == DT_PLTGOT)
1678 {
1679 CORE_ADDR global_pointer;
1680
1681 status = target_read_memory (addr + 8, buf, sizeof (buf));
1682 if (status != 0)
1683 break;
1684 global_pointer = extract_address (buf, sizeof (buf));
1685
1686 /* The payoff... */
1687 return global_pointer;
1688 }
1689
1690 if (tag == DT_NULL)
1691 break;
1692
1693 addr += 16;
1694 }
1695 }
1696 }
1697 return 0;
1698}
1699
1700/* Given a function's address, attempt to find (and return) the
1701 corresponding (canonical) function descriptor. Return 0 if
1702 not found. */
1703static CORE_ADDR
1704find_extant_func_descr (CORE_ADDR faddr)
1705{
76d689a6 1706 struct obj_section *faddr_sect;
64a5b29c
KB
1707
1708 /* Return early if faddr is already a function descriptor */
76d689a6
KB
1709 faddr_sect = find_pc_section (faddr);
1710 if (faddr_sect && strcmp (faddr_sect->the_bfd_section->name, ".opd") == 0)
64a5b29c
KB
1711 return faddr;
1712
76d689a6 1713 if (faddr_sect != NULL)
64a5b29c 1714 {
76d689a6
KB
1715 struct obj_section *osect;
1716 ALL_OBJFILE_OSECTIONS (faddr_sect->objfile, osect)
64a5b29c
KB
1717 {
1718 if (strcmp (osect->the_bfd_section->name, ".opd") == 0)
1719 break;
1720 }
1721
76d689a6 1722 if (osect < faddr_sect->objfile->sections_end)
64a5b29c
KB
1723 {
1724 CORE_ADDR addr;
1725
1726 addr = osect->addr;
1727 while (addr < osect->endaddr)
1728 {
1729 int status;
1730 LONGEST faddr2;
1731 char buf[8];
1732
1733 status = target_read_memory (addr, buf, sizeof (buf));
1734 if (status != 0)
1735 break;
1736 faddr2 = extract_signed_integer (buf, sizeof (buf));
1737
1738 if (faddr == faddr2)
1739 return addr;
1740
1741 addr += 16;
1742 }
1743 }
1744 }
1745 return 0;
1746}
1747
1748/* Attempt to find a function descriptor corresponding to the
1749 given address. If none is found, construct one on the
1750 stack using the address at fdaptr */
1751
1752static CORE_ADDR
1753find_func_descr (CORE_ADDR faddr, CORE_ADDR *fdaptr)
1754{
1755 CORE_ADDR fdesc;
1756
1757 fdesc = find_extant_func_descr (faddr);
1758
1759 if (fdesc == 0)
1760 {
1761 CORE_ADDR global_pointer;
1762 char buf[16];
1763
1764 fdesc = *fdaptr;
1765 *fdaptr += 16;
1766
698cb3f0 1767 global_pointer = FIND_GLOBAL_POINTER (faddr);
64a5b29c
KB
1768
1769 if (global_pointer == 0)
1770 global_pointer = read_register (IA64_GR1_REGNUM);
1771
fbd9dcd3
AC
1772 store_unsigned_integer (buf, 8, faddr);
1773 store_unsigned_integer (buf + 8, 8, global_pointer);
64a5b29c
KB
1774
1775 write_memory (fdesc, buf, 16);
1776 }
1777
1778 return fdesc;
1779}
16461d7d
KB
1780
1781CORE_ADDR
ea7c478f 1782ia64_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
16461d7d
KB
1783 int struct_return, CORE_ADDR struct_addr)
1784{
1785 int argno;
ea7c478f 1786 struct value *arg;
16461d7d
KB
1787 struct type *type;
1788 int len, argoffset;
64a5b29c 1789 int nslots, rseslots, memslots, slotnum, nfuncargs;
16461d7d 1790 int floatreg;
64a5b29c 1791 CORE_ADDR bsp, cfm, pfs, new_bsp, funcdescaddr;
16461d7d
KB
1792
1793 nslots = 0;
64a5b29c 1794 nfuncargs = 0;
16461d7d
KB
1795 /* Count the number of slots needed for the arguments */
1796 for (argno = 0; argno < nargs; argno++)
1797 {
1798 arg = args[argno];
1799 type = check_typedef (VALUE_TYPE (arg));
1800 len = TYPE_LENGTH (type);
1801
98f96ba1 1802 if ((nslots & 1) && slot_alignment_is_next_even (type))
16461d7d
KB
1803 nslots++;
1804
64a5b29c
KB
1805 if (TYPE_CODE (type) == TYPE_CODE_FUNC)
1806 nfuncargs++;
1807
16461d7d
KB
1808 nslots += (len + 7) / 8;
1809 }
1810
64a5b29c 1811 /* Divvy up the slots between the RSE and the memory stack */
16461d7d
KB
1812 rseslots = (nslots > 8) ? 8 : nslots;
1813 memslots = nslots - rseslots;
1814
64a5b29c 1815 /* Allocate a new RSE frame */
16461d7d
KB
1816 cfm = read_register (IA64_CFM_REGNUM);
1817
1818 bsp = read_register (IA64_BSP_REGNUM);
1819 bsp = rse_address_add (bsp, cfm & 0x7f);
1820 new_bsp = rse_address_add (bsp, rseslots);
1821 write_register (IA64_BSP_REGNUM, new_bsp);
1822
1823 pfs = read_register (IA64_PFS_REGNUM);
1824 pfs &= 0xc000000000000000LL;
1825 pfs |= (cfm & 0xffffffffffffLL);
1826 write_register (IA64_PFS_REGNUM, pfs);
1827
1828 cfm &= 0xc000000000000000LL;
1829 cfm |= rseslots;
1830 write_register (IA64_CFM_REGNUM, cfm);
1831
64a5b29c
KB
1832 /* We will attempt to find function descriptors in the .opd segment,
1833 but if we can't we'll construct them ourselves. That being the
1834 case, we'll need to reserve space on the stack for them. */
1835 funcdescaddr = sp - nfuncargs * 16;
1836 funcdescaddr &= ~0xfLL;
1837
1838 /* Adjust the stack pointer to it's new value. The calling conventions
1839 require us to have 16 bytes of scratch, plus whatever space is
1840 necessary for the memory slots and our function descriptors */
1841 sp = sp - 16 - (memslots + nfuncargs) * 8;
16461d7d
KB
1842 sp &= ~0xfLL; /* Maintain 16 byte alignment */
1843
64a5b29c
KB
1844 /* Place the arguments where they belong. The arguments will be
1845 either placed in the RSE backing store or on the memory stack.
1846 In addition, floating point arguments or HFAs are placed in
1847 floating point registers. */
16461d7d
KB
1848 slotnum = 0;
1849 floatreg = IA64_FR8_REGNUM;
1850 for (argno = 0; argno < nargs; argno++)
1851 {
64a5b29c
KB
1852 struct type *float_elt_type;
1853
16461d7d
KB
1854 arg = args[argno];
1855 type = check_typedef (VALUE_TYPE (arg));
1856 len = TYPE_LENGTH (type);
64a5b29c
KB
1857
1858 /* Special handling for function parameters */
1859 if (len == 8
1860 && TYPE_CODE (type) == TYPE_CODE_PTR
1861 && TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC)
1862 {
1863 char val_buf[8];
1864
fbd9dcd3
AC
1865 store_unsigned_integer (val_buf, 8,
1866 find_func_descr (extract_address (VALUE_CONTENTS (arg), 8),
1867 &funcdescaddr));
64a5b29c
KB
1868 if (slotnum < rseslots)
1869 write_memory (rse_address_add (bsp, slotnum), val_buf, 8);
1870 else
1871 write_memory (sp + 16 + 8 * (slotnum - rseslots), val_buf, 8);
1872 slotnum++;
1873 continue;
1874 }
1875
1876 /* Normal slots */
98f96ba1
KB
1877
1878 /* Skip odd slot if necessary... */
1879 if ((slotnum & 1) && slot_alignment_is_next_even (type))
16461d7d 1880 slotnum++;
98f96ba1 1881
16461d7d
KB
1882 argoffset = 0;
1883 while (len > 0)
1884 {
1885 char val_buf[8];
1886
1887 memset (val_buf, 0, 8);
1888 memcpy (val_buf, VALUE_CONTENTS (arg) + argoffset, (len > 8) ? 8 : len);
1889
1890 if (slotnum < rseslots)
1891 write_memory (rse_address_add (bsp, slotnum), val_buf, 8);
1892 else
1893 write_memory (sp + 16 + 8 * (slotnum - rseslots), val_buf, 8);
1894
1895 argoffset += 8;
1896 len -= 8;
1897 slotnum++;
1898 }
64a5b29c
KB
1899
1900 /* Handle floating point types (including HFAs) */
1901 float_elt_type = is_float_or_hfa_type (type);
1902 if (float_elt_type != NULL)
1903 {
1904 argoffset = 0;
1905 len = TYPE_LENGTH (type);
1906 while (len > 0 && floatreg < IA64_FR16_REGNUM)
1907 {
1908 ia64_register_convert_to_raw (
1909 float_elt_type,
1910 floatreg,
1911 VALUE_CONTENTS (arg) + argoffset,
524d7c18 1912 &deprecated_registers[REGISTER_BYTE (floatreg)]);
64a5b29c
KB
1913 floatreg++;
1914 argoffset += TYPE_LENGTH (float_elt_type);
1915 len -= TYPE_LENGTH (float_elt_type);
1916 }
16461d7d
KB
1917 }
1918 }
1919
64a5b29c 1920 /* Store the struct return value in r8 if necessary. */
16461d7d
KB
1921 if (struct_return)
1922 {
fbd9dcd3
AC
1923 store_unsigned_integer (&deprecated_registers[REGISTER_BYTE (IA64_GR8_REGNUM)],
1924 REGISTER_RAW_SIZE (IA64_GR8_REGNUM),
1925 struct_addr);
16461d7d
KB
1926 }
1927
64a5b29c 1928 /* Sync gdb's idea of what the registers are with the target. */
16461d7d
KB
1929 target_store_registers (-1);
1930
1931 /* FIXME: This doesn't belong here! Instead, SAVE_DUMMY_FRAME_TOS needs
1932 to be defined to call generic_save_dummy_frame_tos(). But at the
1933 time of this writing, SAVE_DUMMY_FRAME_TOS wasn't gdbarch'd, so
1934 I chose to put this call here instead of using the old mechanisms.
1935 Once SAVE_DUMMY_FRAME_TOS is gdbarch'd, all we need to do is add the
1936 line
1937
1938 set_gdbarch_save_dummy_frame_tos (gdbarch, generic_save_dummy_frame_tos);
1939
1940 to ia64_gdbarch_init() and remove the line below. */
1941 generic_save_dummy_frame_tos (sp);
1942
1943 return sp;
1944}
1945
1946CORE_ADDR
1947ia64_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
1948{
698cb3f0 1949 CORE_ADDR global_pointer = FIND_GLOBAL_POINTER (pc);
16461d7d 1950
64a5b29c
KB
1951 if (global_pointer != 0)
1952 write_register (IA64_GR1_REGNUM, global_pointer);
16461d7d
KB
1953
1954 write_register (IA64_BR0_REGNUM, CALL_DUMMY_ADDRESS ());
1955 return sp;
1956}
1957
1958void
1959ia64_store_return_value (struct type *type, char *valbuf)
1960{
1961 if (TYPE_CODE (type) == TYPE_CODE_FLT)
1962 {
1963 ia64_register_convert_to_raw (type, IA64_FR8_REGNUM, valbuf,
524d7c18 1964 &deprecated_registers[REGISTER_BYTE (IA64_FR8_REGNUM)]);
16461d7d
KB
1965 target_store_registers (IA64_FR8_REGNUM);
1966 }
1967 else
73937e03
AC
1968 deprecated_write_register_bytes (REGISTER_BYTE (IA64_GR8_REGNUM),
1969 valbuf, TYPE_LENGTH (type));
16461d7d
KB
1970}
1971
1972void
1973ia64_pop_frame (void)
1974{
1975 generic_pop_current_frame (ia64_pop_frame_regular);
1976}
1977
1978static void
1979ia64_pop_frame_regular (struct frame_info *frame)
1980{
1981 int regno;
1982 CORE_ADDR bsp, cfm, pfs;
1983
f30ee0bc 1984 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
16461d7d
KB
1985
1986 for (regno = 0; regno < ia64_num_regs; regno++)
1987 {
b2fb4676 1988 if (get_frame_saved_regs (frame)[regno]
16461d7d
KB
1989 && (!(IA64_GR32_REGNUM <= regno && regno <= IA64_GR127_REGNUM))
1990 && regno != pc_regnum
1991 && regno != sp_regnum
1992 && regno != IA64_PFS_REGNUM
1993 && regno != IA64_CFM_REGNUM
1994 && regno != IA64_BSP_REGNUM
1995 && regno != IA64_BSPSTORE_REGNUM)
1996 {
1997 write_register (regno,
b2fb4676 1998 read_memory_integer (get_frame_saved_regs (frame)[regno],
16461d7d
KB
1999 REGISTER_RAW_SIZE (regno)));
2000 }
2001 }
2002
618ce49f 2003 write_register (sp_regnum, DEPRECATED_FRAME_CHAIN (frame));
8bedc050 2004 write_pc (DEPRECATED_FRAME_SAVED_PC (frame));
16461d7d
KB
2005
2006 cfm = read_register (IA64_CFM_REGNUM);
2007
b2fb4676 2008 if (get_frame_saved_regs (frame)[IA64_PFS_REGNUM])
16461d7d 2009 {
b2fb4676 2010 pfs = read_memory_integer (get_frame_saved_regs (frame)[IA64_PFS_REGNUM],
16461d7d
KB
2011 REGISTER_RAW_SIZE (IA64_PFS_REGNUM));
2012 }
2013 else
2014 pfs = read_register (IA64_PFS_REGNUM);
2015
2016 /* Compute the new bsp by *adding* the difference between the
2017 size of the frame and the size of the locals (both wrt the
2018 frame that we're going back to). This seems kind of strange,
2019 especially since it seems like we ought to be subtracting the
ca557f44 2020 size of the locals... and we should; but the Linux kernel
16461d7d
KB
2021 wants bsp to be set at the end of all used registers. It's
2022 likely that this code will need to be revised to accomodate
2023 other operating systems. */
da50a4b7 2024 bsp = rse_address_add (get_frame_extra_info (frame)->bsp,
16461d7d
KB
2025 (pfs & 0x7f) - ((pfs >> 7) & 0x7f));
2026 write_register (IA64_BSP_REGNUM, bsp);
2027
2028 /* FIXME: What becomes of the epilog count in the PFS? */
2029 cfm = (cfm & ~0xffffffffffffLL) | (pfs & 0xffffffffffffLL);
2030 write_register (IA64_CFM_REGNUM, cfm);
2031
2032 flush_cached_frames ();
2033}
2034
2035static void
1750fa04
AC
2036ia64_remote_translate_xfer_address (struct gdbarch *gdbarch,
2037 struct regcache *regcache,
2038 CORE_ADDR memaddr, int nr_bytes,
16461d7d
KB
2039 CORE_ADDR *targ_addr, int *targ_len)
2040{
2041 *targ_addr = memaddr;
2042 *targ_len = nr_bytes;
2043}
2044
244bc108
KB
2045static void
2046process_note_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
2047{
2048 int *os_ident_ptr = obj;
2049 const char *name;
2050 unsigned int sectsize;
2051
2052 name = bfd_get_section_name (abfd, sect);
2053 sectsize = bfd_section_size (abfd, sect);
2054 if (strcmp (name, ".note.ABI-tag") == 0 && sectsize > 0)
2055 {
2056 unsigned int name_length, data_length, note_type;
2057 char *note = alloca (sectsize);
2058
2059 bfd_get_section_contents (abfd, sect, note,
2060 (file_ptr) 0, (bfd_size_type) sectsize);
2061
2062 name_length = bfd_h_get_32 (abfd, note);
2063 data_length = bfd_h_get_32 (abfd, note + 4);
2064 note_type = bfd_h_get_32 (abfd, note + 8);
2065
2066 if (name_length == 4 && data_length == 16 && note_type == 1
2067 && strcmp (note + 12, "GNU") == 0)
2068 {
2069 int os_number = bfd_h_get_32 (abfd, note + 16);
2070
2071 /* The case numbers are from abi-tags in glibc */
2072 switch (os_number)
2073 {
2074 case 0 :
2075 *os_ident_ptr = ELFOSABI_LINUX;
2076 break;
244bc108
KB
2077 case 1 :
2078 *os_ident_ptr = ELFOSABI_HURD;
2079 break;
2080 case 2 :
2081 *os_ident_ptr = ELFOSABI_SOLARIS;
2082 break;
244bc108 2083 default :
8e65ff28
AC
2084 internal_error (__FILE__, __LINE__,
2085 "process_note_abi_sections: unknown OS number %d", os_number);
244bc108
KB
2086 break;
2087 }
2088 }
2089 }
2090}
2091
16461d7d
KB
2092static struct gdbarch *
2093ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2094{
2095 struct gdbarch *gdbarch;
244bc108
KB
2096 struct gdbarch_tdep *tdep;
2097 int os_ident;
2098
2099 if (info.abfd != NULL
2100 && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
2101 {
2102 os_ident = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
2103
ca557f44
AC
2104 /* If os_ident is 0, it is not necessarily the case that we're
2105 on a SYSV system. (ELFOSABI_NONE is defined to be 0.)
2106 GNU/Linux uses a note section to record OS/ABI info, but
2107 leaves e_ident[EI_OSABI] zero. So we have to check for note
2108 sections too. */
244bc108
KB
2109 if (os_ident == 0)
2110 {
2111 bfd_map_over_sections (info.abfd,
2112 process_note_abi_tag_sections,
2113 &os_ident);
2114 }
2115 }
2116 else
2117 os_ident = -1;
16461d7d 2118
244bc108
KB
2119 for (arches = gdbarch_list_lookup_by_info (arches, &info);
2120 arches != NULL;
2121 arches = gdbarch_list_lookup_by_info (arches->next, &info))
2122 {
57bc8964
KB
2123 tdep = gdbarch_tdep (arches->gdbarch);
2124 if (tdep &&tdep->os_ident == os_ident)
2125 return arches->gdbarch;
244bc108 2126 }
16461d7d 2127
244bc108
KB
2128 tdep = xmalloc (sizeof (struct gdbarch_tdep));
2129 gdbarch = gdbarch_alloc (&info, tdep);
2130 tdep->os_ident = os_ident;
2131
a5afb99f
AC
2132 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
2133 ready to unwind the PC first (see frame.c:get_prev_frame()). */
2134 set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
d7fa2ae2
KB
2135
2136 /* Set the method of obtaining the sigcontext addresses at which
2137 registers are saved. The method of checking to see if
2138 native_find_global_pointer is nonzero to indicate that we're
2139 on AIX is kind of hokey, but I can't think of a better way
2140 to do it. */
244bc108
KB
2141 if (os_ident == ELFOSABI_LINUX)
2142 tdep->sigcontext_register_address = ia64_linux_sigcontext_register_address;
d7fa2ae2
KB
2143 else if (native_find_global_pointer != 0)
2144 tdep->sigcontext_register_address = ia64_aix_sigcontext_register_address;
244bc108
KB
2145 else
2146 tdep->sigcontext_register_address = 0;
16461d7d 2147
ca557f44
AC
2148 /* We know that GNU/Linux won't have to resort to the
2149 native_find_global_pointer hackery. But that's the only one we
2150 know about so far, so if native_find_global_pointer is set to
2151 something non-zero, then use it. Otherwise fall back to using
2152 generic_elf_find_global_pointer. This arrangement should (in
2153 theory) allow us to cross debug GNU/Linux binaries from an AIX
2154 machine. */
698cb3f0
KB
2155 if (os_ident == ELFOSABI_LINUX)
2156 tdep->find_global_pointer = generic_elf_find_global_pointer;
2157 else if (native_find_global_pointer != 0)
2158 tdep->find_global_pointer = native_find_global_pointer;
2159 else
2160 tdep->find_global_pointer = generic_elf_find_global_pointer;
2161
16461d7d
KB
2162 set_gdbarch_short_bit (gdbarch, 16);
2163 set_gdbarch_int_bit (gdbarch, 32);
2164 set_gdbarch_long_bit (gdbarch, 64);
2165 set_gdbarch_long_long_bit (gdbarch, 64);
2166 set_gdbarch_float_bit (gdbarch, 32);
2167 set_gdbarch_double_bit (gdbarch, 64);
2168 set_gdbarch_long_double_bit (gdbarch, 64);
2169 set_gdbarch_ptr_bit (gdbarch, 64);
2170
2171 set_gdbarch_num_regs (gdbarch, ia64_num_regs);
2172 set_gdbarch_sp_regnum (gdbarch, sp_regnum);
0ba6dca9 2173 set_gdbarch_deprecated_fp_regnum (gdbarch, fp_regnum);
16461d7d 2174 set_gdbarch_pc_regnum (gdbarch, pc_regnum);
698cb3f0 2175 set_gdbarch_fp0_regnum (gdbarch, IA64_FR0_REGNUM);
16461d7d
KB
2176
2177 set_gdbarch_register_name (gdbarch, ia64_register_name);
b1e29e33 2178 set_gdbarch_deprecated_register_size (gdbarch, 8);
16461d7d
KB
2179 set_gdbarch_register_bytes (gdbarch, ia64_num_regs * 8 + 128*8);
2180 set_gdbarch_register_byte (gdbarch, ia64_register_byte);
2181 set_gdbarch_register_raw_size (gdbarch, ia64_register_raw_size);
a0ed5532 2182 set_gdbarch_deprecated_max_register_raw_size (gdbarch, 16);
16461d7d 2183 set_gdbarch_register_virtual_size (gdbarch, ia64_register_virtual_size);
a0ed5532 2184 set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 16);
16461d7d
KB
2185 set_gdbarch_register_virtual_type (gdbarch, ia64_register_virtual_type);
2186
2187 set_gdbarch_skip_prologue (gdbarch, ia64_skip_prologue);
2188
2189 set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
2190 set_gdbarch_frameless_function_invocation (gdbarch, ia64_frameless_function_invocation);
2191
6913c89a 2192 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, ia64_saved_pc_after_call);
16461d7d 2193
618ce49f 2194 set_gdbarch_deprecated_frame_chain (gdbarch, ia64_frame_chain);
8bedc050 2195 set_gdbarch_deprecated_frame_saved_pc (gdbarch, ia64_frame_saved_pc);
16461d7d 2196
f30ee0bc 2197 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, ia64_frame_init_saved_regs);
129c1cd6 2198 set_gdbarch_deprecated_get_saved_register (gdbarch, ia64_get_saved_register);
16461d7d
KB
2199
2200 set_gdbarch_register_convertible (gdbarch, ia64_register_convertible);
2201 set_gdbarch_register_convert_to_virtual (gdbarch, ia64_register_convert_to_virtual);
2202 set_gdbarch_register_convert_to_raw (gdbarch, ia64_register_convert_to_raw);
2203
2204 set_gdbarch_use_struct_convention (gdbarch, ia64_use_struct_convention);
26e9b323 2205 set_gdbarch_deprecated_extract_return_value (gdbarch, ia64_extract_return_value);
16461d7d 2206
4183d812 2207 set_gdbarch_deprecated_store_struct_return (gdbarch, ia64_store_struct_return);
ebba8386 2208 set_gdbarch_deprecated_store_return_value (gdbarch, ia64_store_return_value);
26e9b323 2209 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, ia64_extract_struct_value_address);
16461d7d
KB
2210
2211 set_gdbarch_memory_insert_breakpoint (gdbarch, ia64_memory_insert_breakpoint);
2212 set_gdbarch_memory_remove_breakpoint (gdbarch, ia64_memory_remove_breakpoint);
2213 set_gdbarch_breakpoint_from_pc (gdbarch, ia64_breakpoint_from_pc);
2214 set_gdbarch_read_pc (gdbarch, ia64_read_pc);
2215 set_gdbarch_write_pc (gdbarch, ia64_write_pc);
2216
2217 /* Settings for calling functions in the inferior. */
b81774d8 2218 set_gdbarch_deprecated_push_arguments (gdbarch, ia64_push_arguments);
28f617b3 2219 set_gdbarch_deprecated_push_return_address (gdbarch, ia64_push_return_address);
749b82f6 2220 set_gdbarch_deprecated_pop_frame (gdbarch, ia64_pop_frame);
16461d7d 2221
b1e29e33
AC
2222 set_gdbarch_deprecated_call_dummy_words (gdbarch, ia64_call_dummy_words);
2223 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof (ia64_call_dummy_words));
e9582e71 2224 set_gdbarch_deprecated_init_extra_frame_info (gdbarch, ia64_init_extra_frame_info);
16461d7d
KB
2225 set_gdbarch_frame_args_address (gdbarch, ia64_frame_args_address);
2226 set_gdbarch_frame_locals_address (gdbarch, ia64_frame_locals_address);
2227
0ba6dca9
AC
2228 /* We won't necessarily have a frame pointer and even if we do, it
2229 winds up being extraordinarly messy when attempting to find the
2230 frame chain. So for the purposes of creating frames (which is
2231 all deprecated_read_fp() is used for), simply use the stack
2232 pointer value instead. */
2233 set_gdbarch_deprecated_target_read_fp (gdbarch, generic_target_read_sp);
16461d7d
KB
2234
2235 /* Settings that should be unnecessary. */
2236 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
2237
2238 set_gdbarch_read_sp (gdbarch, generic_target_read_sp);
6c0e89ed 2239 set_gdbarch_deprecated_dummy_write_sp (gdbarch, generic_target_write_sp);
16461d7d 2240
16461d7d
KB
2241 set_gdbarch_decr_pc_after_break (gdbarch, 0);
2242 set_gdbarch_function_start_offset (gdbarch, 0);
4156bb53 2243 set_gdbarch_frame_args_skip (gdbarch, 0);
16461d7d
KB
2244
2245 set_gdbarch_remote_translate_xfer_address (
2246 gdbarch, ia64_remote_translate_xfer_address);
2247
2248 return gdbarch;
2249}
2250
2251void
2252_initialize_ia64_tdep (void)
2253{
2254 register_gdbarch_init (bfd_arch_ia64, ia64_gdbarch_init);
2255
d7a27068 2256 deprecated_tm_print_insn = print_insn_ia64;
810ecf9f 2257 deprecated_tm_print_insn_info.bytes_per_line = SLOT_MULTIPLIER;
16461d7d 2258}
This page took 0.386505 seconds and 4 git commands to generate.