This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch mach-o/gas] implement private file flags/subsections-via-symbols.


On Dec 11, 2011, at 5:03 PM, Iain Sandoe wrote:

> (sorry forgot to post the last patch in-line)
> 
> this makes an interface to the mach-o private file flags and uses it to set "subsection-via-symbols" in response to the directive.
> 
> the parse routine in gas/config/obj-mach-o.c has been generalized to deal with other flags in the future.
> tests in gas/mach-o

Ok.  Setting the subsections_via_symbols flag might be premature as I am not sure we correctly set the relocation entries for that.  But because as/i386 isn't yet ready I think this is ok.

> [tests patch relative to the base test suite entry previously posted]

Please slightly postpone the tests until the previous entry has been ok'ed.

BTW, I plan to submit a patch that moves all the private dumping of mach-o to the recently added 'objdump -P' option.

Tristan.


> 
> 
> cheers
> Iain
> 
> bfd:
> 
> 	* mach-o-target.c (bfd_mach_o_bfd_set_private_flags): Use
> 	bfd_mach_o_bfd_set_private_flags.
> 	* mach-o.c (bfd_mach_o_bfd_set_private_flags): New.
> 	* mach-o.h (bfd_mach_o_bfd_set_private_flags): Declare.
> 
> gas:
> 
> 	* config/obj-macho.c (subsections_by_symbols): New global.
> 	(obj_mach_o_file_properties): New enum.
> 	(obj_mach_o_subsections_via_symbols):  Generalize name to...
> 	... (obj_mach_o_fileprop) and use to set subsections_via_symbols.
> 
> gas/testsuite:
> 
> 	* gas/mach-o/empty.s: New.
> 	* gas/mach-o/subsect-via-symbols-0.d: New.
> 	* gas/mach-o/subsect-via-symbols-1.d: New.
> 	* gas/mach-o/subsect-via-symbols.s: New.
> 
> ===
> bfd/mach-o-target.c                              |    2 +-
> bfd/mach-o.c                                     |   16 ++++++++++
> bfd/mach-o.h                                     |    1 +
> gas/config/obj-macho.c                           |   35 ++++++++++++++++++---
> gas/testsuite/gas/mach-o/empty.s                 |    2 +
> gas/testsuite/gas/mach-o/mach-o.exp              |    5 ++-
> gas/testsuite/gas/mach-o/subsect-via-symbols-0.d |    6 ++++
> gas/testsuite/gas/mach-o/subsect-via-symbols-1.d |    6 ++++
> gas/testsuite/gas/mach-o/subsect-via-symbols.s   |    3 ++
> 9 files changed, 68 insertions(+), 8 deletions(-)
> 
> diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c
> index 29682c9..c6b7704 100644
> --- a/bfd/mach-o-target.c
> +++ b/bfd/mach-o-target.c
> @@ -47,7 +47,7 @@
> #define bfd_mach_o_bfd_final_link                     _bfd_generic_final_link
> #define bfd_mach_o_bfd_link_split_section             _bfd_generic_link_split_section
> #define bfd_mach_o_bfd_merge_private_bfd_data         _bfd_generic_bfd_merge_private_bfd_data
> -#define bfd_mach_o_bfd_set_private_flags              _bfd_generic_bfd_set_private_flags
> +#define bfd_mach_o_bfd_set_private_flags              bfd_mach_o_bfd_set_private_flags
> #define bfd_mach_o_get_section_contents               _bfd_generic_get_section_contents
> #define bfd_mach_o_bfd_gc_sections                    bfd_generic_gc_sections
> #define bfd_mach_o_bfd_lookup_section_flags           bfd_generic_lookup_section_flags
> diff --git a/bfd/mach-o.c b/bfd/mach-o.c
> index 82aeb8d..66d275c 100644
> --- a/bfd/mach-o.c
> +++ b/bfd/mach-o.c
> @@ -364,6 +364,22 @@ bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
>   return TRUE;
> }
> 
> +/* This allows us to set up to 32 bits of flags (unless we invent some
> +   fiendish scheme to subdivide).  For now, we'll just set the file flags
> +   without error checking - just overwrite.  */
> +
> +bfd_boolean
> +bfd_mach_o_bfd_set_private_flags (bfd *abfd, flagword flags)
> +{
> +  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
> +
> +  if (!mdata)
> +    return FALSE;
> +
> +  mdata->header.flags = flags;
> +  return TRUE;
> +}
> +
> /* Count the total number of symbols.  */
> 
> static long
> diff --git a/bfd/mach-o.h b/bfd/mach-o.h
> index f199016..6f362f2 100644
> --- a/bfd/mach-o.h
> +++ b/bfd/mach-o.h
> @@ -554,6 +554,7 @@ bfd_boolean bfd_mach_o_bfd_copy_private_symbol_data (bfd *, asymbol *,
> bfd_boolean bfd_mach_o_bfd_copy_private_section_data (bfd *, asection *,
>                                                       bfd *, asection *);
> bfd_boolean bfd_mach_o_bfd_copy_private_bfd_data (bfd *, bfd *);
> +bfd_boolean bfd_mach_o_bfd_set_private_flags (bfd *, flagword);
> long bfd_mach_o_get_symtab_upper_bound (bfd *);
> long bfd_mach_o_canonicalize_symtab (bfd *, asymbol **);
> long bfd_mach_o_get_synthetic_symtab (bfd *, long, asymbol **, long,
> diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
> index 5f1255d..d568b1f 100644
> --- a/gas/config/obj-macho.c
> +++ b/gas/config/obj-macho.c
> @@ -27,6 +27,10 @@
> #include "mach-o.h"
> #include "mach-o/loader.h"
> 
> +/* Remember the subsections_by_symbols state in case we need to reset
> +   the file flags.  */
> +int subsections_by_symbols ;
> +
> static void
> obj_mach_o_weak (int ignore ATTRIBUTE_UNUSED)
> {
> @@ -290,11 +294,32 @@ obj_mach_o_comm (int ignore ATTRIBUTE_UNUSED)
>   s_comm_internal (ignore, obj_mach_o_common_parse);
> }
> 
> -static void
> -obj_mach_o_subsections_via_symbols (int arg ATTRIBUTE_UNUSED)
> +/* Set properties that apply to the whole file.  At present, the only
> +   one defined, is subsections_via_symbols.  */
> +
> +typedef enum obj_mach_o_file_properties {
> +  OBJ_MACH_O_FILE_PROP_NONE = 0,
> +  OBJ_MACH_O_FILE_PROP_SSBS,
> +  OBJ_MACH_O_FILE_PROP_MAX
> +} obj_mach_o_file_properties;
> +
> +static void
> +obj_mach_o_fileprop (int prop)
> {
> -  /* Currently ignore it.  */
> -  demand_empty_rest_of_line ();
> +  if (prop < 0 || prop >= OBJ_MACH_O_FILE_PROP_MAX)
> +    as_fatal (_("internal error: bad file property ID %d"), prop);
> +
> +  switch ((obj_mach_o_file_properties) prop)
> +    {
> +      case OBJ_MACH_O_FILE_PROP_SSBS:
> +        subsections_by_symbols = 1;
> +	if (!bfd_set_private_flags (stdoutput, BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS))
> +	  as_bad (_("failed to set subsections by symbols"));
> +	demand_empty_rest_of_line ();
> +	break;
> +      default:
> +	break;
> +    }
> }
> 
> const pseudo_typeS mach_o_pseudo_table[] =
> @@ -304,7 +329,7 @@ const pseudo_typeS mach_o_pseudo_table[] =
>   { "cstring", obj_mach_o_known_section, 1},
>   { "lcomm", s_lcomm, 1 },
>   { "comm", obj_mach_o_comm, 0 },
> -  { "subsections_via_symbols", obj_mach_o_subsections_via_symbols, 0 },
> +  { "subsections_via_symbols", obj_mach_o_fileprop, OBJ_MACH_O_FILE_PROP_SSBS},
> 
>   {NULL, NULL, 0}
> };
> diff --git a/gas/testsuite/gas/mach-o/empty.s b/gas/testsuite/gas/mach-o/empty.s
> new file mode 100644
> index 0000000..b2b70f4
> --- /dev/null
> +++ b/gas/testsuite/gas/mach-o/empty.s
> @@ -0,0 +1,2 @@
> +# nothing here
> +
> diff --git a/gas/testsuite/gas/mach-o/mach-o.exp b/gas/testsuite/gas/mach-o/mach-o.exp
> index 5fcd22d..5ea7f7c 100644
> --- a/gas/testsuite/gas/mach-o/mach-o.exp
> +++ b/gas/testsuite/gas/mach-o/mach-o.exp
> @@ -6,9 +6,10 @@
> 
> if {[istarget "*-*-*darwin*"]} then {
> 
> -    run_dump_test "lcomm-1"
> -
> load_lib gas-dg.exp
> +
> +run_dump_tests [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
> +
> dg-init
> 
> dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/err-*.s $srcdir/$subdir/warn-*.s]] "" ""
> diff --git a/gas/testsuite/gas/mach-o/subsect-via-symbols-0.d b/gas/testsuite/gas/mach-o/subsect-via-symbols-0.d
> new file mode 100644
> index 0000000..a5246bc
> --- /dev/null
> +++ b/gas/testsuite/gas/mach-o/subsect-via-symbols-0.d
> @@ -0,0 +1,6 @@
> +#objdump: -p
> +#source: empty.s
> +.*: +file format mach-o.*
> +#...
> +.*flags +: 00000000 \(-\)
> +#pass
> diff --git a/gas/testsuite/gas/mach-o/subsect-via-symbols-1.d b/gas/testsuite/gas/mach-o/subsect-via-symbols-1.d
> new file mode 100644
> index 0000000..d90cca1
> --- /dev/null
> +++ b/gas/testsuite/gas/mach-o/subsect-via-symbols-1.d
> @@ -0,0 +1,6 @@
> +#objdump: -p
> +#source: subsect-via-symbols.s
> +.*: +file format mach-o.*
> +#...
> +.*flags +: 00002000 \(subsections_via_symbols\)
> +#pass
> diff --git a/gas/testsuite/gas/mach-o/subsect-via-symbols.s b/gas/testsuite/gas/mach-o/subsect-via-symbols.s
> new file mode 100644
> index 0000000..b244150
> --- /dev/null
> +++ b/gas/testsuite/gas/mach-o/subsect-via-symbols.s
> @@ -0,0 +1,3 @@
> +# just set subsections by symbols
> +	.subsections_via_symbols
> +
> 


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