RFA: libunwind basic support

Andrew Cagney ac131313@redhat.com
Tue Nov 11 23:09:00 GMT 2003


>> +#define STRINGIFY2(name)    #name
>> +#define STRINGIFY(name)        STRINGIFY2(name)
>> +
>> +static char *get_reg_name = STRINGIFY(UNW_OBJ(get_reg));
>> +static char *get_fpreg_name = STRINGIFY(UNW_OBJ(get_fpreg));
>> +static char *get_saveloc_name = STRINGIFY(UNW_OBJ(get_saveloc));
>> +static char *step_name = STRINGIFY(UNW_OBJ(step));
>> +static char *init_remote_name = STRINGIFY(UNW_OBJ(init_remote));
>> +static char *create_addr_space_name = STRINGIFY(UNW_OBJ(create_addr_space));
>> +static char *search_unwind_table_name = STRINGIFY(UNW_OBJ(search_unwind_table));
>> +static char *find_dyn_list_name = STRINGIFY(UNW_OBJ(find_dyn_list));
>> 
>> I don't understand this.  A guess is that UNW_OBJ() is doing something evil (use "include/sym-cat.h") to those names and having the array (use "static const char <name>[] = ..." and local to libunwind_load) makes ones debugging life much easier?  If this is the case, can you add some commentary?

> Yes.  The libunwind code is slightly ugly with respect to the fact that the function names are not aliased with generic names.  They all have platform prefixes so I must spell them out.  Function names are generated automatically using the UNW_OBJ macro.

Can you please add this to the file as a comment.



> +void
> +libunwind_frame_set_descr (struct gdbarch *gdbarch, struct libunwind_descr *descr)
> +{
> +  struct libunwind_descr *arch_descr;
> +
> +  gdb_assert (gdbarch != NULL);
> +
> +  arch_descr = gdbarch_data (gdbarch, libunwind_descr_handle);
> +
> +  if (arch_descr == NULL)
> +    {
> +      /* First time here.  Must initialize data area.  */
> +      arch_descr = libunwind_descr_init (gdbarch);
> +      set_gdbarch_data (gdbarch, libunwind_descr_handle, arch_descr);
> +    }
> +
> +  /* Copy new descriptor info into arch descriptor.  */
> +  arch_descr->gdb2uw = descr->gdb2uw;
> +  arch_descr->uw2gdb = descr->uw2gdb;
> +  arch_descr->is_fpreg = descr->is_fpreg;
> +  arch_descr->accessors = descr->accessors;
> +}

Yes!  Now the architecture has-a libunwind structure.

Doesn't the configury make this:

> +#ifdef HAVE_LIBUNWIND_H

redundant?

> +  libunwind_descr_handle = register_gdbarch_data (libunwind_descr_init);
> +
> +  libunwind_initialized = libunwind_load ();
> +#endif  

> +   Contributed by Jeff Johnston.

(redhat)


> +const struct frame_unwind *libunwind_frame_sniffer (struct frame_info *next_frame);

Comments for this one ...

> +void libunwind_frame_set_descr (struct gdbarch *arch, struct libunwind_descr *descr);
> +
> +void libunwind_frame_this_id (struct frame_info *next_frame, void **this_cache,
> +			      struct frame_id *this_id);
> +void libunwind_frame_prev_register (struct frame_info *next_frame, void **this_cache,
> +				    int regnum, int *optimizedp,
> +				    enum lval_type *lvalp, CORE_ADDR *addrp,
> +				    int *realnump, void *valuep);
> +CORE_ADDR libunwind_frame_base_address (struct frame_info *next_frame, void **this_cache);
> +
> +int libunwind_is_initialized (void);
> +
> +int libunwind_search_unwind_table (void *as, long ip, void *di,
> +				   void *pi, int need_unwind_info, void *args);

Also comments for this one ...

> +unw_word_t libunwind_find_dyn_list (unw_addr_space_t, void *, size_t,
> +				    unw_word_t, unw_word_t, void *);

> Index: Makefile.in

Yep.

> +	libunwind-frame.c \

> -	$(elf_bfd_h) $(dis_asm_h)
> +	$(elf_bfd_h) $(dis_asm_h) $(libunwind_frame_h)

> +libunwind-frame.o: libunwind-frame.c $(defs_h) \
> +	$(frame_h) $(frame_base_h) $(frame_unwind_h) $(gdbcore_h) \
> +	$(gdbtypes_h) $(symtab_h) $(objfiles_h) $(regcache_h) \
> +	$(gdb_assert_h) $(gdb_string_h) $(complaints_h) $(libunwind_frame_h)

> Index: configure.in
> ===================================================================
> RCS file: /cvs/src/src/gdb/configure.in,v
> retrieving revision 1.132
> diff -u -r1.132 configure.in
> --- configure.in	3 Sep 2003 15:02:48 -0000	1.132
> +++ configure.in	22 Oct 2003 23:36:21 -0000
> @@ -192,6 +192,33 @@
>      enable_gdbtk=no ;;
>  esac

Based on 12.1 Working With External Software
http://www.gnu.org/software/autoconf/manual/autoconf-2.57/html_chapter/autoconf_12.html#SEC130

I suspect that this should be --with (external libunwind software), and 
not --enable (gdb feature), although, to be honest, its hard to tell 
which it should be.

Anyone?

> +# Enable libunwind support.
> +AC_ARG_ENABLE(libunwind,
> +[  --enable-libunwind          enable libunwind frame unwinding support],
> +  [case $enableval in
> +    yes | no)

The behavior should be:

--{with,enable}-libunwind
Enable libunwind unconditionally.

--{without,disable}-libunwind
Disable libunwind unconditionally

> +      ;;
> +    *)
> +      AC_MSG_ERROR([bad value $enableval for --enable-libunwind]) ;;
> +  esac]

<none>
Check for "libunwind.h" and "libunwind-ia64.h" and if present, enable 
it.  Something like:
     AC_CHECK_HEADERS(libunwind.h)
     AC_CHECK_HEADERS(libunwind-ia64.h)
     test $ac_cv_have_libunwind_h = yes && enable_libunwind=yes

)

And then just:

> +  if test x"$enable_libunwind" = xyes; then
> +    AC_CHECK_HEADERS(libunwind.h)
> +    AC_CHECK_HEADERS(libunwind-ia64.h)
> +    CONFIG_OBS="$CONFIG_OBS libunwind-frame.o"
> +    CONFIG_DEPS="$CONFIG_DEPS libunwind-frame.o"
> +    CONFIG_SRCS="$CONFIG_SRCS libunwind-frame.c"

but also AC_DEFINE(HAVE_LIBUNWIND) so that it can be used.

Andrew




More information about the Gdb-patches mailing list