diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2003-10-13 15:55:51 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2003-10-13 15:55:51 +0000 |
commit | 3f7deb8a34ed3d6ad3e4b5194a9c0b697452ec6b (patch) | |
tree | 91d6131e2ad26a9cb399b9f93dff529b082e7aa9 /bfd | |
parent | 618ec112719ab55280f2933593e279faf5561bc5 (diff) | |
download | gdb-3f7deb8a34ed3d6ad3e4b5194a9c0b697452ec6b.zip gdb-3f7deb8a34ed3d6ad3e4b5194a9c0b697452ec6b.tar.gz gdb-3f7deb8a34ed3d6ad3e4b5194a9c0b697452ec6b.tar.bz2 |
bfd/
2003-10-10 H.J. Lu <hongjiu.lu@intel.com>
* bfd-in.h (bfd_elf32_ia64_after_parse): New prototype.
(bfd_elf64_ia64_after_parse): Likewise.
* bfd-in2.h: Regenerated.
* elfxx-ia64.c (oor_ip): New.
(oor_branch_size): Likewise.
(bfd_elfNN_ia64_after_parse): Likewise.
(elfNN_ia64_relax_section): Use oor_ip if oor_branch_size
equals sizeof (oor_ip).
ld/
2003-10-10 H.J. Lu <hongjiu.lu@intel.com>
* Makefile.am (eelf64_ia64.c): Also depend on
$(srcdir)/emultempl/ia64elf.em.
* Makefile.in: Regenerated.
* emulparams/elf64_ia64.sh (EXTRA_EM_FILE): Set to ia64elf.
* emultempl/ia64elf.em: New.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 12 | ||||
-rw-r--r-- | bfd/bfd-in.h | 7 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 7 | ||||
-rw-r--r-- | bfd/elfxx-ia64.c | 46 |
4 files changed, 65 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index aadca63..08f2411 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2003-10-13 H.J. Lu <hongjiu.lu@intel.com> + + * bfd-in.h (bfd_elf32_ia64_after_parse): New prototype. + (bfd_elf64_ia64_after_parse): Likewise. + * bfd-in2.h: Regenerated. + + * elfxx-ia64.c (oor_ip): New. + (oor_branch_size): Likewise. + (bfd_elfNN_ia64_after_parse): Likewise. + (elfNN_ia64_relax_section): Use oor_ip if oor_branch_size + equals sizeof (oor_ip). + 2003-10-12 Kaz Kojima <kkojima@rr.iij4u.or.jp> * elf64-sh64.c (sh_elf64_relocate_section): Tidy up for the diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 49ebee7..cfc99b8 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -824,3 +824,10 @@ extern int bfd_ticoff_get_section_load_page extern bfd_vma bfd_h8300_pad_address (bfd *, bfd_vma); +/* IA64 Itanium code generation. Called from linker. */ +extern void bfd_elf32_ia64_after_parse + (int); + +extern void bfd_elf64_ia64_after_parse + (int); + diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 034330f..a70b0d3 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -831,6 +831,13 @@ extern int bfd_ticoff_get_section_load_page extern bfd_vma bfd_h8300_pad_address (bfd *, bfd_vma); +/* IA64 Itanium code generation. Called from linker. */ +extern void bfd_elf32_ia64_after_parse + (int); + +extern void bfd_elf64_ia64_after_parse + (int); + /* Extracted from init.c. */ void bfd_init (void); diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c index 15f7c0a..ed626bf 100644 --- a/bfd/elfxx-ia64.c +++ b/bfd/elfxx-ia64.c @@ -656,6 +656,28 @@ static const bfd_byte oor_brl[16] = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* brl.sptk.few tgt;; */ 0x00, 0x00, 0x00, 0xc0 }; + +static const bfd_byte oor_ip[48] = +{ + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, /* movl r15=0 */ + 0x01, 0x00, 0x00, 0x60, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MII] nop.m 0 */ + 0x00, 0x01, 0x00, 0x60, 0x00, 0x00, /* mov r16=ip;; */ + 0xf2, 0x80, 0x00, 0x80, /* add r16=r15,r16;; */ + 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MIB] nop.m 0 */ + 0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /* mov b6=r16 */ + 0x60, 0x00, 0x80, 0x00 /* br b6;; */ +}; + +static size_t oor_branch_size = sizeof (oor_brl); + +void +bfd_elfNN_ia64_after_parse (int itanium) +{ + oor_branch_size = itanium ? sizeof (oor_ip) : sizeof (oor_brl); +} + /* These functions do relaxation for IA-64 ELF. */ @@ -891,9 +913,7 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again) if (tsec == ia64_info->plt_sec) size = sizeof (plt_full_entry); else - { - size = sizeof (oor_brl); - } + size = oor_branch_size; /* Resize the current section to make room for the new branch. */ trampoff = (sec->_cooked_size + 15) & (bfd_vma) -16; @@ -914,10 +934,22 @@ elfNN_ia64_relax_section (abfd, sec, link_info, again) } else { - memcpy (contents + trampoff, oor_brl, size); - irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info), - R_IA64_PCREL60B); - irel->r_offset = trampoff + 2; + if (size == sizeof (oor_ip)) + { + memcpy (contents + trampoff, oor_ip, size); + irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info), + R_IA64_PCREL64I); + irel->r_addend -= 16; + irel->r_offset = trampoff + 2; + } + else + { + memcpy (contents + trampoff, oor_brl, size); + irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info), + R_IA64_PCREL60B); + irel->r_offset = trampoff + 2; + } + } /* Record the fixup so we don't do it again this section. */ |