Ping: [Patch] Add Mach-O support for gas

Tristan Gingold gingold@adacore.com
Wed Jul 1 10:54:00 GMT 2009


Ping, just in case.

On Jun 25, 2009, at 5:40 PM, Tristan Gingold wrote:

> 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}
> + };
>



More information about the Binutils mailing list