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]

[Patch] Add Mach-O support for gas


Hi,

this small patch enable gas for i386-darwin.  This gas is barely useable but
enough in good state to have only one regression (which looks to be an error
in the baseline).
The purpose of this patch is to increase the testsuite for Mach-O.  In the
future I plan to add the features needed (specific pseudo ops, better handling
of relocations, quoted symbols ...) so that gas would be usable by gcc.

Tristan.


2009-06-25  Tristan Gingold  <gingold@adacore.com>

	* configure.ac: Do not exclude gas for i386-*-darwin.
	Add a case for x86_64-*-darwin.
	* configure: Regenerate.

gas/
2009-06-25  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.

RCS file: /cvs/src/src/configure.ac,v
retrieving revision 1.66
diff -c -p -r1.66 configure.ac
*** configure.ac	15 Jun 2009 14:08:41 -0000	1.66
--- configure.ac	25 Jun 2009 15:28:35 -0000
*************** case "${target}" in
*** 450,456 ****
      noconfigdirs="$noconfigdirs ld gas gdb gprof"
      noconfigdirs="$noconfigdirs sim target-rda"
      ;;
!   i[[3456789]]86-*-darwin* | x86_64-*-darwin9*)
      noconfigdirs="$noconfigdirs ld gas gprof"
      noconfigdirs="$noconfigdirs sim target-rda"
      ;;
--- 450,460 ----
      noconfigdirs="$noconfigdirs ld gas gdb gprof"
      noconfigdirs="$noconfigdirs sim target-rda"
      ;;
!   i[[3456789]]86-*-darwin*)
!     noconfigdirs="$noconfigdirs ld gprof"
!     noconfigdirs="$noconfigdirs sim target-rda"
!     ;;
!   x86_64-*-darwin9*)
      noconfigdirs="$noconfigdirs ld gas gprof"
      noconfigdirs="$noconfigdirs sim target-rda"
      ;;

Index: gas/Makefile.am
===================================================================
RCS file: /cvs/src/src/gas/Makefile.am,v
retrieving revision 1.171
diff -c -p -r1.171 Makefile.am
*** gas/Makefile.am	4 Jun 2009 06:57:12 -0000	1.171
--- gas/Makefile.am	25 Jun 2009 15:28:40 -0000
*************** OBJ_FORMATS = \
*** 109,115 ****
  	coff \
  	ecoff \
  	elf \
! 	evax
  
  # 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
--- 109,116 ----
  	coff \
  	ecoff \
  	elf \
! 	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
*************** CPU_OBJ_VALID = \
*** 142,147 ****
--- 143,152 ----
  	  case $$c in \
  	  alpha) valid=yes ;; \
  	  esac ;; \
+ 	macho) \
+ 	  case $$c in \
+ 	  i386) valid=yes ;; \
+ 	  esac ;; \
  	vms) \
  	  case $$c in \
  	  vax) valid=yes ;; \
*************** OBJ_FORMAT_CFILES = \
*** 368,373 ****
--- 373,379 ----
  	config/obj-elf.c \
  	config/obj-evax.c \
  	config/obj-fdpicelf.c \
+ 	config/obj-macho.c \
  	config/obj-som.c
  
  OBJ_FORMAT_HFILES = \
*************** OBJ_FORMAT_HFILES = \
*** 377,382 ****
--- 383,389 ----
  	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
*************** obj-evax.o : $(srcdir)/config/obj-evax.c
*** 594,599 ****
--- 601,608 ----
  	$(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: gas/configure.tgt
===================================================================
RCS file: /cvs/src/src/gas/configure.tgt,v
retrieving revision 1.49
diff -c -p -r1.49 configure.tgt
*** gas/configure.tgt	18 Jun 2009 02:11:03 -0000	1.49
--- gas/configure.tgt	25 Jun 2009 15:28:44 -0000
*************** case ${generic_target} in
*** 233,238 ****
--- 233,239 ----
    i386-*-*nt*)				fmt=coff em=pe ;;
    i386-*-chaos)				fmt=elf ;;
    i386-*-rdos*)				fmt=elf ;;
+   i386-*-darwin*)			fmt=macho ;;
  
    i860-*-*)				fmt=elf endian=little ;;
  
Index: gas/config/tc-i386.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-i386.c,v
retrieving revision 1.378
diff -c -p -r1.378 tc-i386.c
*** gas/config/tc-i386.c	22 Jun 2009 17:56:01 -0000	1.378
--- gas/config/tc-i386.c	25 Jun 2009 15:28:44 -0000
*************** md_show_usage (stream)
*** 7880,7886 ****
  
  #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
       || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
!      || defined (TE_PE) || defined (TE_PEP))
  
  /* Pick the target format to use.  */
  
--- 7884,7890 ----
  
  #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
       || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
!      || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
  
  /* Pick the target format to use.  */
  
*************** i386_target_format (void)
*** 7960,7965 ****
--- 7964,7973 ----
  	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: gas/config/tc-i386.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-i386.h,v
retrieving revision 1.105
diff -c -p -r1.105 tc-i386.h
*** gas/config/tc-i386.h	14 Jun 2009 01:39:46 -0000	1.105
--- gas/config/tc-i386.h	25 Jun 2009 15:28:44 -0000
*************** extern unsigned long i386_mach (void);
*** 72,78 ****
  
  #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
       || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
!      || defined (TE_PE) || defined (TE_PEP))
  extern const char *i386_target_format (void);
  #define TARGET_FORMAT i386_target_format ()
  #else
--- 72,78 ----
  
  #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
       || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
!      || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
  extern const char *i386_target_format (void);
  #define TARGET_FORMAT i386_target_format ()
  #else
*** /dev/null	Thu Jun 25 17:13:55 2009
--- gas/config/obj-macho.h	Thu Jun 25 16:40:52 2009
***************
*** 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
*** /dev/null	Thu Jun 25 17:13:55 2009
--- gas/config/obj-macho.c	Thu Jun 25 16:40:20 2009
***************
*** 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}
+ };


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