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: Rebased: [Patch mach-o/gas] implement private file flags/subsections-via-symbols.



On 14 Dec 2011, at 15:24, Tristan Gingold wrote:



On Dec 13, 2011, at 12:55 PM, Iain Sandoe wrote:


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

Iain,


I was about to commit this one when I found two minors points to improve. See comments below.

+
+typedef enum obj_mach_o_file_properties {
+  OBJ_MACH_O_FILE_PROP_NONE = 0,
+  OBJ_MACH_O_FILE_PROP_SSBS,

Honestly, SSBS is not very readable. I am not able to find the origin of this acronym. Why not simply _PROP_SUBSECTIONS ?

concise and readable are always tricky - can we compromise on : OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS


I am concerned that someone readin g the code might get mixed up between this property and the subsections (which we don't use).

... if you have an alternative - then just go ahead with that - in the end the functionality is what matters ;-)

thanks again,
Iain



bfd/mach-o-target.c | 2 +-
bfd/mach-o.c | 16 +++++++++
bfd/mach-o.h | 1 +
gas/config/obj-macho.c | 37 +++++++++++++ ++++++---
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, 65 insertions(+), 6 deletions(-)


diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c
index 4d5690e..c91584c 100644
--- a/bfd/mach-o-target.c
+++ b/bfd/mach-o-target.c
@@ -46,7 +46,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 c768689..0c2c2f7 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -576,6 +576,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 0c6f4fd..e22b41a 100644
--- a/bfd/mach-o.h
+++ b/bfd/mach-o.h
@@ -555,6 +555,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 018f653..7f147e3 100644
--- a/gas/config/obj-macho.c
+++ b/gas/config/obj-macho.c
@@ -53,6 +53,10 @@ static int obj_mach_o_is_static;


static int seen_objc_section;

+/* Remember the subsections_by_symbols state in case we need to reset
+   the file flags.  */
+static int obj_mach_o_subsections_by_symbols;
+
 static void
 obj_mach_o_weak (int ignore ATTRIBUTE_UNUSED)
 {
@@ -674,11 +678,33 @@ obj_mach_o_comm (int is_local)
   s_comm_internal (is_local, 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_SUBSECTS_VIA_SYMS,
+  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_SUBSECTS_VIA_SYMS:
+        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;
+    }
 }

 /* Dummy function to allow test-code to work while we are working
@@ -776,7 +802,8 @@ const pseudo_typeS mach_o_pseudo_table[] =
   { "weak", obj_mach_o_weak, 0},   /* extension */

   /* File flags.  */
-  { "subsections_via_symbols", obj_mach_o_subsections_via_symbols, 0 },
+  { "subsections_via_symbols", obj_mach_o_fileprop,
+			       OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS},

{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
+



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