From e57f8c655cb90b3b73e5906ada99ab72c83f95af Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Thu, 2 Jul 2009 08:09:35 +0000 Subject: [PATCH] 2009-07-02 Tristan Gingold * Makefile.am (OBJ_FORMATS): Add macho. (CPU_OBJ_VALID): Ditto. (OBJ_FORMAT_CFILES): Add config/obj-macho.c (OBJ_FORMAT_HFILES): Add config/obj-macho.h (obj-macho.o): New rule. * Makefile.in: Regenerated. * configure.tgt (generic_target): Add i386-*-darwin*. * config/tc-i386.h: Use i386_target_format for Mach-O. * config/tc-i386.c (i386_target_format): Define it for Mach-O. (i386_target_format): Add a case for bfd_target_mach_o_flavour. * config/obj-macho.h: New file. * config/obj-macho.c: New file. --- gas/ChangeLog | 15 +++++++++++++ gas/Makefile.am | 11 +++++++++- gas/Makefile.in | 11 +++++++++- gas/config/obj-macho.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ gas/config/obj-macho.h | 39 ++++++++++++++++++++++++++++++++++ gas/config/tc-i386.c | 6 +++++- gas/config/tc-i386.h | 2 +- gas/configure.tgt | 1 + 8 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 gas/config/obj-macho.c create mode 100644 gas/config/obj-macho.h diff --git a/gas/ChangeLog b/gas/ChangeLog index 58697d6..3a2f457 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2009-07-02 Tristan Gingold + + * Makefile.am (OBJ_FORMATS): Add macho. + (CPU_OBJ_VALID): Ditto. + (OBJ_FORMAT_CFILES): Add config/obj-macho.c + (OBJ_FORMAT_HFILES): Add config/obj-macho.h + (obj-macho.o): New rule. + * Makefile.in: Regenerated. + * configure.tgt (generic_target): Add i386-*-darwin*. + * config/tc-i386.h: Use i386_target_format for Mach-O. + * config/tc-i386.c (i386_target_format): Define it for Mach-O. + (i386_target_format): Add a case for bfd_target_mach_o_flavour. + * config/obj-macho.h: New file. + * config/obj-macho.c: New file. + 2009-07-01 Nick Clifton PR 10168 diff --git a/gas/Makefile.am b/gas/Makefile.am index 0b66f41..8e8c8cc 100644 --- a/gas/Makefile.am +++ b/gas/Makefile.am @@ -109,7 +109,8 @@ OBJ_FORMATS = \ coff \ ecoff \ elf \ - evax + evax \ + macho # This is an sh case which sets valid according to whether the CPU # type in the shell variable c and the OS type in the shell variable o @@ -142,6 +143,10 @@ CPU_OBJ_VALID = \ case $$c in \ alpha) valid=yes ;; \ esac ;; \ + macho) \ + case $$c in \ + i386) valid=yes ;; \ + esac ;; \ vms) \ case $$c in \ vax) valid=yes ;; \ @@ -368,6 +373,7 @@ OBJ_FORMAT_CFILES = \ config/obj-elf.c \ config/obj-evax.c \ config/obj-fdpicelf.c \ + config/obj-macho.c \ config/obj-som.c OBJ_FORMAT_HFILES = \ @@ -377,6 +383,7 @@ OBJ_FORMAT_HFILES = \ config/obj-elf.h \ config/obj-evax.h \ config/obj-fdpicelf.h \ + config/obj-macho.h \ config/obj-som.h # Emulation header files in config @@ -594,6 +601,8 @@ obj-evax.o : $(srcdir)/config/obj-evax.c $(COMPILE) -c $(srcdir)/config/obj-evax.c obj-fdpicelf.o : $(srcdir)/config/obj-fdpicelf.c $(COMPILE) -c $(srcdir)/config/obj-fdpicelf.c +obj-macho.o : $(srcdir)/config/obj-macho.c + $(COMPILE) -c $(srcdir)/config/obj-macho.c obj-multi.o : $(srcdir)/config/obj-multi.c $(COMPILE) -c $(srcdir)/config/obj-multi.c obj-som.o : $(srcdir)/config/obj-som.c diff --git a/gas/Makefile.in b/gas/Makefile.in index db5ab0d..6e314d9 100644 --- a/gas/Makefile.in +++ b/gas/Makefile.in @@ -372,7 +372,8 @@ OBJ_FORMATS = \ coff \ ecoff \ elf \ - evax + evax \ + macho # This is an sh case which sets valid according to whether the CPU @@ -405,6 +406,10 @@ CPU_OBJ_VALID = \ case $$c in \ alpha) valid=yes ;; \ esac ;; \ + macho) \ + case $$c in \ + i386) valid=yes ;; \ + esac ;; \ vms) \ case $$c in \ vax) valid=yes ;; \ @@ -629,6 +634,7 @@ OBJ_FORMAT_CFILES = \ config/obj-elf.c \ config/obj-evax.c \ config/obj-fdpicelf.c \ + config/obj-macho.c \ config/obj-som.c OBJ_FORMAT_HFILES = \ @@ -638,6 +644,7 @@ OBJ_FORMAT_HFILES = \ config/obj-elf.h \ config/obj-evax.h \ config/obj-fdpicelf.h \ + config/obj-macho.h \ config/obj-som.h @@ -4680,6 +4687,8 @@ obj-evax.o : $(srcdir)/config/obj-evax.c $(COMPILE) -c $(srcdir)/config/obj-evax.c obj-fdpicelf.o : $(srcdir)/config/obj-fdpicelf.c $(COMPILE) -c $(srcdir)/config/obj-fdpicelf.c +obj-macho.o : $(srcdir)/config/obj-macho.c + $(COMPILE) -c $(srcdir)/config/obj-macho.c obj-multi.o : $(srcdir)/config/obj-multi.c $(COMPILE) -c $(srcdir)/config/obj-multi.c obj-som.o : $(srcdir)/config/obj-som.c diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c new file mode 100644 index 0000000..ee19c4a --- /dev/null +++ b/gas/config/obj-macho.c @@ -0,0 +1,57 @@ +/* Mach-O object file format + Copyright 2009 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + + GAS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GAS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#define OBJ_HEADER "obj-macho.h" + +#include "as.h" +#include "mach-o.h" + +static void +obj_mach_o_weak (int ignore ATTRIBUTE_UNUSED) +{ + char *name; + int c; + symbolS *symbolP; + + do + { + /* Get symbol name. */ + name = input_line_pointer; + c = get_symbol_end (); + symbolP = symbol_find_or_make (name); + S_SET_WEAK (symbolP); + *input_line_pointer = c; + SKIP_WHITESPACE (); + + if (c != ',') + break; + input_line_pointer++; + SKIP_WHITESPACE (); + } + while (*input_line_pointer != '\n'); + demand_empty_rest_of_line (); +} + +const pseudo_typeS mach_o_pseudo_table[] = +{ + {"weak", obj_mach_o_weak, 0}, + + {NULL, NULL, 0} +}; diff --git a/gas/config/obj-macho.h b/gas/config/obj-macho.h new file mode 100644 index 0000000..d7e9bda --- /dev/null +++ b/gas/config/obj-macho.h @@ -0,0 +1,39 @@ +/* Mach-O object file format for gas, the assembler. + Copyright 2009 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + + GAS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GAS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* Tag to validate Mach-O object file format processing */ +#define OBJ_MACH_O 1 + +#include "targ-cpu.h" + +#define OUTPUT_FLAVOR bfd_target_mach_o_flavour + +extern const pseudo_typeS mach_o_pseudo_table[]; + +#ifndef obj_pop_insert +#define obj_pop_insert() pop_insert (mach_o_pseudo_table) +#endif + +#define obj_sec_sym_ok_for_reloc(SEC) 1 + +#define obj_read_begin_hook() {;} +#define obj_symbol_new_hook(s) {;} + +#define EMIT_SECTION_SYMBOLS 0 diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index ce5f7ae..1a15d1d 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -7881,7 +7881,7 @@ md_show_usage (stream) #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \ || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \ - || defined (TE_PE) || defined (TE_PEP)) + || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O)) /* Pick the target format to use. */ @@ -7961,6 +7961,10 @@ i386_target_format (void) return flag_code == CODE_64BIT ? ELF_TARGET_FORMAT64 : ELF_TARGET_FORMAT; } #endif +#if defined (OBJ_MACH_O) + case bfd_target_mach_o_flavour: + return flag_code == CODE_64BIT ? "mach-o-x86-64" : "mach-o-i386"; +#endif default: abort (); return NULL; diff --git a/gas/config/tc-i386.h b/gas/config/tc-i386.h index b4809f7..33275bd 100644 --- a/gas/config/tc-i386.h +++ b/gas/config/tc-i386.h @@ -72,7 +72,7 @@ extern unsigned long i386_mach (void); #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \ || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \ - || defined (TE_PE) || defined (TE_PEP)) + || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O)) extern const char *i386_target_format (void); #define TARGET_FORMAT i386_target_format () #else diff --git a/gas/configure.tgt b/gas/configure.tgt index 1991072..da0cb1d 100644 --- a/gas/configure.tgt +++ b/gas/configure.tgt @@ -233,6 +233,7 @@ case ${generic_target} in i386-*-*nt*) fmt=coff em=pe ;; i386-*-chaos) fmt=elf ;; i386-*-rdos*) fmt=elf ;; + i386-*-darwin*) fmt=macho ;; i860-*-*) fmt=elf endian=little ;; -- 2.7.4