Commit fee0225a by Richard Henderson

configure.in (ia64-linux): Add ia64/t-glibc.

	* configure.in (ia64-linux) [tmake_file]: Add ia64/t-glibc.
	* config/ia64/crtbegin.asm (__EH_FRAME_BEGIN__): Remove.
	(segrel_ofs): Remove.
	(__ia64_app_header): New.
	(frame_object): Remove.
	(.init): Set __ia64_app_header when non-shared.
	(__do_global_dtors_aux): Do not call __deregister_frame_info.
	(__do_frame_setup): Remove.
	* config/ia64/crtend.asm (__EH_FRAME_END__): Remove.
	(__do_frame_setup_aux): Remove.
	* config/ia64/frame-ia64.c (object_mutex): Remove.
	(bad_record): Remove.
	(init_object_mutex): Remove.
	(init_object_mutex_once): Remove.
	(fde_compare): Remove.
	(__register_frame_info_aux): Remove.
	(frame_init): Remove.
	(find_fde): Remove.
	(*): Use ISO function definitions.
	(P3_record_types): Constify.
	(P7_record_types, P7_additional_fields): Constify.
	(P8_record_types, P8_additional_fields): Constify.
	(read_P_record): Remove parenthesis warning.  Use structure
	assignment instead of memcpy.
	(execute_one_ia64_descriptor): Likewise.
	(__build_ia64_frame_state): Use __ia64_find_fde.
	(record_name, print_record, print_all_records): Remove.
	* config/ia64/frame-ia64.h: New file.
	* config/ia64/fde-glibc.c: New file.
	* config/ia64/t-glibc: New file.

