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

Iain Sandoe developer@sandoe-acoustics.co.uk
Tue Dec 13 11:56:00 GMT 2011


rebased and adjusted to use objdump -P header for the tests.

On 12 Dec 2011, at 08:51, Tristan Gingold wrote:
> 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]

now relative to :
http://sourceware.org/ml/binutils/2011-12/msg00163.html

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


>>
>> 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/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/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 ++
  7 files changed, 63 insertions(+), 6 deletions(-)

diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c
index 5e12f84..68a6f19 100644
--- a/bfd/mach-o-target.c
+++ b/bfd/mach-o-target.c
@@ -48,7 +48,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 0a614c3..db60c85 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -362,6 +362,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 d85224e..9560290 100644
--- a/bfd/mach-o.h
+++ b/bfd/mach-o.h
@@ -561,6 +561,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/subsect-via-symbols-0.d b/gas/ 
testsuite/gas/mach-o/subsect-via-symbols-0.d
new file mode 100644
index 0000000..4dd2739
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/subsect-via-symbols-0.d
@@ -0,0 +1,6 @@
+#objdump: -P header
+#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..163a9c2
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/subsect-via-symbols-1.d
@@ -0,0 +1,6 @@
+#objdump: -P header
+#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
+



More information about the Binutils mailing list