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]

[mips] ABI shouldn't depend on ISA


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
 
 /*
  * 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
-- 
Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer                 aoliva at {redhat dot com, gcc.gnu.org}
CS PhD student at IC-Unicamp        oliva at {lsd dot ic dot unicamp dot br, gnu.org}
Free Software Evangelist                Professional serial bug killer

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