This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [Patch mach-o/gas 2/2] support stabs
- From: Tristan Gingold <gingold at adacore dot com>
- To: Iain Sandoe <developer at sandoe-acoustics dot co dot uk>
- Cc: binutils Development <binutils at sourceware dot org>
- Date: Mon, 2 Jan 2012 12:32:10 +0100
- Subject: Re: [Patch mach-o/gas 2/2] support stabs
- References: <40CEB7B0-2535-4549-B6EF-EC73A83FAECC@sandoe-acoustics.co.uk>
On Dec 31, 2011, at 2:26 PM, Iain Sandoe wrote:
> this applies on top of:
> http://sourceware.org/ml/binutils/2011-12/msg00319.html
> and
> http://sourceware.org/ml/binutils/2011-12/msg00320.html
> and Patch 1.
>
> it modifies the symbol handling and sorting to deal with stabs.
>
> OK?
Ok, but please follow the GNU style for if statements in bfd_mach_o_primary_symbol_sort_key.
Tristan.
> Iain
>
> bfd:
>
> * mach-o.c (bfd_mach_o_primary_symbol_sort_key): Adjust for stabs.
> (bfd_mach_o_cf_symbols): Likewise.
>
> gas:
>
> * config/obj-macho.c (obj_macho_frob_label): Leave stabs untouched.
> (obj_macho_frob_symbol): Likewise.
>
> diff --git a/bfd/mach-o.c b/bfd/mach-o.c
> index cf54471..856d245 100644
> --- a/bfd/mach-o.c
> +++ b/bfd/mach-o.c
> @@ -1610,15 +1610,19 @@ bfd_mach_o_write_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
> }
>
> static unsigned
> -bfd_mach_o_primary_symbol_sort_key (unsigned type, unsigned ext)
> +bfd_mach_o_primary_symbol_sort_key (unsigned type)
> {
> - /* TODO: Determine the correct ordering of stabs symbols. */
> - /* We make indirect symbols a local/synthetic. */
> - if (type == BFD_MACH_O_N_INDR) return 3;
> + unsigned mtyp = type & BFD_MACH_O_N_TYPE;
> +
> + /* Just leave debug symbols where they are (pretend they are local, and
> + then they will just be sorted on position). */
> + if (type & BFD_MACH_O_N_STAB) return 0;
> + /* Sort indirects to last. */
> + if (mtyp == BFD_MACH_O_N_INDR) return 3;
> /* Local (we should never see an undefined local AFAICT). */
> - if (!ext) return 0;
> + if (! (type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT))) return 0;
> /* Common symbols look like undefined externs. */
> - if (type == BFD_MACH_O_N_UNDF) return 2;
> + if (mtyp == BFD_MACH_O_N_UNDF) return 2;
> /* A defined symbol that's not indirect or extern. */
> return 1;
> }
> @@ -1629,19 +1633,15 @@ bfd_mach_o_cf_symbols (const void *a, const void *b)
> bfd_mach_o_asymbol *sa = *(bfd_mach_o_asymbol **) a;
> bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b;
> unsigned int soa, sob;
> - soa = bfd_mach_o_primary_symbol_sort_key
> - (sa->n_type & BFD_MACH_O_N_TYPE,
> - sa->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT));
> - sob = bfd_mach_o_primary_symbol_sort_key
> - (sb->n_type & BFD_MACH_O_N_TYPE,
> - sb->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT));
> + soa = bfd_mach_o_primary_symbol_sort_key (sa->n_type);
> + sob = bfd_mach_o_primary_symbol_sort_key (sb->n_type);
> if (soa < sob)
> return -1;
>
> if (soa > sob)
> return 1;
>
> - /* If it's local, just preserve the input order. */
> + /* If it's local or stab, just preserve the input order. */
> if (soa == 0)
> {
> if (sa->symbol.udata.i < sb->symbol.udata.i)
>
>
> diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
> index 8007123..ad442d2 100644
> --- a/gas/config/obj-macho.c
> +++ b/gas/config/obj-macho.c
> @@ -773,6 +773,9 @@ void obj_macho_frob_label (struct symbol *sp)
> unsigned base_type = obj_mach_o_type_for_symbol (s);
> bfd_mach_o_section *sec = bfd_mach_o_get_mach_o_section (s->symbol.section);
> int sectype = -1;
> +
> + if ((s->n_type & BFD_MACH_O_N_STAB) != 0)
> + return; /* Leave alone. */
>
> if (sec != NULL)
> sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
> @@ -789,7 +792,6 @@ void obj_macho_frob_label (struct symbol *sp)
>
> /* Have we changed from an undefined to defined ref? */
> s->n_desc &= ~(REFE | LAZY);
> -
> }
>
> if ((s->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_INDR)
> @@ -816,7 +818,9 @@ obj_macho_frob_symbol (struct symbol *sp)
> if (sec != NULL)
> sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
>
> - if (s->symbol.section == bfd_und_section_ptr)
> + if ((s->n_type & BFD_MACH_O_N_STAB) != 0)
> + return 0; /* Leave alone. */
> + else if (s->symbol.section == bfd_und_section_ptr)
> {
> /* ??? Do we really gain much from implementing this as well as the
> mach-o specific ones? */
>