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