From 3f7deb8a34ed3d6ad3e4b5194a9c0b697452ec6b Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 13 Oct 2003 15:55:51 +0000 Subject: [PATCH] bfd/ 2003-10-10 H.J. Lu * 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 * 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. --- bfd/ChangeLog | 12 ++++++++ bfd/bfd-in.h | 7 +++++ bfd/bfd-in2.h | 7 +++++ bfd/elfxx-ia64.c | 46 +++++++++++++++++++++++----- ld/ChangeLog | 10 ++++++ ld/Makefile.am | 6 ++-- ld/Makefile.in | 14 +++++---- ld/emulparams/elf64_ia64.sh | 2 +- ld/emultempl/ia64elf.em | 61 +++++++++++++++++++++++++++++++++++++ 9 files changed, 149 insertions(+), 16 deletions(-) create mode 100644 ld/emultempl/ia64elf.em diff --git a/bfd/ChangeLog b/bfd/ChangeLog index aadca635d29..08f2411de5d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2003-10-13 H.J. Lu + + * 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 * elf64-sh64.c (sh_elf64_relocate_section): Tidy up for the diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 49ebee7237a..cfc99b82a51 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 034330fd92f..a70b0d32b8f 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 15f7c0a126a..ed626bfae39 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. */ diff --git a/ld/ChangeLog b/ld/ChangeLog index 1c48c10a0f9..0f91e79ed76 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2003-10-10 H.J. Lu + + * 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. + 2003-10-12 Kaz Kojima * emulparams/shelf32_nbsd.sh (OTHER_SECTIONS): Redefine. diff --git a/ld/Makefile.am b/ld/Makefile.am index 00c4998904a..fea073b11d4 100644 --- a/ld/Makefile.am +++ b/ld/Makefile.am @@ -789,12 +789,14 @@ eelf64_aix.c: $(srcdir)/emulparams/elf64_aix.sh \ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf64_aix "$(tdir_elf64_aix)" eelf64_ia64.c: $(srcdir)/emulparams/elf64_ia64.sh \ - $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/needrelax.em \ + $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/ia64elf.em \ + $(srcdir)/emultempl/needrelax.em \ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf64_ia64 "$(tdir_elf64_ia64)" eelf64_ia64_fbsd.c: $(srcdir)/emulparams/elf64_ia64_fbsd.sh \ $(srcdir)/emulparams/elf64_ia64.sh \ - $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/needrelax.em \ + $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/ia64elf.em \ + $(srcdir)/emultempl/needrelax.em \ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf64_ia64_fbsd "$(tdir_elf64_ia64_fbsd)" eelf64_s390.c: $(srcdir)/emulparams/elf64_s390.sh \ diff --git a/ld/Makefile.in b/ld/Makefile.in index 85c13ddfee9..1006b3f903b 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am +# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation @@ -888,7 +888,7 @@ uninstall-man: all-recursive install-data-recursive install-exec-recursive \ installdirs-recursive install-recursive uninstall-recursive install-info-recursive \ check-recursive installcheck-recursive info-recursive dvi-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ @@ -908,7 +908,7 @@ check-recursive installcheck-recursive info-recursive dvi-recursive: mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ + @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ rev="$$subdir $$rev"; \ @@ -1093,7 +1093,7 @@ distclean-generic: -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: - -test -z "ldlexldeffilephdeffilepcldgramhldgramc$(MAINTAINERCLEANFILES)" || rm -f ldlexl deffileph deffilepc ldgramh ldgramc $(MAINTAINERCLEANFILES) + -test -z "ldlexcdeffilephdeffilepcldgramhldgramc$(MAINTAINERCLEANFILES)" || rm -f ldlexc deffileph deffilepc ldgramh ldgramc $(MAINTAINERCLEANFILES) mostlyclean-am: mostlyclean-hdr mostlyclean-noinstPROGRAMS \ mostlyclean-compile mostlyclean-libtool \ mostlyclean-aminfo mostlyclean-tags mostlyclean-generic \ @@ -1515,12 +1515,14 @@ eelf64_aix.c: $(srcdir)/emulparams/elf64_aix.sh \ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf64_aix "$(tdir_elf64_aix)" eelf64_ia64.c: $(srcdir)/emulparams/elf64_ia64.sh \ - $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/needrelax.em \ + $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/ia64elf.em \ + $(srcdir)/emultempl/needrelax.em \ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf64_ia64 "$(tdir_elf64_ia64)" eelf64_ia64_fbsd.c: $(srcdir)/emulparams/elf64_ia64_fbsd.sh \ $(srcdir)/emulparams/elf64_ia64.sh \ - $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/needrelax.em \ + $(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/ia64elf.em \ + $(srcdir)/emultempl/needrelax.em \ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf64_ia64_fbsd "$(tdir_elf64_ia64_fbsd)" eelf64_s390.c: $(srcdir)/emulparams/elf64_s390.sh \ diff --git a/ld/emulparams/elf64_ia64.sh b/ld/emulparams/elf64_ia64.sh index d9c7f6aba16..858cd10cbbd 100644 --- a/ld/emulparams/elf64_ia64.sh +++ b/ld/emulparams/elf64_ia64.sh @@ -2,7 +2,7 @@ SCRIPT_NAME=elf ELFSIZE=64 TEMPLATE_NAME=elf32 -EXTRA_EM_FILE=needrelax +EXTRA_EM_FILE=ia64elf OUTPUT_FORMAT="elf64-ia64-little" ARCH=ia64 MACHINE= diff --git a/ld/emultempl/ia64elf.em b/ld/emultempl/ia64elf.em new file mode 100644 index 00000000000..551772574e2 --- /dev/null +++ b/ld/emultempl/ia64elf.em @@ -0,0 +1,61 @@ +# This shell script emits a C file. -*- C -*- +# Copyright 2003 Free Software Foundation, Inc. +# +# This file is part of GLD, the Gnu Linker. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +# This file is sourced from elf32.em, and defines extra ia64-elf +# specific routines. +# +# Define some shell vars to insert bits of code into the standard elf +# parse_args and list_options functions. +# +cat >>e${EMULATION_NAME}.c <