This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

My proposal for the libgcc runtime ABI (ia64 gcc/glibc is broken.)


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)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]