2009-07-02 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Thu, 2 Jul 2009 08:09:35 +0000 (08:09 +0000)
committerTristan Gingold <gingold@adacore.com>
Thu, 2 Jul 2009 08:09:35 +0000 (08:09 +0000)
* 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
gas/Makefile.am
gas/Makefile.in
gas/config/obj-macho.c [new file with mode: 0644]
gas/config/obj-macho.h [new file with mode: 0644]
gas/config/tc-i386.c
gas/config/tc-i386.h
gas/configure.tgt

index 58697d6..3a2f457 100644 (file)
@@ -1,3 +1,18 @@
+2009-07-02  Tristan Gingold  <gingold@adacore.com>
+
+       * 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  <nickc@redhat.com>
 
        PR 10168
index 0b66f41..8e8c8cc 100644 (file)
@@ -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
index db5ab0d..6e314d9 100644 (file)
@@ -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 (file)
index 0000000..ee19c4a
--- /dev/null
@@ -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 (file)
index 0000000..d7e9bda
--- /dev/null
@@ -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
index ce5f7ae..1a15d1d 100644 (file)
@@ -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;
index b4809f7..33275bd 100644 (file)
@@ -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
index 1991072..da0cb1d 100644 (file)
@@ -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 ;;