From 0c9ef0f001e727226aae6a0dd3963dd81998e2e8 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Thu, 15 Dec 2011 10:56:48 +0000 Subject: [PATCH] bfd/ 2011-12-15 Iain Sandoe * 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/ 2011-12-15 Iain Sandoe * config/obj-macho.c (obj_mach_o_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/ 2011-12-15 Iain Sandoe * 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/ChangeLog | 7 ++++ bfd/mach-o-target.c | 2 +- bfd/mach-o.c | 16 ++++++++ bfd/mach-o.h | 1 + gas/ChangeLog | 7 ++++ gas/config/obj-macho.c | 37 ++++++++++++++++--- gas/testsuite/ChangeLog | 6 +++ .../gas/mach-o/subsect-via-symbols-0.d | 6 +++ .../gas/mach-o/subsect-via-symbols-1.d | 6 +++ .../gas/mach-o/subsect-via-symbols.s | 3 ++ 10 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 gas/testsuite/gas/mach-o/subsect-via-symbols-0.d create mode 100644 gas/testsuite/gas/mach-o/subsect-via-symbols-1.d create mode 100644 gas/testsuite/gas/mach-o/subsect-via-symbols.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9e995a1f72..e1cd2baa3d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2011-12-15 Iain Sandoe + + * 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. + 2011-12-14 Nick Clifton PR ld/12451 diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c index 4d5690e28a..c91584c707 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 c768689fda..0c2c2f77e6 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 0c6f4fd01c..e22b41a602 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/ChangeLog b/gas/ChangeLog index b7a9a87cfa..2a996c24f8 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2011-12-15 Iain Sandoe + + * config/obj-macho.c (obj_mach_o_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. + 2011-12-14 Stuart Henderson * config/bfin-parse.y (asm_1): set SRCx fields to all 1s for diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c index 018f6537af..7f147e357d 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/ChangeLog b/gas/testsuite/ChangeLog index 5fa4335265..c9efc902f0 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-12-15 Iain Sandoe + + * 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. + 2011-12-15 Nick Clifton * gas/frv/immediates.s: New test file - checks assembly of 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 0000000000..4dd2739b28 --- /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 0000000000..163a9c2c59 --- /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 0000000000..b2441503d0 --- /dev/null +++ b/gas/testsuite/gas/mach-o/subsect-via-symbols.s @@ -0,0 +1,3 @@ +# just set subsections by symbols + .subsections_via_symbols +