This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
My proposal for the libgcc runtime ABI (ia64 gcc/glibc is broken.)
- To: GNU C Library <libc-hacker at sourceware dot cygnus dot com>,gcc at gcc dot gnu dot org
- Subject: My proposal for the libgcc runtime ABI (ia64 gcc/glibc is broken.)
- From: "H . J . Lu" <hjl at valinux dot com>
- Date: Mon, 10 Jul 2000 08:03:57 -0700
I haven't heard any feedbacks about my proposal for the libgcc runtime
ABI:
http://gcc.gnu.org/ml/gcc-bugs/2000-07/msg00117.html
But I think the current situation is quite broken. In glibc, we have
---
/* This must match what's in frame.h in gcc. How can one do that? */
struct object
{
void *pc_begin;
void *pc_end;
void *fde_begin;
void *fde_array;
__SIZE_TYPE__ count;
struct object *next;
};
---
in elf/soinit.c. In gcc, we have
---
/* This must match what's in frame.h. */
fprintf (stream, "struct object {\n");
fprintf (stream, " void *pc_begin;\n");
fprintf (stream, " void *pc_end;\n");
fprintf (stream, " void *fde_begin;\n");
fprintf (stream, " void *fde_array;\n");
fprintf (stream, " __SIZE_TYPE__ count;\n");
fprintf (stream, " struct object *next;\n");
fprintf (stream, "};\n");
---
in gcc/collect2.c. However, in gcc/frame.h, there are
struct object {
#ifdef IA64_UNWIND_INFO
void *pc_base; /* This field will be set by find_fde. */
#endif
void *pc_begin;
void *pc_end;
struct dwarf_fde *fde_begin;
#ifdef IA64_UNWIND_INFO
struct dwarf_fde *fde_end;
#endif
struct dwarf_fde **fde_array;
size_t count;
struct object *next;
};
So as of today, the ia64 gcc/glibc are broken due to the mismatch in
struct object. My libgcc runtime ABI proposal will fix it as well
as lead to a fix for the original problem. It means gcc can change
the implementation of
---runtime.h---
#ifndef __RUNTIME_H
#define __RUNTIME_H 1
struct frame_object
{
/* It should be large enough for future expansion. */
void * dummy [16];
};
/* Note the following routines are exported interfaces from libgcc; do
not change these interfaces. Instead create new interfaces. Also
note references to these functions may be made weak in files where
they are referenced. */
extern void __register_frame (void * );
extern void __register_frame_table (void *);
extern void __deregister_frame (void *);
/* Called either from crtbegin.o or a static constructor to register the
unwind info for an object or translation unit, respectively. */
extern void __register_frame_info (void *, struct frame_object *);
/* Similar, but BEGIN is actually a pointer to a table of unwind
entries for different translation units. Called from the file
generated by collect2. */
extern void __register_frame_info_table (void *, struct frame_object *);
/* Called from crtend.o to deregister the unwind info for an object. */
extern void *__deregister_frame_info (void *);
#endif /* __RUNTIME_H */
---
as long as we don't change the ABI defined in runtime.h.
Thanks.
--
H.J. Lu (hjl@gnu.org)