This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

NetWare adjustments


Some adjustments are necessary to the NetWare specific code and to a few
of the test cases.

Built and tested for i686-novell-netware on i686-pc-linux-gnu.

I'd like to also apply this against the 4.0 branch, as that otherwise isn't
fully usable for the NetWare target.

Jan

gcc/
2005-05-20  Jan Beulich  <jbeulich@novell.com>

	* config/i386/netware-libgcc.def: Update copyright.
	* config/i386/netware-libgcc.exp (__divdc3, __divsc3, __divxc3,
	__muldc3, __mulsc3, __mulxc3, __powidf2, __powisf2, __powixf2): Add.
	* config/i386/netware.c (gen_stdcall_decoration,
	gen_fastd_decoration): Merge into ...
	(gen_stdcall_or_fastcall_decoration): ... this. Adjust to match
	WinNT's changes.
	(gen_regparm_prefix): Adjust to match i386_nlm_encode_section_info.
	(i386_nlm_encode_section_info): Adjust to match WinNT's changes.
	* config/i386/t-nwld (SHLIB_LINK): Also create libgcc.imp alias of
	libgcc_s.imp.

gcc/testsuite/
2005-05-20  Jan Beulich  <jbeulich@novell.com>

	* g++.old-deja/g++.jason/thunk2.C: On NetWare, also account for
	unsupportable relocations.
	* g++.old-deja/g++.other/store-expr1.C: Likewise.
	* gcc.dg/20050321-2.c: xfail for NetWare.

--- /home/jbeulich/src/gcc/mainline/2005-05-18/gcc/config/i386/netware-libgcc.def	2004-09-03 20:09:26.000000000 +0200
+++ 2005-05-18/gcc/config/i386/netware-libgcc.def	2005-05-12 13:45:09.000000000 +0200
@@ -1,2 +1,2 @@
 description "gcc runtime and intrinsics support"
-copyright "Copyright (C) 1989-2004  Free Software Foundation, Inc."
+copyright "Copyright (C) 1989-2005  Free Software Foundation, Inc."
--- /home/jbeulich/src/gcc/mainline/2005-05-18/gcc/config/i386/netware-libgcc.exp	2004-09-03 20:09:26.000000000 +0200
+++ 2005-05-18/gcc/config/i386/netware-libgcc.exp	2005-05-10 14:09:09.000000000 +0200
@@ -13,7 +13,11 @@
 	__deregister_frame,
 	__deregister_frame_info,
 	__deregister_frame_info_bases,
+	__divdc3,
 #	__divdi3,
+	__divsc3,
+#	__divtc3,
+	__divxc3,
 	__ffsdi2,
 	__ffssi2,
 	__fixunsdfdi,
@@ -24,15 +28,23 @@
 	__gcc_personality_v0,
 #	__lshrdi3,
 #	__moddi3,
+	__muldc3,
 #	__muldi3,
+	__mulsc3,
+#	__multc3,
 	__mulvdi3,
 	__mulvsi3,
+	__mulxc3,
 	__negvdi2,
 	__negvsi2,
 	__paritydi2,
 	__paritysi2,
 	__popcountdi2,
 	__popcountsi2,
+	__powidf2
+	__powisf2
+#	__powitf2
+	__powixf2
 	__register_frame,
 	__register_frame_info,
 	__register_frame_info_bases,
--- /home/jbeulich/src/gcc/mainline/2005-05-18/gcc/config/i386/netware.c	2005-05-10 16:59:29.000000000 +0200
+++ 2005-05-18/gcc/config/i386/netware.c	2005-05-19 16:21:28.000000000 +0200
@@ -38,86 +38,55 @@ Boston, MA 02111-1307, USA.  */
    underscore prefix and a suffix consisting of an atsign (@) followed
    by the number of bytes of arguments */
 
-static const char *
-gen_stdcall_decoration (tree decl)
+static tree
+gen_stdcall_or_fastcall_decoration (tree decl, char prefix)
 {
   unsigned total = 0;
   /* ??? This probably should use XSTR (XEXP (DECL_RTL (decl), 0), 0) instead
      of DECL_ASSEMBLER_NAME.  */
   const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
   char *newsym;
+  tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl));
 
-  if (TYPE_ARG_TYPES (TREE_TYPE (decl)))
-    if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (decl))))
-        == void_type_node)
-      {
-	tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl));
-
-	/* Quit if we hit an incomplete type.  Error is reported
-	   by convert_arguments in c-typeck.c or cp/typeck.c.  */
-	while (TREE_VALUE (formal_type) != void_type_node
-	       && COMPLETE_TYPE_P (TREE_VALUE (formal_type)))	
-	  {
-	    unsigned parm_size
-	      = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type)));
-	    /* Must round up to include padding.  This is done the same
-	       way as in store_one_arg.  */
-	    parm_size = ((parm_size + PARM_BOUNDARY - 1)
-			 / PARM_BOUNDARY * PARM_BOUNDARY);
-	    total += parm_size;
-	    formal_type = TREE_CHAIN (formal_type);
-	  }
-      }
-
-  newsym = alloca (1 + strlen (asmname) + 1 + 10 + 1);
-  return IDENTIFIER_POINTER (get_identifier_with_length (newsym,
-	sprintf (newsym, "_%s@%u", asmname, total / BITS_PER_UNIT)));
-}
-
-/* Return string which is the former assembler name modified with a
-   prefix consisting of FASTCALL_PREFIX and a suffix consisting of an
-   atsign (@) followed by the number of bytes of arguments.  */
-
-static const char *
-gen_fastcall_decoration (tree decl)
-{
-  unsigned total = 0;
-  const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
-  char *newsym;
+  if (formal_type != NULL_TREE)
+    {
+      /* These attributes are ignored for variadic functions in
+	 i386.c:ix86_return_pops_args. For compatibility with MS
+	 compiler do not add @0 suffix here.  */ 
+      if (TREE_VALUE (tree_last (formal_type)) != void_type_node)
+	return NULL_TREE;
+
+      /* Quit if we hit an incomplete type.  Error is reported
+	 by convert_arguments in c-typeck.c or cp/typeck.c.  */
+      while (TREE_VALUE (formal_type) != void_type_node
+	     && COMPLETE_TYPE_P (TREE_VALUE (formal_type)))	
+	{
+	  unsigned parm_size
+	    = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type)));
 
-  if (TYPE_ARG_TYPES (TREE_TYPE (decl)))
-    if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (decl))))
-        == void_type_node)
-      {
-	tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl));
-
-	/* Quit if we hit an incomplete type.  Error is reported
-	   by convert_arguments in c-typeck.c or cp/typeck.c.  */
-	while (TREE_VALUE (formal_type) != void_type_node
-	       && COMPLETE_TYPE_P (TREE_VALUE (formal_type)))	
-	  {
-	    int parm_size
-	      = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type)));
-	    /* Must round up to include padding.  This is done the same
-	       way as in store_one_arg.  */
-	    parm_size = ((parm_size + PARM_BOUNDARY - 1)
-			 / PARM_BOUNDARY * PARM_BOUNDARY);
-	    total += parm_size;
-	    formal_type = TREE_CHAIN (formal_type);
-	  }
-      }
+	  /* Must round up to include padding.  This is done the same
+	     way as in store_one_arg.  */
+	  parm_size = ((parm_size + PARM_BOUNDARY - 1)
+		       / PARM_BOUNDARY * PARM_BOUNDARY);
+	  total += parm_size;
+	  formal_type = TREE_CHAIN (formal_type);
+	}
+    }
 
   newsym = alloca (1 + strlen (asmname) + 1 + 10 + 1);
-  return IDENTIFIER_POINTER (get_identifier_with_length (newsym,
-	sprintf (newsym, "%c%s@%d", FASTCALL_PREFIX, asmname,
-		 total / BITS_PER_UNIT)));
+  return get_identifier_with_length (newsym,
+				     sprintf (newsym,
+					      "%c%s@%u",
+					      prefix,
+					      asmname,
+					      total / BITS_PER_UNIT));
 }
 
 /* Return string which is the former assembler name modified with an 
    _n@ prefix where n represents the number of arguments passed in
    registers */
 
-static const char *
+static tree
 gen_regparm_prefix (tree decl, unsigned nregs)
 {
   unsigned total = 0;
@@ -125,35 +94,40 @@ gen_regparm_prefix (tree decl, unsigned 
      of DECL_ASSEMBLER_NAME.  */
   const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
   char *newsym;
+  tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl));
 
-  if (TYPE_ARG_TYPES (TREE_TYPE (decl)))
-    if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (decl))))
-        == void_type_node)
-      {
-	tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl));
-
-	/* Quit if we hit an incomplete type.  Error is reported
-	   by convert_arguments in c-typeck.c or cp/typeck.c.  */
-	while (TREE_VALUE (formal_type) != void_type_node
-	       && COMPLETE_TYPE_P (TREE_VALUE (formal_type)))	
-	  {
-	    unsigned parm_size
-	      = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type)));
-	    /* Must round up to include padding.  This is done the same
-	       way as in store_one_arg.  */
-	    parm_size = ((parm_size + PARM_BOUNDARY - 1)
-			 / PARM_BOUNDARY * PARM_BOUNDARY);
-	    total += parm_size;
-	    formal_type = TREE_CHAIN (formal_type);
-	  }
-      }
+  if (formal_type != NULL_TREE)
+    {
+      /* This attribute is ignored for variadic functions.  */ 
+      if (TREE_VALUE (tree_last (formal_type)) != void_type_node)
+	return NULL_TREE;
+
+      /* Quit if we hit an incomplete type.  Error is reported
+	 by convert_arguments in c-typeck.c or cp/typeck.c.  */
+      while (TREE_VALUE (formal_type) != void_type_node
+	     && COMPLETE_TYPE_P (TREE_VALUE (formal_type)))	
+	{
+	  unsigned parm_size
+	    = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type)));
+
+	  /* Must round up to include padding.  This is done the same
+	     way as in store_one_arg.  */
+	  parm_size = ((parm_size + PARM_BOUNDARY - 1)
+		       / PARM_BOUNDARY * PARM_BOUNDARY);
+	  total += parm_size;
+	  formal_type = TREE_CHAIN (formal_type);
+	}
+    }
 
   if (nregs > total / BITS_PER_WORD)
     nregs = total / BITS_PER_WORD;
   gcc_assert (nregs <= 9);
-  newsym = alloca (2 + strlen (asmname) + 1 + 1);
-  return IDENTIFIER_POINTER (get_identifier_with_length (newsym,
-	sprintf (newsym, "_%u@%s", nregs, asmname)));
+  newsym = alloca (3 + strlen (asmname) + 1);
+  return get_identifier_with_length (newsym,
+				     sprintf (newsym,
+					      "_%u@%s",
+					      nregs,
+					      asmname));
 }
 
 void
@@ -163,24 +137,31 @@ i386_nlm_encode_section_info (tree decl,
 
   if (first
       && TREE_CODE (decl) == FUNCTION_DECL
-      && *IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)) != '*')
+      && *IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)) != '*'
+      && !strchr (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), '@'))
     {
       tree type_attributes = TYPE_ATTRIBUTES (TREE_TYPE (decl));
-      rtx rtlname = XEXP (rtl, 0);
-      if (GET_CODE (rtlname) == MEM)
-	rtlname = XEXP (rtlname, 0);
+      tree newid;
+
       if (lookup_attribute ("stdcall", type_attributes))
-	XSTR (rtlname, 0) = gen_stdcall_decoration (decl);
+	newid = gen_stdcall_or_fastcall_decoration (decl, '_');
       else if (lookup_attribute ("fastcall", type_attributes))
-	XSTR (rtlname, 0) = gen_fastcall_decoration (decl);
-      else
+	newid = gen_stdcall_or_fastcall_decoration (decl, FASTCALL_PREFIX);
+      else if ((newid = lookup_attribute ("regparm", type_attributes)) != NULL_TREE)
+	newid = gen_regparm_prefix (decl,
+		      TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (newid))));
+      if (newid != NULL_TREE) 	
 	{
-	  tree attr = lookup_attribute ("regparm", type_attributes);
+	  rtx rtlname = XEXP (rtl, 0);
 
-	  if (attr)
-	    XSTR (rtlname, 0) =
-	      gen_regparm_prefix (decl,
-		      TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr))));
+	  if (GET_CODE (rtlname) == MEM)
+	    rtlname = XEXP (rtlname, 0);
+	  XSTR (rtlname, 0) = IDENTIFIER_POINTER (newid);
+	  /* These attributes must be present on first declaration,
+	     change_decl_assembler_name will warn if they are added
+	     later and the decl has been referenced, but duplicate_decls
+	     should catch the mismatch before this is called.  */ 
+	  change_decl_assembler_name (decl, newid);
 	}
     }
 }
--- /home/jbeulich/src/gcc/mainline/2005-05-18/gcc/config/i386/t-nwld	2005-04-01 12:27:40.000000000 +0200
+++ 2005-05-18/gcc/config/i386/t-nwld	2005-05-19 16:11:57.000000000 +0200
@@ -50,6 +50,7 @@ SHLIB_LINK = set -e; \
 		$(SHLIB_SRC) -posix -static-libgcc -lnetware \
 		-Wl,--Map,--map-info,full,--strip-all,--def-file,@shlib_base_name@.def; \
 	rm -f @shlib_base_name@.imp; $(LN_S) $(SHLIB_MAP) @shlib_base_name@.imp; \
+	rm -f libgcc.imp; $(LN_S) @shlib_base_name@.imp libgcc.imp; \
 	echo $$$$(($$$$(<libgcc/build)+1)) >libgcc/build
 
 # $(slibdir) double quoted to protect it from expansion while building
--- /home/jbeulich/src/gcc/mainline/2005-05-18/gcc/testsuite/g++.old-deja/g++.jason/thunk2.C	2004-09-07 10:45:00.000000000 +0200
+++ 2005-05-18/gcc/testsuite/g++.old-deja/g++.jason/thunk2.C	2005-05-19 16:11:57.000000000 +0200
@@ -1,6 +1,6 @@
 // { dg-do run }
 // { dg-options "-fPIC" }
-// { dg-bogus "\[Uu\]nresolved symbol .(_GLOBAL_OFFSET_TABLE_|\[_.A-Za-z\]\[_.0-9A-Za-z\]*@(PLT|GOT|GOTOFF))" "PIC unsupported" { xfail *-*-netware* } 0 }
+// { dg-bogus "\[Uu\]nresolved symbol .(_GLOBAL_OFFSET_TABLE_|\[_.A-Za-z\]\[_.0-9A-Za-z\]*@(PLT|GOT|GOTOFF))|\[Bb\]ad fixup at .DATA.:" "PIC unsupported" { xfail *-*-netware* } 0 }
 // Test that non-variadic function calls using thunks and PIC work right.
 
 struct A {
--- /home/jbeulich/src/gcc/mainline/2005-05-18/gcc/testsuite/g++.old-deja/g++.other/store-expr1.C	2004-11-25 13:32:44.000000000 +0100
+++ 2005-05-18/gcc/testsuite/g++.old-deja/g++.other/store-expr1.C	2005-05-19 16:11:57.000000000 +0200
@@ -1,7 +1,7 @@
 // { dg-do run { target i?86-*-* } }
 // { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
 // { dg-options "-mtune=i686 -O2 -fpic" }
-// { dg-bogus "\[Uu\]nresolved symbol .(_GLOBAL_OFFSET_TABLE_|\[_.A-Za-z\]\[_.0-9A-Za-z\]*@(PLT|GOT|GOTOFF))" "PIC unsupported" { xfail *-*-netware* } 0 }
+// { dg-bogus "\[Uu\]nresolved symbol .(_GLOBAL_OFFSET_TABLE_|\[_.A-Za-z\]\[_.0-9A-Za-z\]*@(PLT|GOT|GOTOFF))|\[Bb\]ad fixup at .DATA.:" "PIC unsupported" { xfail *-*-netware* } 0 }
 class G {};
 
 struct N {
--- /home/jbeulich/src/gcc/mainline/2005-05-18/gcc/testsuite/gcc.dg/20050321-2.c	2005-05-10 17:00:43.000000000 +0200
+++ 2005-05-18/gcc/testsuite/gcc.dg/20050321-2.c	2005-05-19 16:11:57.000000000 +0200
@@ -5,6 +5,7 @@
    figure out branch to lab is too far.  */
 /* { dg-do link { target fpic } } */
 /* { dg-options "-g1 -fpic" } */
+/* { dg-bogus "\[Uu\]nresolved symbol .(_GLOBAL_OFFSET_TABLE_|\[_.A-Za-z\]\[_.0-9A-Za-z\]*@(PLT|GOT|GOTOFF))" "PIC unsupported" { xfail *-*-netware* } 0 } */
 
 #define A(n) \
   case n##1: return n##1 * 131 + 63;	\

Attachment: gcc-mainline-netware.patch
Description: Text document


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