mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-28 05:16:01 +00:00
* Re-add lost change:
* elf-m10300.c (elf32_mn10300_link_hash_entry): Add new field "movm_stack_size". (mn10300_elf_relax_section): Include stack space for register saves in the imm8 field of a "call" instruction. (compute_function_info): Determine how much stack is allocated by the movm instruction. Fix typo. (elf32_mn10300_link_hash_newfunc): Initialize movm_stack_size.
This commit is contained in:
parent
f07122bc9e
commit
d5394da7ec
@ -1,3 +1,14 @@
|
||||
Thu Jul 23 11:29:43 1998 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* Re-add lost change:
|
||||
* elf-m10300.c (elf32_mn10300_link_hash_entry): Add new field
|
||||
"movm_stack_size".
|
||||
(mn10300_elf_relax_section): Include stack space for register saves
|
||||
in the imm8 field of a "call" instruction.
|
||||
(compute_function_info): Determine how much stack is allocated by
|
||||
the movm instruction. Fix typo.
|
||||
(elf32_mn10300_link_hash_newfunc): Initialize movm_stack_size.
|
||||
|
||||
Thu Jul 23 11:38:05 1998 Ian Lance Taylor <ian@cygnus.com>
|
||||
|
||||
* elf32-sparc.c (elf_backend_got_header_size): Define as 4.
|
||||
|
@ -34,7 +34,9 @@ struct elf32_mn10300_link_hash_entry
|
||||
|
||||
/* For function symbols, the size of this function's stack
|
||||
(if <= 255 bytes). We stuff this into "call" instructions
|
||||
to this target when it's valid and profitable to do so. */
|
||||
to this target when it's valid and profitable to do so.
|
||||
|
||||
This does not include stack allocated by movm! */
|
||||
unsigned char stack_size;
|
||||
|
||||
/* For function symbols, arguments (if any) for movm instruction
|
||||
@ -42,6 +44,11 @@ struct elf32_mn10300_link_hash_entry
|
||||
to the target when it's valid and profitable to do so. */
|
||||
unsigned char movm_args;
|
||||
|
||||
/* For funtion symbols, the amount of stack space that would be allocated
|
||||
by the movm instruction. This is redundant with movm_args, but we
|
||||
add it to the hash table to avoid computing it over and over. */
|
||||
unsigned char movm_stack_size;
|
||||
|
||||
/* When set, convert all "call" instructions to this target into "calls"
|
||||
instructions. */
|
||||
#define MN10300_CONVERT_CALL_TO_CALLS 0x1
|
||||
@ -1543,7 +1550,7 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
|
||||
if (code == 0xdd)
|
||||
{
|
||||
bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 4);
|
||||
bfd_put_8 (abfd, h->stack_size,
|
||||
bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
|
||||
contents + irel->r_offset + 5);
|
||||
}
|
||||
}
|
||||
@ -1658,7 +1665,7 @@ mn10300_elf_relax_section (abfd, sec, link_info, again)
|
||||
if (code == 0xcd)
|
||||
{
|
||||
bfd_put_8 (abfd, h->movm_args, contents + irel->r_offset + 2);
|
||||
bfd_put_8 (abfd, h->stack_size,
|
||||
bfd_put_8 (abfd, h->stack_size + h->movm_stack_size,
|
||||
contents + irel->r_offset + 3);
|
||||
}
|
||||
}
|
||||
@ -2257,6 +2264,32 @@ compute_function_info (abfd, hash, addr, contents)
|
||||
byte2 = bfd_get_8 (abfd, contents + addr + 1);
|
||||
}
|
||||
|
||||
/* Now figure out how much stack space will be allocated by the movm
|
||||
instruction. We need this kept separate from the funtion's normal
|
||||
stack space. */
|
||||
if (hash->movm_args)
|
||||
{
|
||||
/* Space for d2. */
|
||||
if (hash->movm_args & 0x80)
|
||||
hash->movm_stack_size += 4;
|
||||
|
||||
/* Space for d3. */
|
||||
if (hash->movm_args & 0x40)
|
||||
hash->movm_stack_size += 4;
|
||||
|
||||
/* Space for a2. */
|
||||
if (hash->movm_args & 0x20)
|
||||
hash->movm_stack_size += 4;
|
||||
|
||||
/* Space for a3. */
|
||||
if (hash->movm_args & 0x10)
|
||||
hash->movm_stack_size += 4;
|
||||
|
||||
/* "other" space. d0, d1, a0, a1, mdr, lir, lar, 4 byte pad. */
|
||||
if (hash->movm_args & 0x08)
|
||||
hash->movm_stack_size += 8 * 4;
|
||||
}
|
||||
|
||||
/* Now look for the two stack adjustment variants. */
|
||||
if (byte1 == 0xf8 && byte2 == 0xfe)
|
||||
{
|
||||
@ -2271,9 +2304,16 @@ compute_function_info (abfd, hash, addr, contents)
|
||||
temp = ((temp & 0xffff) ^ (~0x7fff)) + 0x8000;
|
||||
temp = -temp;
|
||||
|
||||
if (temp <= 255)
|
||||
if (temp < 255)
|
||||
hash->stack_size = temp;
|
||||
}
|
||||
|
||||
/* If the total stack to be allocated by the call instruction is more
|
||||
than 255 bytes, then we can't remove the stack adjustment by using
|
||||
"call" (we might still be able to remove the "movm" instruction. */
|
||||
if (hash->stack_size + hash->movm_stack_size > 255)
|
||||
hash->stack_size = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2581,6 +2621,7 @@ elf32_mn10300_link_hash_newfunc (entry, table, string)
|
||||
{
|
||||
ret->direct_calls = 0;
|
||||
ret->stack_size = 0;
|
||||
ret->movm_stack_size = 0;
|
||||
ret->flags = 0;
|
||||
ret->movm_args = 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user