Commit 019275a2 by Jan Beulich Committed by Jan Beulich

netware-libgcc.def: Update copyright.

gcc/
2005-06-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. Use 'expr' rather than $(()) shell expressions.
	* gthr-nks.h (__gthread_objc_mutex_allocate): Kill another dubious
	use of NX_MUTEX_RECURSIVE.

gcc/testsuite/
2005-06-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.

From-SVN: r101203
parent 57493278
2005-06-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. Use 'expr' rather than $(()) shell expressions.
* gthr-nks.h (__gthread_objc_mutex_allocate): Kill another dubious
use of NX_MUTEX_RECURSIVE.
2005-06-19 Roger Sayle <roger@eyesopen.com> 2005-06-19 Roger Sayle <roger@eyesopen.com>
* fold-const.c (swap_tree_comparison): Add support for unordered * fold-const.c (swap_tree_comparison): Add support for unordered
......
description "gcc runtime and intrinsics support" description "gcc runtime and intrinsics support"
copyright "Copyright (C) 1989-2004 Free Software Foundation, Inc." copyright "Copyright (C) 1989-2005 Free Software Foundation, Inc."
...@@ -13,7 +13,11 @@ ...@@ -13,7 +13,11 @@
__deregister_frame, __deregister_frame,
__deregister_frame_info, __deregister_frame_info,
__deregister_frame_info_bases, __deregister_frame_info_bases,
__divdc3,
# __divdi3, # __divdi3,
__divsc3,
# __divtc3,
__divxc3,
__ffsdi2, __ffsdi2,
__ffssi2, __ffssi2,
__fixunsdfdi, __fixunsdfdi,
...@@ -24,15 +28,23 @@ ...@@ -24,15 +28,23 @@
__gcc_personality_v0, __gcc_personality_v0,
# __lshrdi3, # __lshrdi3,
# __moddi3, # __moddi3,
__muldc3,
# __muldi3, # __muldi3,
__mulsc3,
# __multc3,
__mulvdi3, __mulvdi3,
__mulvsi3, __mulvsi3,
__mulxc3,
__negvdi2, __negvdi2,
__negvsi2, __negvsi2,
__paritydi2, __paritydi2,
__paritysi2, __paritysi2,
__popcountdi2, __popcountdi2,
__popcountsi2, __popcountsi2,
__powidf2
__powisf2
# __powitf2
__powixf2
__register_frame, __register_frame,
__register_frame_info, __register_frame_info,
__register_frame_info_bases, __register_frame_info_bases,
......
...@@ -38,86 +38,55 @@ Boston, MA 02111-1307, USA. */ ...@@ -38,86 +38,55 @@ Boston, MA 02111-1307, USA. */
underscore prefix and a suffix consisting of an atsign (@) followed underscore prefix and a suffix consisting of an atsign (@) followed
by the number of bytes of arguments */ by the number of bytes of arguments */
static const char * static tree
gen_stdcall_decoration (tree decl) gen_stdcall_or_fastcall_decoration (tree decl, char prefix)
{ {
unsigned total = 0; unsigned total = 0;
/* ??? This probably should use XSTR (XEXP (DECL_RTL (decl), 0), 0) instead /* ??? This probably should use XSTR (XEXP (DECL_RTL (decl), 0), 0) instead
of DECL_ASSEMBLER_NAME. */ of DECL_ASSEMBLER_NAME. */
const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
char *newsym; char *newsym;
tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl));
if (TYPE_ARG_TYPES (TREE_TYPE (decl))) if (formal_type != NULL_TREE)
if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (decl)))) {
== void_type_node) /* These attributes are ignored for variadic functions in
{ i386.c:ix86_return_pops_args. For compatibility with MS
tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl)); compiler do not add @0 suffix here. */
if (TREE_VALUE (tree_last (formal_type)) != void_type_node)
/* Quit if we hit an incomplete type. Error is reported return NULL_TREE;
by convert_arguments in c-typeck.c or cp/typeck.c. */
while (TREE_VALUE (formal_type) != void_type_node /* Quit if we hit an incomplete type. Error is reported
&& COMPLETE_TYPE_P (TREE_VALUE (formal_type))) by convert_arguments in c-typeck.c or cp/typeck.c. */
{ while (TREE_VALUE (formal_type) != void_type_node
unsigned parm_size && COMPLETE_TYPE_P (TREE_VALUE (formal_type)))
= TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type))); {
/* Must round up to include padding. This is done the same unsigned parm_size
way as in store_one_arg. */ = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type)));
parm_size = ((parm_size + PARM_BOUNDARY - 1)
/ PARM_BOUNDARY * PARM_BOUNDARY); /* Must round up to include padding. This is done the same
total += parm_size; way as in store_one_arg. */
formal_type = TREE_CHAIN (formal_type); 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 (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);
}
}
newsym = alloca (1 + strlen (asmname) + 1 + 10 + 1); newsym = alloca (1 + strlen (asmname) + 1 + 10 + 1);
return IDENTIFIER_POINTER (get_identifier_with_length (newsym, return get_identifier_with_length (newsym,
sprintf (newsym, "%c%s@%d", FASTCALL_PREFIX, asmname, sprintf (newsym,
total / BITS_PER_UNIT))); "%c%s@%u",
prefix,
asmname,
total / BITS_PER_UNIT));
} }
/* Return string which is the former assembler name modified with an /* Return string which is the former assembler name modified with an
_n@ prefix where n represents the number of arguments passed in _n@ prefix where n represents the number of arguments passed in
registers */ registers */
static const char * static tree
gen_regparm_prefix (tree decl, unsigned nregs) gen_regparm_prefix (tree decl, unsigned nregs)
{ {
unsigned total = 0; unsigned total = 0;
...@@ -125,35 +94,40 @@ gen_regparm_prefix (tree decl, unsigned nregs) ...@@ -125,35 +94,40 @@ gen_regparm_prefix (tree decl, unsigned nregs)
of DECL_ASSEMBLER_NAME. */ of DECL_ASSEMBLER_NAME. */
const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
char *newsym; char *newsym;
tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl));
if (TYPE_ARG_TYPES (TREE_TYPE (decl))) if (formal_type != NULL_TREE)
if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (decl)))) {
== void_type_node) /* This attribute is ignored for variadic functions. */
{ if (TREE_VALUE (tree_last (formal_type)) != void_type_node)
tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl)); return NULL_TREE;
/* Quit if we hit an incomplete type. Error is reported /* Quit if we hit an incomplete type. Error is reported
by convert_arguments in c-typeck.c or cp/typeck.c. */ by convert_arguments in c-typeck.c or cp/typeck.c. */
while (TREE_VALUE (formal_type) != void_type_node while (TREE_VALUE (formal_type) != void_type_node
&& COMPLETE_TYPE_P (TREE_VALUE (formal_type))) && COMPLETE_TYPE_P (TREE_VALUE (formal_type)))
{ {
unsigned parm_size unsigned parm_size
= TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type))); = 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. */ /* Must round up to include padding. This is done the same
parm_size = ((parm_size + PARM_BOUNDARY - 1) way as in store_one_arg. */
/ PARM_BOUNDARY * PARM_BOUNDARY); parm_size = ((parm_size + PARM_BOUNDARY - 1)
total += parm_size; / PARM_BOUNDARY * PARM_BOUNDARY);
formal_type = TREE_CHAIN (formal_type); total += parm_size;
} formal_type = TREE_CHAIN (formal_type);
} }
}
if (nregs > total / BITS_PER_WORD) if (nregs > total / BITS_PER_WORD)
nregs = total / BITS_PER_WORD; nregs = total / BITS_PER_WORD;
gcc_assert (nregs <= 9); gcc_assert (nregs <= 9);
newsym = alloca (2 + strlen (asmname) + 1 + 1); newsym = alloca (3 + strlen (asmname) + 1);
return IDENTIFIER_POINTER (get_identifier_with_length (newsym, return get_identifier_with_length (newsym,
sprintf (newsym, "_%u@%s", nregs, asmname))); sprintf (newsym,
"_%u@%s",
nregs,
asmname));
} }
void void
...@@ -163,24 +137,31 @@ i386_nlm_encode_section_info (tree decl, rtx rtl, int first) ...@@ -163,24 +137,31 @@ i386_nlm_encode_section_info (tree decl, rtx rtl, int first)
if (first if (first
&& TREE_CODE (decl) == FUNCTION_DECL && 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)); tree type_attributes = TYPE_ATTRIBUTES (TREE_TYPE (decl));
rtx rtlname = XEXP (rtl, 0); tree newid;
if (GET_CODE (rtlname) == MEM)
rtlname = XEXP (rtlname, 0);
if (lookup_attribute ("stdcall", type_attributes)) 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)) else if (lookup_attribute ("fastcall", type_attributes))
XSTR (rtlname, 0) = gen_fastcall_decoration (decl); newid = gen_stdcall_or_fastcall_decoration (decl, FASTCALL_PREFIX);
else 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) if (GET_CODE (rtlname) == MEM)
XSTR (rtlname, 0) = rtlname = XEXP (rtlname, 0);
gen_regparm_prefix (decl, XSTR (rtlname, 0) = IDENTIFIER_POINTER (newid);
TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)))); /* 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);
} }
} }
} }
......
...@@ -40,7 +40,7 @@ SHLIB_LINK = set -e; \ ...@@ -40,7 +40,7 @@ SHLIB_LINK = set -e; \
echo "name $(SHLIB_NAME)" >>@shlib_base_name@.def; \ echo "name $(SHLIB_NAME)" >>@shlib_base_name@.def; \
echo "version $(version)" | sed "s!\.!,!g" >>@shlib_base_name@.def; \ echo "version $(version)" | sed "s!\.!,!g" >>@shlib_base_name@.def; \
touch libgcc/build; \ touch libgcc/build; \
echo "build $$$$(($$$$(<libgcc/build)+0))" >>@shlib_base_name@.def; \ echo "build $$$$(expr $$$$(<libgcc/build)+0)" >>@shlib_base_name@.def; \
echo "export @$(SHLIB_MAP)" >>@shlib_base_name@.def; \ echo "export @$(SHLIB_MAP)" >>@shlib_base_name@.def; \
if mpkxdc -n -p @shlib_base_name@.xdc; \ if mpkxdc -n -p @shlib_base_name@.xdc; \
then echo "xdcdata @shlib_base_name@.xdc" >>@shlib_base_name@.def; \ then echo "xdcdata @shlib_base_name@.xdc" >>@shlib_base_name@.def; \
...@@ -50,7 +50,8 @@ SHLIB_LINK = set -e; \ ...@@ -50,7 +50,8 @@ SHLIB_LINK = set -e; \
$(SHLIB_SRC) -posix -static-libgcc -lnetware \ $(SHLIB_SRC) -posix -static-libgcc -lnetware \
-Wl,--Map,--map-info,full,--strip-all,--def-file,@shlib_base_name@.def; \ -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 @shlib_base_name@.imp; $(LN_S) $(SHLIB_MAP) @shlib_base_name@.imp; \
echo $$$$(($$$$(<libgcc/build)+1)) >libgcc/build rm -f libgcc.imp; $(LN_S) @shlib_base_name@.imp libgcc.imp; \
expr $$$$(<libgcc/build)+1 >libgcc/build
# $(slibdir) double quoted to protect it from expansion while building # $(slibdir) double quoted to protect it from expansion while building
# libgcc.mk. We want this delayed until actual install time. # libgcc.mk. We want this delayed until actual install time.
......
...@@ -178,7 +178,7 @@ __gthread_objc_mutex_allocate (objc_mutex_t mutex) ...@@ -178,7 +178,7 @@ __gthread_objc_mutex_allocate (objc_mutex_t mutex)
{ {
static const NX_LOCK_INFO_ALLOC (info, "GNU ObjC", 0); static const NX_LOCK_INFO_ALLOC (info, "GNU ObjC", 0);
if ((mutex->backend = NXMutexAlloc (NX_MUTEX_RECURSIVE/*???*/, 0, &info)) == NULL) if ((mutex->backend = NXMutexAlloc (0, 0, &info)) == NULL)
return 0; return 0;
return -1; return -1;
} }
......
2005-06-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.
2005-06-20 Andreas Jaeger <aj@suse.de> 2005-06-20 Andreas Jaeger <aj@suse.de>
* gcc.target/i386/sseregparm-1.c, gcc.target/i386/sseregparm-2.c, * gcc.target/i386/sseregparm-1.c, gcc.target/i386/sseregparm-2.c,
......
// { dg-do run } // { dg-do run }
// { dg-options "-fPIC" } // { 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. // Test that non-variadic function calls using thunks and PIC work right.
struct A { struct A {
......
// { dg-do run { target i?86-*-* x86_64-*-* } } // { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-require-effective-target ilp32 } // { dg-require-effective-target ilp32 }
// { dg-options "-mtune=i686 -O2 -fpic" } // { 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 {}; class G {};
struct N { struct N {
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
figure out branch to lab is too far. */ figure out branch to lab is too far. */
/* { dg-do link { target fpic } } */ /* { dg-do link { target fpic } } */
/* { dg-options "-g1 -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) \ #define A(n) \
case n##1: return n##1 * 131 + 63; \ case n##1: return n##1 * 131 + 63; \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment