This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[Patch mach-o/gas] implement private file flags/subsections-via-symbols.
- From: Iain Sandoe <developer at sandoe-acoustics dot co dot uk>
- To: binutils at sourceware dot org
- Cc: Tristan Gingold <gingold at adacore dot com>
- Date: Sun, 11 Dec 2011 16:03:28 +0000
- Subject: [Patch mach-o/gas] implement private file flags/subsections-via-symbols.
(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
[tests patch relative to the base test suite entry previously posted]
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
+