This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc 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]

Re: [mips] ABI shouldn't depend on ISA


Alexandre Oliva <aoliva at redhat dot com> writes:

> Some data structures used by o32 used to change depending on the ISA
> in use.  This Shouldn't Happen (TM).  The assumption was that o32
> could only be built for MIPS1 and MIPS2, but this no longer holds
> (even if you extend the set to MIPS32).  It is now possible to compile
> for o32 targeting any MIPS architecture, regardless of its being 32-
> or 64-bits, even though you won't be able to take advantage of most of
> the 64-bit opcodes in o32 land, since o32 uses only 32-bits per
> register.
>
> This patch adds support for MIPS32 and MIPS64 ISAs, and fixes some
> code, that used to depend on the ISA or other macros, to depend on ABI
> properties instead, where this change is appropriate.  Ok?
>
>
> Index: ChangeLog
> from  Alexandre Oliva  <aoliva at redhat dot com>
>
> 	* sysdeps/mips/sgidefs.h (_MIPS_ISA_MIPS32, _MIPS_ISA_MIPS64):
> 	Define.
> 	* sysdeps/mips/sys/asm.h: Test _MIPS_ISA against them on all
> 	ISA tests.
> 	(ALSZ, ALMASK, SZREG, REG_S, REG_L): Define based on ABI, not ISA.
> 	(PTR_ADD, etc): Test _MIPS_SZPTR instead of _MIPS_SZLONG.
> 	* sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Use _MIPS_SZPTR
> 	to decide whether to add padding.
> 	* sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Use _MIPS_SZPTR
> 	to decide whether to add padding.
> 	* sysdeps/unix/sysv/linux/mips/kernel_sigaction.h (struct
> 	old_kernel_sigaction): Likewise.
>
> Index: sysdeps/mips/sgidefs.h
> ===================================================================
> RCS file: /cvs/glibc/libc/sysdeps/mips/sgidefs.h,v
> retrieving revision 1.2
> diff -u -p -r1.2 sgidefs.h
> --- sysdeps/mips/sgidefs.h 6 Jul 2001 04:56:00 -0000 1.2
> +++ sysdeps/mips/sgidefs.h 25 Mar 2003 05:53:54 -0000
> @@ -1,4 +1,4 @@
> -/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
> +/* Copyright (C) 1996, 1997, 1998, 2003 Free Software Foundation, Inc.
>     This file is part of the GNU C Library.
>     Contributed by Ralf Baechle <ralf at gnu dot org>.
>  
> @@ -28,6 +28,8 @@
>  #define _MIPS_ISA_MIPS3 3
>  #define _MIPS_ISA_MIPS4 4
>  #define _MIPS_ISA_MIPS5 5
> +#define _MIPS_ISA_MIPS32 6
> +#define _MIPS_ISA_MIPS64 7

I know there weren't comments before for this but can you add them
nevertheless?

Ok with that change,

Andreas

>  /*
>   * Subprogram calling convention
> Index: sysdeps/mips/sys/asm.h
> ===================================================================
> RCS file: /cvs/glibc/libc/sysdeps/mips/sys/asm.h,v
> retrieving revision 1.3
> diff -u -p -r1.3 asm.h
> --- sysdeps/mips/sys/asm.h 14 Mar 2003 11:06:32 -0000 1.3
> +++ sysdeps/mips/sys/asm.h 25 Mar 2003 05:53:54 -0000
> @@ -230,7 +230,8 @@ symbol		=	value
>   * MIPS IV implementations are free to treat this as a nop.  The R5000
>   * is one of them.  So we should have an option not to use this instruction.
>   */
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5)
> +#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
> +    (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
>  # define PREF(hint,addr)                                 \
>  		pref	hint,addr
>  # define PREFX(hint,addr)                                \
> @@ -275,7 +276,8 @@ symbol		=	value
>  		.set	pop;				\
>  9:
>  #endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5)
> +#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) || \
> +    (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
>  # define MOVN(rd,rs,rt)					\
>  		movn	rd,rs,rt
>  # define MOVZ(rd,rs,rt)					\
> @@ -285,20 +287,18 @@ symbol		=	value
>  /*
>   * Stack alignment
>   */
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
> -# define ALSZ	7
> -# define ALMASK	~7
> -#endif
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
> -    (_MIPS_ISA == _MIPS_ISA_MIPS5)
> +#if (_MIPS_SIM == _MIPS_SIM_ABI64) || (_MIPS_SIM == _MIPS_SIM_NABI32)
>  # define ALSZ	15
>  # define ALMASK	~15
> +#else
> +# define ALSZ	7
> +# define ALMASK	~7
>  #endif
>  
>  /*
>   * Size of a register
>   */
> -#ifdef __mips64
> +#if (_MIPS_SIM == _MIPS_SIM_ABI64) || (_MIPS_SIM == _MIPS_SIM_NABI32)
>  # define SZREG	8
>  #else
>  # define SZREG	4
> @@ -308,7 +308,7 @@ symbol		=	value
>   * Use the following macros in assemblercode to load/store registers,
>   * pointers etc.
>   */
> -#if (_MIPS_SIM == _MIPS_SIM_ABI32)
> +#if (SZREG == 4)
>  # define REG_S sw
>  # define REG_L lw
>  #else
> @@ -389,7 +389,7 @@ symbol		=	value
>  /*
>   * How to add/sub/load/store/shift pointers.
>   */
> -#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZLONG == 32)
> +#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32)
>  # define PTR_ADD	add
>  # define PTR_ADDI	addi
>  # define PTR_ADDU	addu
> @@ -433,7 +433,7 @@ symbol		=	value
>  # define PTR_SCALESHIFT	2
>  #endif
>  
> -#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZLONG == 64) \
> +#if (_MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 64 /* o64??? */) \
>      || _MIPS_SIM == _MIPS_SIM_ABI64
>  # define PTR_ADD	dadd
>  # define PTR_ADDI	daddi
> @@ -459,12 +459,13 @@ symbol		=	value
>  /*
>   * Some cp0 registers were extended to 64bit for MIPS III.
>   */
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
> +#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) || \
> +    (_MIPS_ISA == _MIPS_ISA_MIPS32)
>  # define MFC0	mfc0
>  # define MTC0	mtc0
>  #endif
>  #if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \
> -    (_MIPS_ISA == _MIPS_ISA_MIPS5)
> +    (_MIPS_ISA == _MIPS_ISA_MIPS5) || (_MIPS_ISA == _MIPS_ISA_MIPS64)
>  # define MFC0	dmfc0
>  # define MTC0	dmtc0
>  #endif
> Index: sysdeps/unix/sysv/linux/mips/bits/sigaction.h
> ===================================================================
> RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/bits/sigaction.h,v
> retrieving revision 1.11
> diff -u -p -r1.11 sigaction.h
> --- sysdeps/unix/sysv/linux/mips/bits/sigaction.h 6 Jul 2001 04:56:18 -0000 1.11
> +++ sysdeps/unix/sysv/linux/mips/bits/sigaction.h 25 Mar 2003 05:53:54 -0000
> @@ -1,5 +1,6 @@
>  /* The proper definitions for Linux/MIPS's sigaction.
> -   Copyright (C) 1993,94,95,97,98,99,2000 Free Software Foundation, Inc.
> +   Copyright (C) 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2003
> +	Free Software Foundation, Inc.
>     This file is part of the GNU C Library.
>  
>     The GNU C Library is free software; you can redistribute it and/or
> @@ -49,7 +50,7 @@ struct sigaction
>      /* Restore handler.  */
>      void (*sa_restorer) (void);
>  
> -#if _MIPS_ISA == _MIPS_ISA_MIPS1 || _MIPS_ISA == _MIPS_ISA_MIPS2
> +#if _MIPS_SZPTR < 64
>      int sa_resv[1];
>  #endif
>    };
> Index: sysdeps/unix/sysv/linux/mips/kernel_sigaction.h
> ===================================================================
> RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/kernel_sigaction.h,v
> retrieving revision 1.5
> diff -u -p -r1.5 kernel_sigaction.h
> --- sysdeps/unix/sysv/linux/mips/kernel_sigaction.h 14 Mar 2003 07:49:05 -0000 1.5
> +++ sysdeps/unix/sysv/linux/mips/kernel_sigaction.h 25 Mar 2003 05:53:54 -0000
> @@ -12,7 +12,7 @@ struct old_kernel_sigaction {
>  
>  	/* Abi says here follows reserved int[2] */
>  	void		(*sa_restorer)(void);
> -#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
> +#if (_MIPS_SZPTR < 64)
>  	/*
>  	 * For 32 bit code we have to pad struct sigaction to get
>  	 * constant size for the ABI

Andreas
-- 
 Andreas Jaeger
  SuSE Labs aj at suse dot de
   private aj at arthur dot inka dot de
    http://www.suse.de/~aj


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