From-SVN: r36705
parent 7e51098e
...@@ -26,20 +26,19 @@ __CTOR_LIST__: ...@@ -26,20 +26,19 @@ __CTOR_LIST__:
__DTOR_LIST__: __DTOR_LIST__:
data8 -1 data8 -1
.section .IA_64.unwind
.align 8
__EH_FRAME_BEGIN__:
.section .sdata .section .sdata
.type dtor_ptr#,@object .type dtor_ptr#,@object
.size dtor_ptr#,8 .size dtor_ptr#,8
dtor_ptr: dtor_ptr:
data8 __DTOR_LIST__# + 8 data8 __DTOR_LIST__# + 8
.type segrel_ofs#,@object #ifndef SHARED
.size segrel_ofs#,8 .type __ia64_app_header#,@object
segrel_ofs: .size __ia64_app_header#,8
.global __ia64_app_header
__ia64_app_header:
data8 @segrel(.Lsegrel_ref#) data8 @segrel(.Lsegrel_ref#)
#endif
/* A handle for __cxa_finalize to manage c++ local destructors. */ /* A handle for __cxa_finalize to manage c++ local destructors. */
.global __dso_handle# .global __dso_handle#
...@@ -56,14 +55,6 @@ __dso_handle: ...@@ -56,14 +55,6 @@ __dso_handle:
#endif #endif
.hidden __dso_handle# .hidden __dso_handle#
/* The frame object. */
/* ??? How can we rationally keep this size correct? */
.section .bss
.type frame_object#,@object
.size frame_object#,64
.align 8
frame_object:
.zero 64
/* /*
* Fragment of the ELF _fini routine that invokes our dtor cleanup. * Fragment of the ELF _fini routine that invokes our dtor cleanup.
...@@ -94,25 +85,28 @@ frame_object: ...@@ -94,25 +85,28 @@ frame_object:
;; ;;
} }
#ifndef SHARED
/* /*
* Fragment of the ELF _init routine that sets up the frame info. * Fragment of the ELF _init routine that sets up __ia64_app_header
*/ */
.section .init,"ax","progbits" .section .init,"ax","progbits"
{ .mlx .Lsegrel_ref:
movl r2 = @gprel(__do_frame_setup#) { .mmi
addl r2 = @gprel(__ia64_app_header), gp
mov r16 = ip
;; ;;
} }
{ .mii { .mmi
nop.m 0 ld8 r3 = [r2]
add r2 = r2, gp
;; ;;
mov b6 = r2 sub r16 = r16, r3
}
{ .bbb
br.call.sptk.many b0 = b6
;; ;;
} }
{ .mfb
st8 [r2] = r16
}
#endif
.section .text .section .text
.align 16 .align 16
...@@ -194,33 +188,6 @@ __do_global_dtors_aux: ...@@ -194,33 +188,6 @@ __do_global_dtors_aux:
cmp.ne p6, p0 = r0, r16 cmp.ne p6, p0 = r0, r16
(p6) br.cond.sptk.few 0b (p6) br.cond.sptk.few 0b
} }
/*
if (__deregister_frame_info)
__deregister_frame_info(__EH_FRAME_BEGIN__)
*/
{ .mmi
mov gp = loc2
;;
addl r16 = @ltoff(@fptr(__deregister_frame_info#)), gp
addl out0 = @ltoff(__EH_FRAME_BEGIN__#), gp
;;
}
{ .mmi
ld8 r16 = [r16]
ld8 out0 = [out0]
;;
}
{ .mmi
cmp.ne p7, p0 = r0, r16
;;
(p7) ld8 r18 = [r16], 8
;;
}
{ .mib
(p7) ld8 gp = [r16]
(p7) mov b6 = r18
(p7) br.call.sptk.many b0 = b6
}
{ .mii { .mii
mov gp = loc2 mov gp = loc2
mov b0 = loc1 mov b0 = loc1
...@@ -232,66 +199,6 @@ __do_global_dtors_aux: ...@@ -232,66 +199,6 @@ __do_global_dtors_aux:
} }
.endp __do_global_dtors_aux# .endp __do_global_dtors_aux#
.proc __do_frame_setup#
__do_frame_setup:
/*
if (__register_frame_info)
__register_frame_info(__EH_FRAME_BEGIN__)
*/
{ .mii
alloc loc2 = ar.pfs, 0, 3, 2, 0
addl r16 = @ltoff(@fptr(__register_frame_info#)), gp
addl out0 = @ltoff(__EH_FRAME_BEGIN__#), gp
}
/* frame_object.pc_base = segment_base_offset;
pc_base is at offset 0 within frame_object. */
.Lsegrel_ref:
{ .mmi
addl out1 = @ltoff(frame_object#), gp
;;
addl r2 = @gprel(segrel_ofs#), gp
mov r3 = ip
;;
}
{ .mmi
ld8 r2 = [r2]
ld8 r16 = [r16]
mov loc0 = b0
;;
}
{ .mii
ld8 out1 = [out1]
cmp.ne p7, p0 = r0, r16
sub r3 = r3, r2
;;
}
{ .mmi
st8 [out1] = r3
(p7) ld8 r18 = [r16], 8
mov loc1 = gp
;;
}
{ .mfb
ld8 out0 = [out0]
}
{ .mib
(p7) ld8 gp = [r16]
(p7) mov b6 = r18
(p7) br.call.sptk.many b0 = b6
}
{ .mii
mov gp = loc1
mov b0 = loc0
mov ar.pfs = loc2
}
{ .bbb
br.ret.sptk.many b0
;;
}
.endp __do_frame_setup#
#ifdef SHARED #ifdef SHARED
.weak __cxa_finalize# .weak __cxa_finalize#
#endif #endif
.weak __deregister_frame_info#
.weak __register_frame_info#
...@@ -26,9 +26,6 @@ __CTOR_END__: ...@@ -26,9 +26,6 @@ __CTOR_END__:
__DTOR_END__: __DTOR_END__:
data8 0 data8 0
.section .IA_64.unwind
__EH_FRAME_END__:
/* /*
* Fragment of the ELF _init routine that invokes our dtor cleanup. * Fragment of the ELF _init routine that invokes our dtor cleanup.
* *
...@@ -110,54 +107,3 @@ __do_global_ctors_aux: ...@@ -110,54 +107,3 @@ __do_global_ctors_aux:
;; ;;
} }
.endp __do_global_ctors_aux# .endp __do_global_ctors_aux#
.section .init,"ax","progbits"
{ .mlx
movl r2 = @gprel(__do_frame_setup_aux#)
;;
}
{ .mii
nop.m 0
add r2 = r2, gp
;;
mov b6 = r2
}
{ .bbb
br.call.sptk.many b0 = b6
;;
}
.text
.align 16
.proc __do_frame_setup_aux#
__do_frame_setup_aux:
/*
if (__register_frame_info_aux)
__register_frame_info_aux(__EH_FRAME_END__)
*/
alloc loc0 = ar.pfs, 0, 3, 1, 0
addl r14 = @ltoff(@fptr(__register_frame_info_aux#)), gp
mov loc1 = b0
;;
ld8 r15 = [r14]
addl r16 = @ltoff(__EH_FRAME_END__#), gp
mov loc2 = gp
;;
cmp.eq p6, p7 = 0, r15
(p6) br.cond.dptk 1f
ld8 r8 = [r15], 8
ld8 out0 = [r16]
;;
ld8 gp = [r15]
mov b6 = r8
;;
br.call.sptk.many b0 = b6
;;
1:
mov gp = loc2
mov ar.pfs = loc0
mov b0 = loc1
br.ret.sptk.many b0
.endp __do_frame_setup_aux#
.weak __register_frame_info_aux#
/* Copyright (C) 2000 Free Software Foundation, Inc.
Contributed by Richard Henderson <rth@cygnus.com>.
This file is part of GNU CC.
GNU CC 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, or (at your option)
any later version.
GNU CC 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 GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you link this library with other files,
some of which are compiled with GCC, to produce an executable,
this library does not by itself cause the resulting executable
to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License. */
/* Locate the FDE entry for a given address, using glibc ld.so routines
to avoid register/deregister calls at DSO load/unload. */
#include <stdlib.h>
#include <link.h>
#include <bits/libc-lock.h>
#include "frame-ia64.h"
/* Initialized by crtbegin from the main application. */
extern Elf64_Ehdr *__ia64_app_header;
/* ??? A redeclaration of the lock in ld.so. Perhaps this should
appear in <link.h> in a new glibc version. */
__libc_lock_define (extern, _dl_load_lock)
/* ??? _dl_load_lock is not exported from glibc 2.1, but it is
from glibc 2.2. Remove this when folks have migrated. */
#pragma weak _dl_load_lock
/* This always exists, even in a static application. */
extern struct link_map *_dl_loaded;
static fde *
find_fde_for_dso (Elf64_Addr pc, Elf64_Ehdr *ehdr)
{
Elf64_Phdr *phdr, *p_unwind;
long n, match;
Elf64_Addr load_base, seg_base;
fde *f;
/* Verify that we are looking at an ELF header. */
if (ehdr->e_ident[0] != 0x7f
|| ehdr->e_ident[1] != 'E'
|| ehdr->e_ident[2] != 'L'
|| ehdr->e_ident[3] != 'F'
|| ehdr->e_ident[EI_CLASS] != ELFCLASS64
|| ehdr->e_ident[EI_DATA] != ELFDATA2LSB
|| ehdr->e_machine != EM_IA_64)
abort ();
match = 0;
phdr = (Elf64_Phdr *)((char *)ehdr + ehdr->e_phoff);
load_base = (ehdr->e_type == ET_DYN ? (Elf64_Addr)ehdr : 0);
p_unwind = NULL;
/* See if PC falls into one of the loaded segments. Find the unwind
segment at the same time. */
for (n = ehdr->e_phnum; --n >= 0; phdr++)
{
if (phdr->p_type == PT_LOAD)
{
Elf64_Addr vaddr = phdr->p_vaddr + load_base;
if (pc >= vaddr && pc < vaddr + phdr->p_memsz)
match = 1;
}
else if (phdr->p_type == PT_IA_64_UNWIND)
p_unwind = phdr;
}
if (!match || !p_unwind)
return NULL;
/* Search for the FDE within the unwind segment. */
/* ??? Ideally ld would have sorted this for us by address. Until
that's fixed, we must do a linear search. */
f = (fde *) (p_unwind->p_vaddr + load_base);
seg_base = (Elf64_Addr) ehdr;
for (n = p_unwind->p_memsz / sizeof (fde); --n >= 0; ++f)
if (pc >= f->start_offset + seg_base && pc < f->end_offset + seg_base)
return f;
return NULL;
}
/* Return a pointer to the FDE for the function containing PC. */
fde *
__ia64_find_fde (void *pc, void **pc_base)
{
fde *ret;
struct link_map *map;
/* Check the main application first, hoping that most of the user's
code is there instead of in some library. */
ret = find_fde_for_dso ((Elf64_Addr)pc, __ia64_app_header);
if (ret)
{
*pc_base = __ia64_app_header;
return ret;
}
/* Glibc is probably unique in that we can (with certain restrictions)
dynamicly load libraries into staticly linked applications. Thus
we _always_ check _dl_loaded. */
if (&_dl_load_lock)
__libc_lock_lock (_dl_load_lock);
for (map = _dl_loaded; map ; map = map->l_next)
{
/* Skip the main application's entry. */
if (map->l_name[0] == 0)
continue;
ret = find_fde_for_dso ((Elf64_Addr)pc, (Elf64_Ehdr *)map->l_addr);
if (ret)
break;
}
if (&_dl_load_lock)
__libc_lock_unlock (_dl_load_lock);
*pc_base = (void *)(map ? map->l_addr : 0);
return ret;
}
/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
Contributed by Andrew MacLeod <amacleod@cygnus.com>
Andrew Haley <aph@cygnus.com>
This file is part of GNU CC.
GNU CC 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, or (at your option)
any later version.
GNU CC 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 GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* This structure represents a single unwind table entry. We lie and say
its the dwarf_fde structure to use the common object in frame.h */
typedef struct dwarf_fde
{
long start_offset;
long end_offset;
long unwind_offset;
} unwind_table_entry;
/* Defining dwarf_fde allows us to use the common object registration. */
typedef unwind_table_entry dwarf_fde;
typedef unwind_table_entry fde;
extern fde *__ia64_find_fde (void *, void **);
LIB2ADDEH += $(srcdir)/config/ia64/fde-glibc.c
...@@ -5059,7 +5059,7 @@ for machine in $build $host $target; do ...@@ -5059,7 +5059,7 @@ for machine in $build $host $target; do
;; ;;
ia64*-*-linux*) ia64*-*-linux*)
tm_file=ia64/linux.h tm_file=ia64/linux.h
tmake_file="t-linux ia64/t-ia64" tmake_file="t-linux ia64/t-ia64 ia64/t-glibc"
target_cpu_default="MASK_GNU_AS|MASK_GNU_LD" target_cpu_default="MASK_GNU_AS|MASK_GNU_LD"
if test x$enable_threads = xyes; then if test x$enable_threads = xyes; then
thread_file='posix' thread_file='posix'
......
...@@ -2046,7 +2046,7 @@ changequote([,])dnl ...@@ -2046,7 +2046,7 @@ changequote([,])dnl
;; ;;
ia64*-*-linux*) ia64*-*-linux*)
tm_file=ia64/linux.h tm_file=ia64/linux.h
tmake_file="t-linux ia64/t-ia64" tmake_file="t-linux ia64/t-ia64 ia64/t-glibc"
target_cpu_default="MASK_GNU_AS|MASK_GNU_LD" target_cpu_default="MASK_GNU_AS|MASK_GNU_LD"
if test x$enable_threads = xyes; then if test x$enable_threads = xyes; then
thread_file='posix' thread_file='posix'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment