* [Patch gas/mach-o 2/2] implement mach-o subsections-via-symbols.
@ 2012-02-17 17:21 Iain Sandoe
2012-02-20 16:35 ` Tristan Gingold
0 siblings, 1 reply; 3+ messages in thread
From: Iain Sandoe @ 2012-02-17 17:21 UTC (permalink / raw)
To: binutils Development; +Cc: Tristan Gingold
This is the bulk of the 'work' associated with the implementation.
I've re-named a couple of routines to keep to "obj_mach_o_xxx" and
tried to ensure that the order of routines in the main file and header
match up. Our code is growing quite fast and maybe they got a little
out of synch (new culpa, I'm sure ;)).
OK for trunk?
Iain
gas:
* config/obj-macho.c (obj_mach_o_frob_colon): New.
(obj_mach_o_frob_label): Record sub-section labels.
(obj_mach_o_frob_symbol): Rename from obj_macho_frob_symbol.
(obj_mach_o_set_subsections): New.
(obj_mach_o_pre_relax_hook): New.
(obj_mach_o_in_different_subsection): New.
(obj_mach_o_force_reloc_sub_same): New.
(obj_mach_o_force_reloc_sub_local): New.
(obj_mach_o_force_reloc): New.
* config/obj-macho.h (OBJ_SYMFIELD_TYPE): New.
(obj_frob_colon): New Define.
(obj_mach_o_frob_label): Renamed.
(obj_mach_o_frob_symbol): Renamed.
(OBJ_FRAG_TYPE): New.
(obj_mach_o_in_different_subsection, obj_mach_o_force_reloc,
obj_mach_o_force_reloc_sub_same,
obj_mach_o_force_reloc_sub_local): New declarations.
gas/config/obj-macho.c | 199 +++++++++++++++++++++++++++++++++++++++
+--------
gas/config/obj-macho.h | 49 ++++++++++---
2 files changed, 205 insertions(+), 43 deletions(-)
diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
index 2a2e47d..632eafa 100644
--- a/gas/config/obj-macho.c
+++ b/gas/config/obj-macho.c
@@ -1331,6 +1331,18 @@ obj_mach_o_type_for_symbol (bfd_mach_o_asymbol
*s)
return BFD_MACH_O_N_SECT;
}
+void
+obj_mach_o_frob_colon (const char *name)
+{
+ if (!bfd_is_local_label_name (stdoutput, name))
+ {
+ /* A non-local label will create a new subsection, so start a new
+ frag. */
+ frag_wane (frag_now);
+ frag_new (0);
+ }
+}
+
/* We need to check the correspondence between some kinds of symbols
and their
sections. Common and BSS vars will seen via the obj_macho_comm()
function.
@@ -1345,13 +1357,21 @@ obj_mach_o_type_for_symbol (bfd_mach_o_asymbol
*s)
are possibly incompatible with the section etc. that the symbol
is defined
in. */
-void obj_macho_frob_label (struct symbol *sp)
+void obj_mach_o_frob_label (struct symbol *sp)
{
bfd_mach_o_asymbol *s;
unsigned base_type;
bfd_mach_o_section *sec;
int sectype = -1;
+ if (!bfd_is_local_label_name (stdoutput, S_GET_NAME (sp)))
+ {
+ /* If this is a non-local label, it should have started a new
sub-
+ section. */
+ gas_assert (frag_now->obj_frag_data.subsection == NULL);
+ frag_now->obj_frag_data.subsection = sp;
+ }
+
/* Leave local symbols alone. */
if (S_IS_LOCAL (sp))
@@ -1392,7 +1412,7 @@ void obj_macho_frob_label (struct symbol *sp)
(e.g. global + weak_def). */
int
-obj_macho_frob_symbol (struct symbol *sp)
+obj_mach_o_frob_symbol (struct symbol *sp)
{
bfd_mach_o_asymbol *s;
unsigned base_type;
@@ -1483,6 +1503,95 @@ obj_macho_frob_symbol (struct symbol *sp)
return 0;
}
+/* Support stabs for mach-o. */
+
+void
+obj_mach_o_process_stab (int what, const char *string,
+ int type, int other, int desc)
+{
+ symbolS *symbolP;
+ bfd_mach_o_asymbol *s;
+
+ switch (what)
+ {
+ case 'd':
+ symbolP = symbol_new ("", now_seg, frag_now_fix (), frag_now);
+ /* Special stabd NULL name indicator. */
+ S_SET_NAME (symbolP, NULL);
+ break;
+
+ case 'n':
+ case 's':
+ symbolP = symbol_new (string, undefined_section, (valueT) 0,
+ &zero_address_frag);
+ pseudo_set (symbolP);
+ break;
+
+ default:
+ as_bad(_("unrecognized stab type '%c'"), (char)what);
+ abort ();
+ break;
+ }
+
+ s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
+ s->n_type = type;
+ s->n_desc = desc;
+ /* For stabd, this will eventually get overwritten by the section
number. */
+ s->n_sect = other;
+
+ /* It's a debug symbol. */
+ s->symbol.flags |= BSF_DEBUGGING;
+}
+
+/* Here we count up frags in each subsection (where a sub-section is
defined
+ as starting with a non-local symbol).
+ Note that, if there are no non-local symbols in a section, all the
frags will
+ be attached as one anonymous subsection. */
+
+static void
+obj_mach_o_set_subsections (bfd *abfd ATTRIBUTE_UNUSED,
+ asection *sec,
+ void *unused ATTRIBUTE_UNUSED)
+{
+ segment_info_type *seginfo = seg_info (sec);
+ symbolS *cur_subsection = NULL;
+ struct obj_mach_o_symbol_data *cur_subsection_data = NULL;
+ fragS *frag;
+ frchainS *chain;
+
+ /* Protect against sections not created by gas. */
+ if (seginfo == NULL)
+ return;
+
+ /* Attach every frag to a subsection. */
+ for (chain = seginfo->frchainP; chain != NULL; chain = chain-
>frch_next)
+ for (frag = chain->frch_root; frag != NULL; frag = frag->fr_next)
+ {
+ if (frag->obj_frag_data.subsection == NULL)
+ frag->obj_frag_data.subsection = cur_subsection;
+ else
+ {
+ cur_subsection = frag->obj_frag_data.subsection;
+ cur_subsection_data = symbol_get_obj (cur_subsection);
+ cur_subsection_data->subsection_size = 0;
+ }
+ if (cur_subsection_data != NULL)
+ {
+ /* Update subsection size. */
+ cur_subsection_data->subsection_size += frag->fr_fix;
+ }
+ }
+}
+
+/* Handle mach-o subsections-via-symbols counting up frags belonging
to each
+ sub-section. */
+
+void
+obj_mach_o_pre_relax_hook (void)
+{
+ bfd_map_over_sections (stdoutput, obj_mach_o_set_subsections, (char
*) 0);
+}
+
/* Zerofill and GB Zerofill sections must be sorted to follow all
other
sections in their segments.
@@ -1706,42 +1815,66 @@ obj_mach_o_reorder_section_relocs (asection
*sec, arelent **rels, unsigned int n
bfd_set_reloc (stdoutput, sec, rels, n);
}
-/* Support stabs for mach-o. */
-
-void
-obj_mach_o_process_stab (int what, const char *string,
- int type, int other, int desc)
+int
+obj_mach_o_in_different_subsection (symbolS *a, symbolS *b)
{
- symbolS *symbolP;
- bfd_mach_o_asymbol *s;
+ fragS *fa;
+ fragS *fb;
- switch (what)
+ if (S_GET_SEGMENT (a) != S_GET_SEGMENT (b)
+ || !S_IS_DEFINED (a)
+ || !S_IS_DEFINED (b))
{
- case 'd':
- symbolP = symbol_new ("", now_seg, frag_now_fix (), frag_now);
- /* Special stabd NULL name indicator. */
- S_SET_NAME (symbolP, NULL);
- break;
-
- case 'n':
- case 's':
- symbolP = symbol_new (string, undefined_section, (valueT) 0,
- &zero_address_frag);
- pseudo_set (symbolP);
- break;
+ /* Not in the same segment, or undefined symbol. */
+ return 1;
+ }
- default:
- as_bad(_("unrecognized stab type '%c'"), (char)what);
- abort ();
- break;
+ fa = symbol_get_frag (a);
+ fb = symbol_get_frag (b);
+ if (fa == NULL || fb == NULL)
+ {
+ /* One of the symbols is not in a subsection. */
+ return 1;
}
- s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
- s->n_type = type;
- s->n_desc = desc;
- /* For stabd, this will eventually get overwritten by the section
number. */
- s->n_sect = other;
+ return fa->obj_frag_data.subsection != fb->obj_frag_data.subsection;
+}
- /* It's a debug symbol. */
- s->symbol.flags |= BSF_DEBUGGING;
+int
+obj_mach_o_force_reloc_sub_same (fixS *fix, segT seg)
+{
+ if (! SEG_NORMAL (seg))
+ return 1;
+ return obj_mach_o_in_different_subsection (fix->fx_addsy, fix-
>fx_subsy);
+}
+
+int
+obj_mach_o_force_reloc_sub_local (fixS *fix, segT seg ATTRIBUTE_UNUSED)
+{
+ return obj_mach_o_in_different_subsection (fix->fx_addsy, fix-
>fx_subsy);
+}
+
+int
+obj_mach_o_force_reloc (fixS *fix)
+{
+ if (generic_force_reloc (fix))
+ return 1;
+
+ /* Force a reloc if the target is not in the same subsection.
+ FIXME: handle (a - b) where a and b belongs to the same
subsection ? */
+ if (fix->fx_addsy != NULL)
+ {
+ symbolS *subsec = fix->fx_frag->obj_frag_data.subsection;
+ symbolS *targ = fix->fx_addsy;
+
+ /* There might be no subsections at all. */
+ if (subsec == NULL)
+ return 0;
+
+ if (S_GET_SEGMENT (targ) == absolute_section)
+ return 0;
+
+ return obj_mach_o_in_different_subsection (targ, subsec);
+ }
+ return 0;
}
diff --git a/gas/config/obj-macho.h b/gas/config/obj-macho.h
index bb8daf9..b49038c 100644
--- a/gas/config/obj-macho.h
+++ b/gas/config/obj-macho.h
@@ -56,11 +56,36 @@ extern const pseudo_typeS mach_o_pseudo_table[];
#define obj_read_begin_hook() {;}
#define obj_symbol_new_hook(s) {;}
-#define obj_frob_label(s) obj_macho_frob_label(s)
-extern void obj_macho_frob_label (struct symbol *);
+#define EMIT_SECTION_SYMBOLS 0
+
+struct obj_mach_o_symbol_data
+{
+ /* If the symbol represents a subsection, this is the size of the
subsection.
+ This is used to check whether a local symbol belongs to a
subsection. */
+ valueT subsection_size;
+};
+#define OBJ_SYMFIELD_TYPE struct obj_mach_o_symbol_data
+
+#define obj_frob_colon obj_mach_o_frob_colon
+extern void obj_mach_o_frob_colon (const char *);
+
+/* Called when a label is defined. Mach-O uses this to create
subsections. */
+#define obj_frob_label obj_mach_o_frob_label
+extern void obj_mach_o_frob_label (symbolS *);
-#define obj_frob_symbol(s, punt) punt = obj_macho_frob_symbol(s)
-extern int obj_macho_frob_symbol (struct symbol *);
+#define obj_frob_symbol(s, punt) punt = obj_mach_o_frob_symbol(s)
+extern int obj_mach_o_frob_symbol (struct symbol *);
+
+struct obj_mach_o_frag_data
+{
+ /* Symbol that corresponds to the subsection. */
+ symbolS *subsection;
+};
+
+#define OBJ_FRAG_TYPE struct obj_mach_o_frag_data
+
+#define md_pre_relax_hook obj_mach_o_pre_relax_hook()
+extern void obj_mach_o_pre_relax_hook (void);
#define md_post_relax_hook obj_mach_o_post_relax_hook()
void obj_mach_o_post_relax_hook (void);
@@ -68,14 +93,18 @@ void obj_mach_o_post_relax_hook (void);
#define obj_frob_file_after_relocs obj_mach_o_frob_file_after_relocs
extern void obj_mach_o_frob_file_after_relocs (void);
-void obj_mach_o_reorder_section_relocs (asection *, arelent **,
unsigned int);
+#define OBJ_PROCESS_STAB(SEG,W,S,T,O,D)
obj_mach_o_process_stab(W,S,T,O,D)
+extern void obj_mach_o_process_stab (int, const char *,int, int, int);
#define SET_SECTION_RELOCS(sec, relocs, n) \
obj_mach_o_reorder_section_relocs (sec, relocs, n)
-
-#define EMIT_SECTION_SYMBOLS 0
-
-#define OBJ_PROCESS_STAB(SEG,W,S,T,O,D)
obj_mach_o_process_stab(W,S,T,O,D)
-extern void obj_mach_o_process_stab (int, const char *,int, int, int);
+extern void obj_mach_o_reorder_section_relocs (asection *, arelent **,
+ unsigned int);
+
+struct fix;
+int obj_mach_o_in_different_subsection (symbolS *a, symbolS *b);
+int obj_mach_o_force_reloc (struct fix *fix);
+int obj_mach_o_force_reloc_sub_same (struct fix *fix, segT seg);
+int obj_mach_o_force_reloc_sub_local (struct fix *fix, segT seg);
#endif /* _OBJ_MACH_O_H */
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Patch gas/mach-o 2/2] implement mach-o subsections-via-symbols.
2012-02-17 17:21 [Patch gas/mach-o 2/2] implement mach-o subsections-via-symbols Iain Sandoe
@ 2012-02-20 16:35 ` Tristan Gingold
2012-02-21 9:15 ` Iain Sandoe
0 siblings, 1 reply; 3+ messages in thread
From: Tristan Gingold @ 2012-02-20 16:35 UTC (permalink / raw)
To: Iain Sandoe; +Cc: binutils Development
On Feb 17, 2012, at 6:21 PM, Iain Sandoe wrote:
> This is the bulk of the 'work' associated with the implementation.
>
> I've re-named a couple of routines to keep to "obj_mach_o_xxx" and tried to ensure that the order of routines in the main file and header match up. Our code is growing quite fast and maybe they got a little out of synch (new culpa, I'm sure ;)).
>
> OK for trunk?
Ok. (You need a global maintainer OK for part 1/2)
I think we have to add some comments to :-)
Tristan.
> Iain
>
> gas:
>
> * config/obj-macho.c (obj_mach_o_frob_colon): New.
> (obj_mach_o_frob_label): Record sub-section labels.
> (obj_mach_o_frob_symbol): Rename from obj_macho_frob_symbol.
> (obj_mach_o_set_subsections): New.
> (obj_mach_o_pre_relax_hook): New.
> (obj_mach_o_in_different_subsection): New.
> (obj_mach_o_force_reloc_sub_same): New.
> (obj_mach_o_force_reloc_sub_local): New.
> (obj_mach_o_force_reloc): New.
> * config/obj-macho.h (OBJ_SYMFIELD_TYPE): New.
> (obj_frob_colon): New Define.
> (obj_mach_o_frob_label): Renamed.
> (obj_mach_o_frob_symbol): Renamed.
> (OBJ_FRAG_TYPE): New.
> (obj_mach_o_in_different_subsection, obj_mach_o_force_reloc,
> obj_mach_o_force_reloc_sub_same,
> obj_mach_o_force_reloc_sub_local): New declarations.
>
> gas/config/obj-macho.c | 199 ++++++++++++++++++++++++++++++++++++++++--------
> gas/config/obj-macho.h | 49 ++++++++++---
> 2 files changed, 205 insertions(+), 43 deletions(-)
>
> diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
> index 2a2e47d..632eafa 100644
> --- a/gas/config/obj-macho.c
> +++ b/gas/config/obj-macho.c
> @@ -1331,6 +1331,18 @@ obj_mach_o_type_for_symbol (bfd_mach_o_asymbol *s)
> return BFD_MACH_O_N_SECT;
> }
>
> +void
> +obj_mach_o_frob_colon (const char *name)
> +{
> + if (!bfd_is_local_label_name (stdoutput, name))
> + {
> + /* A non-local label will create a new subsection, so start a new
> + frag. */
> + frag_wane (frag_now);
> + frag_new (0);
> + }
> +}
> +
> /* We need to check the correspondence between some kinds of symbols and their
> sections. Common and BSS vars will seen via the obj_macho_comm() function.
>
> @@ -1345,13 +1357,21 @@ obj_mach_o_type_for_symbol (bfd_mach_o_asymbol *s)
> are possibly incompatible with the section etc. that the symbol is defined
> in. */
>
> -void obj_macho_frob_label (struct symbol *sp)
> +void obj_mach_o_frob_label (struct symbol *sp)
> {
> bfd_mach_o_asymbol *s;
> unsigned base_type;
> bfd_mach_o_section *sec;
> int sectype = -1;
>
> + if (!bfd_is_local_label_name (stdoutput, S_GET_NAME (sp)))
> + {
> + /* If this is a non-local label, it should have started a new sub-
> + section. */
> + gas_assert (frag_now->obj_frag_data.subsection == NULL);
> + frag_now->obj_frag_data.subsection = sp;
> + }
> +
> /* Leave local symbols alone. */
>
> if (S_IS_LOCAL (sp))
> @@ -1392,7 +1412,7 @@ void obj_macho_frob_label (struct symbol *sp)
> (e.g. global + weak_def). */
>
> int
> -obj_macho_frob_symbol (struct symbol *sp)
> +obj_mach_o_frob_symbol (struct symbol *sp)
> {
> bfd_mach_o_asymbol *s;
> unsigned base_type;
> @@ -1483,6 +1503,95 @@ obj_macho_frob_symbol (struct symbol *sp)
> return 0;
> }
>
> +/* Support stabs for mach-o. */
> +
> +void
> +obj_mach_o_process_stab (int what, const char *string,
> + int type, int other, int desc)
> +{
> + symbolS *symbolP;
> + bfd_mach_o_asymbol *s;
> +
> + switch (what)
> + {
> + case 'd':
> + symbolP = symbol_new ("", now_seg, frag_now_fix (), frag_now);
> + /* Special stabd NULL name indicator. */
> + S_SET_NAME (symbolP, NULL);
> + break;
> +
> + case 'n':
> + case 's':
> + symbolP = symbol_new (string, undefined_section, (valueT) 0,
> + &zero_address_frag);
> + pseudo_set (symbolP);
> + break;
> +
> + default:
> + as_bad(_("unrecognized stab type '%c'"), (char)what);
> + abort ();
> + break;
> + }
> +
> + s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
> + s->n_type = type;
> + s->n_desc = desc;
> + /* For stabd, this will eventually get overwritten by the section number. */
> + s->n_sect = other;
> +
> + /* It's a debug symbol. */
> + s->symbol.flags |= BSF_DEBUGGING;
> +}
> +
> +/* Here we count up frags in each subsection (where a sub-section is defined
> + as starting with a non-local symbol).
> + Note that, if there are no non-local symbols in a section, all the frags will
> + be attached as one anonymous subsection. */
> +
> +static void
> +obj_mach_o_set_subsections (bfd *abfd ATTRIBUTE_UNUSED,
> + asection *sec,
> + void *unused ATTRIBUTE_UNUSED)
> +{
> + segment_info_type *seginfo = seg_info (sec);
> + symbolS *cur_subsection = NULL;
> + struct obj_mach_o_symbol_data *cur_subsection_data = NULL;
> + fragS *frag;
> + frchainS *chain;
> +
> + /* Protect against sections not created by gas. */
> + if (seginfo == NULL)
> + return;
> +
> + /* Attach every frag to a subsection. */
> + for (chain = seginfo->frchainP; chain != NULL; chain = chain->frch_next)
> + for (frag = chain->frch_root; frag != NULL; frag = frag->fr_next)
> + {
> + if (frag->obj_frag_data.subsection == NULL)
> + frag->obj_frag_data.subsection = cur_subsection;
> + else
> + {
> + cur_subsection = frag->obj_frag_data.subsection;
> + cur_subsection_data = symbol_get_obj (cur_subsection);
> + cur_subsection_data->subsection_size = 0;
> + }
> + if (cur_subsection_data != NULL)
> + {
> + /* Update subsection size. */
> + cur_subsection_data->subsection_size += frag->fr_fix;
> + }
> + }
> +}
> +
> +/* Handle mach-o subsections-via-symbols counting up frags belonging to each
> + sub-section. */
> +
> +void
> +obj_mach_o_pre_relax_hook (void)
> +{
> + bfd_map_over_sections (stdoutput, obj_mach_o_set_subsections, (char *) 0);
> +}
> +
> /* Zerofill and GB Zerofill sections must be sorted to follow all other
> sections in their segments.
>
> @@ -1706,42 +1815,66 @@ obj_mach_o_reorder_section_relocs (asection *sec, arelent **rels, unsigned int n
> bfd_set_reloc (stdoutput, sec, rels, n);
> }
>
> -/* Support stabs for mach-o. */
> -
> -void
> -obj_mach_o_process_stab (int what, const char *string,
> - int type, int other, int desc)
> +int
> +obj_mach_o_in_different_subsection (symbolS *a, symbolS *b)
> {
> - symbolS *symbolP;
> - bfd_mach_o_asymbol *s;
> + fragS *fa;
> + fragS *fb;
>
> - switch (what)
> + if (S_GET_SEGMENT (a) != S_GET_SEGMENT (b)
> + || !S_IS_DEFINED (a)
> + || !S_IS_DEFINED (b))
> {
> - case 'd':
> - symbolP = symbol_new ("", now_seg, frag_now_fix (), frag_now);
> - /* Special stabd NULL name indicator. */
> - S_SET_NAME (symbolP, NULL);
> - break;
> -
> - case 'n':
> - case 's':
> - symbolP = symbol_new (string, undefined_section, (valueT) 0,
> - &zero_address_frag);
> - pseudo_set (symbolP);
> - break;
> + /* Not in the same segment, or undefined symbol. */
> + return 1;
> + }
>
> - default:
> - as_bad(_("unrecognized stab type '%c'"), (char)what);
> - abort ();
> - break;
> + fa = symbol_get_frag (a);
> + fb = symbol_get_frag (b);
> + if (fa == NULL || fb == NULL)
> + {
> + /* One of the symbols is not in a subsection. */
> + return 1;
> }
>
> - s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
> - s->n_type = type;
> - s->n_desc = desc;
> - /* For stabd, this will eventually get overwritten by the section number. */
> - s->n_sect = other;
> + return fa->obj_frag_data.subsection != fb->obj_frag_data.subsection;
> +}
>
> - /* It's a debug symbol. */
> - s->symbol.flags |= BSF_DEBUGGING;
> +int
> +obj_mach_o_force_reloc_sub_same (fixS *fix, segT seg)
> +{
> + if (! SEG_NORMAL (seg))
> + return 1;
> + return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy);
> +}
> +
> +int
> +obj_mach_o_force_reloc_sub_local (fixS *fix, segT seg ATTRIBUTE_UNUSED)
> +{
> + return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy);
> +}
> +
> +int
> +obj_mach_o_force_reloc (fixS *fix)
> +{
> + if (generic_force_reloc (fix))
> + return 1;
> +
> + /* Force a reloc if the target is not in the same subsection.
> + FIXME: handle (a - b) where a and b belongs to the same subsection ? */
> + if (fix->fx_addsy != NULL)
> + {
> + symbolS *subsec = fix->fx_frag->obj_frag_data.subsection;
> + symbolS *targ = fix->fx_addsy;
> +
> + /* There might be no subsections at all. */
> + if (subsec == NULL)
> + return 0;
> +
> + if (S_GET_SEGMENT (targ) == absolute_section)
> + return 0;
> +
> + return obj_mach_o_in_different_subsection (targ, subsec);
> + }
> + return 0;
> }
> diff --git a/gas/config/obj-macho.h b/gas/config/obj-macho.h
> index bb8daf9..b49038c 100644
> --- a/gas/config/obj-macho.h
> +++ b/gas/config/obj-macho.h
> @@ -56,11 +56,36 @@ extern const pseudo_typeS mach_o_pseudo_table[];
> #define obj_read_begin_hook() {;}
> #define obj_symbol_new_hook(s) {;}
>
> -#define obj_frob_label(s) obj_macho_frob_label(s)
> -extern void obj_macho_frob_label (struct symbol *);
> +#define EMIT_SECTION_SYMBOLS 0
> +
> +struct obj_mach_o_symbol_data
> +{
> + /* If the symbol represents a subsection, this is the size of the subsection.
> + This is used to check whether a local symbol belongs to a subsection. */
> + valueT subsection_size;
> +};
> +#define OBJ_SYMFIELD_TYPE struct obj_mach_o_symbol_data
> +
> +#define obj_frob_colon obj_mach_o_frob_colon
> +extern void obj_mach_o_frob_colon (const char *);
> +
> +/* Called when a label is defined. Mach-O uses this to create subsections. */
> +#define obj_frob_label obj_mach_o_frob_label
> +extern void obj_mach_o_frob_label (symbolS *);
>
> -#define obj_frob_symbol(s, punt) punt = obj_macho_frob_symbol(s)
> -extern int obj_macho_frob_symbol (struct symbol *);
> +#define obj_frob_symbol(s, punt) punt = obj_mach_o_frob_symbol(s)
> +extern int obj_mach_o_frob_symbol (struct symbol *);
> +
> +struct obj_mach_o_frag_data
> +{
> + /* Symbol that corresponds to the subsection. */
> + symbolS *subsection;
> +};
> +
> +#define OBJ_FRAG_TYPE struct obj_mach_o_frag_data
> +
> +#define md_pre_relax_hook obj_mach_o_pre_relax_hook()
> +extern void obj_mach_o_pre_relax_hook (void);
>
> #define md_post_relax_hook obj_mach_o_post_relax_hook()
> void obj_mach_o_post_relax_hook (void);
> @@ -68,14 +93,18 @@ void obj_mach_o_post_relax_hook (void);
> #define obj_frob_file_after_relocs obj_mach_o_frob_file_after_relocs
> extern void obj_mach_o_frob_file_after_relocs (void);
>
> -void obj_mach_o_reorder_section_relocs (asection *, arelent **, unsigned int);
> +#define OBJ_PROCESS_STAB(SEG,W,S,T,O,D) obj_mach_o_process_stab(W,S,T,O,D)
> +extern void obj_mach_o_process_stab (int, const char *,int, int, int);
>
> #define SET_SECTION_RELOCS(sec, relocs, n) \
> obj_mach_o_reorder_section_relocs (sec, relocs, n)
> -
> -#define EMIT_SECTION_SYMBOLS 0
> -
> -#define OBJ_PROCESS_STAB(SEG,W,S,T,O,D) obj_mach_o_process_stab(W,S,T,O,D)
> -extern void obj_mach_o_process_stab (int, const char *,int, int, int);
> +extern void obj_mach_o_reorder_section_relocs (asection *, arelent **,
> + unsigned int);
> +
> +struct fix;
> +int obj_mach_o_in_different_subsection (symbolS *a, symbolS *b);
> +int obj_mach_o_force_reloc (struct fix *fix);
> +int obj_mach_o_force_reloc_sub_same (struct fix *fix, segT seg);
> +int obj_mach_o_force_reloc_sub_local (struct fix *fix, segT seg);
>
> #endif /* _OBJ_MACH_O_H */
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Patch gas/mach-o 2/2] implement mach-o subsections-via-symbols.
2012-02-20 16:35 ` Tristan Gingold
@ 2012-02-21 9:15 ` Iain Sandoe
0 siblings, 0 replies; 3+ messages in thread
From: Iain Sandoe @ 2012-02-21 9:15 UTC (permalink / raw)
To: Tristan Gingold; +Cc: binutils Development
On 20 Feb 2012, at 16:34, Tristan Gingold wrote:
> On Feb 17, 2012, at 6:21 PM, Iain Sandoe wrote:
>
>> This is the bulk of the 'work' associated with the implementation.
>>
>> I've re-named a couple of routines to keep to "obj_mach_o_xxx" and
>> tried to ensure that the order of routines in the main file and
>> header match up. Our code is growing quite fast and maybe they got
>> a little out of synch (new culpa, I'm sure ;)).
>>
>> OK for trunk?
>
> Ok. (You need a global maintainer OK for part 1/2)
thanks, applied together with part 1 (splitting would break the build).
> I think we have to add some comments to :-)
I made comments as I amended - so they will arrive in patches to be
posted (hopefully soon).
Iain
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-02-21 9:15 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-17 17:21 [Patch gas/mach-o 2/2] implement mach-o subsections-via-symbols Iain Sandoe
2012-02-20 16:35 ` Tristan Gingold
2012-02-21 9:15 ` Iain Sandoe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).