[roland/nptl-sparc] Move remaining SPARC code out of nptl/.

Message ID 20140618223608.1DFDE2C39C7@topped-with-meat.com
State Committed
Headers

Commit Message

Roland McGrath June 18, 2014, 10:36 p.m. UTC
  Wholly untested.  It should not change anything.  A lot of the individual
files contained no particular Linuxisms, so I moved them to OS-independent
(but CPU-dependent) sysdeps/ directories.

OK?

Thanks,
Roland


2014-06-18  Roland McGrath  <roland@hack.frob.com>

	* sysdeps/unix/sysv/linux/sparc/Makefile [$(subdir) = nptl]
	(libpthread-routines): Add sysdep.
	* nptl/sysdeps/unix/sysv/linux/sparc/Makefile: File removed.
	* sysdeps/unix/sysv/linux/sparc/Versions
	(libpthread: GLIBC_2.3.3): New version set.
	* nptl/sysdeps/unix/sysv/linux/sparc/Versions: File removed.
	* nptl/sysdeps/unix/sysv/linux/sparc/aio_cancel.c: Moved ...
	* sysdeps/unix/sysv/linux/sparc/aio_cancel.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/internaltypes.h: Moved ...
	* sysdeps/sparc/nptl/internaltypes.h: ... here.  Use #include_next.
	* nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_destroy.c:
	Moved ...
	* sysdeps/sparc/nptl/pthread_barrier_destroy.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_init.c: Moved ...
	* sysdeps/sparc/nptl/pthread_barrier_init.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c: Moved ...
	* sysdeps/sparc/nptl/pthread_barrier_wait.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sem_init.c: Moved ...
	* sysdeps/sparc/nptl/sem_init.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c: Moved ...
	* sysdeps/sparc/nptl/sem_post.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c: Moved ...
	* sysdeps/sparc/nptl/sem_timedwait.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c: Moved ...
	* sysdeps/sparc/nptl/sem_wait.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Moved ...
	* sysdeps/unix/sysv/linux/sparc/lowlevellock.h: ... here.
	* sysdeps/sparc/sparc32/sparcv9/Makefile [$(subdir) = nptl]
	(libpthread-routines): Add cpu_relax.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/Makefile:
	File removed.
	* sysdeps/unix/sysv/linux/sparc/sparc64/Versions
	(librt: GLIBC_2.3.3): New version set.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Versions: File removed.
	* sysdeps/sparc/sparc64/nptl/Makefile: New file.
	* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile [$(subdir) = nptl]
	(CFLAGS-pause.c, CFLAGS-sigsuspend.c): New variables.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: File removed.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c: Moved ...
	* sysdeps/sparc/sparc32/nptl/lowlevellock.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c:
	Moved ...
	* sysdeps/sparc/sparc32/nptl/pthread_barrier_wait.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c: Moved ...
	* sysdeps/sparc/sparc32/nptl/sem_post.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c: Moved ...
	* sysdeps/sparc/sparc32/nptl/sem_timedwait.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c: Moved ...
	* sysdeps/sparc/sparc32/nptl/sem_trywait.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c: Moved ...
	* sysdeps/sparc/sparc32/nptl/sem_wait.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/cpu_relax.S:
	Moved ...
	* sysdeps/sparc/sparc32/sparcv9/nptl/cpu_relax.S: ... here.
	Update #include.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c:
	Moved ...
	* sysdeps/sparc/sparc32/sparcv9/nptl/pthread_barrier_wait.c: ... here.
	Update #include.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_post.c:
	Moved ...
	* sysdeps/sparc/sparc32/sparcv9/nptl/sem_post.c: ... here.
	Update #include.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_timedwait.c:
	Moved ...
	* sysdeps/sparc/sparc32/sparcv9/nptl/sem_timedwait.c: ... here.
	Update #include.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_trywait.c:
	Moved ...
	* sysdeps/sparc/sparc32/sparcv9/nptl/sem_trywait.c: ... here.
	Update #include.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_wait.c:
	Moved ...
	* sysdeps/sparc/sparc32/sparcv9/nptl/sem_wait.c: ... here.
	Update #include.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc64/cpu_relax.S: Moved ...
	* sysdeps/sparc/sparc64/nptl/cpu_relax.S: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Moved ...
	* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Moved ...
	* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c: Moved ...
	* sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c: Moved ...
	* sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c: Moved ...
	* sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c: Moved ...
	* sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c: ... here.
	* nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c: Moved ...
	* sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c: ... here.
  

Comments

David Miller June 20, 2014, 4:29 a.m. UTC | #1
From: Roland McGrath <roland@hack.frob.com>
Date: Wed, 18 Jun 2014 15:36:08 -0700 (PDT)

> Wholly untested.  It should not change anything.  A lot of the individual
> files contained no particular Linuxisms, so I moved them to OS-independent
> (but CPU-dependent) sysdeps/ directories.
> 
> OK?

This is fine with me.
  
Roland McGrath June 21, 2014, 12:16 a.m. UTC | #2
I've committed it.  Please draw my attention to any follow-on fixes you
find necessary (or even just desirable), so I can be on the lookout not to
repeat mistakes with other machines.


Thanks,
Roland
  
David Miller June 21, 2014, 3:13 a.m. UTC | #3
From: Roland McGrath <roland@hack.frob.com>
Date: Fri, 20 Jun 2014 17:16:28 -0700 (PDT)

> I've committed it.  Please draw my attention to any follow-on fixes you
> find necessary (or even just desirable), so I can be on the lookout not to
> repeat mistakes with other machines.

Will do.
  
David Miller June 23, 2014, 12:01 a.m. UTC | #4
From: David Miller <davem@davemloft.net>

Date: Fri, 20 Jun 2014 20:13:45 -0700 (PDT)

> From: Roland McGrath <roland@hack.frob.com>

> Date: Fri, 20 Jun 2014 17:16:28 -0700 (PDT)

> 

>> I've committed it.  Please draw my attention to any follow-on fixes you

>> find necessary (or even just desirable), so I can be on the lookout not to

>> repeat mistakes with other machines.

> 

> Will do.


There appears to be a problem with putting this stuff under sysdeps/sparc/nptl,
in that header files under nptl/sysdeps/unix/sysv/linux/ will be choosen first.

As a result, sysdeps/sparc/nptl/internaltypes.h won't be used, instead we end up
using nptl/sysdeps/unix/sysv/linux/internaltypes.h.

This leads to the build failing:

../sysdeps/sparc/nptl/pthread_barrier_destroy.c: In function ‘pthread_barrier_destroy’:
../sysdeps/sparc/nptl/pthread_barrier_destroy.c:32:25: error: dereferencing pointer to incomplete type
 ...

etc.

I can't think of an easy way to fix this.
  
Roland McGrath June 23, 2014, 5:08 p.m. UTC | #5
> There appears to be a problem with putting this stuff under
> sysdeps/sparc/nptl, in that header files under
> nptl/sysdeps/unix/sysv/linux/ will be choosen first.
> 
> As a result, sysdeps/sparc/nptl/internaltypes.h won't be used, instead we
> end up using nptl/sysdeps/unix/sysv/linux/internaltypes.h.

OK, I have three answers:

1. The quickest fix is just to move it back to sysdeps/.../linux/sparc/.

2. The sparc internaltypes.h doesn't actually define anything differently
   from the common one.  It just adds extra types that are used only by a
   few sparc implementation .c files.  So it could just be a separate
   sparc-specific header by a different name.  This might be what's really
   the best idea, on the general principle that if you can do your
   machine-specific work just as cleanly with new machine-specific files
   that do not interact with shared sysdeps files, then that choice
   simplifies things by reducing such interactions that you or other
   maintainers have to worry about in the future.

3. The "linux" internaltypes.h in fact does not contain any deep Linuxisms.
   So as part of my ongoing cleanup I was about to move this to someplace
   else more common, such as nptl/ or sysdeps/nptl/.  That will fix your
   problem for you incidentally, and I was probably going to do that today
   anyway.


Thanks,
Roland
  
David Miller June 24, 2014, 5:27 a.m. UTC | #6
From: Roland McGrath <roland@hack.frob.com>
Date: Mon, 23 Jun 2014 10:08:40 -0700 (PDT)

> 2. The sparc internaltypes.h doesn't actually define anything differently
>    from the common one.  It just adds extra types that are used only by a
>    few sparc implementation .c files.  So it could just be a separate
>    sparc-specific header by a different name.  This might be what's really
>    the best idea, on the general principle that if you can do your
>    machine-specific work just as cleanly with new machine-specific files
>    that do not interact with shared sysdeps files, then that choice
>    simplifies things by reducing such interactions that you or other
>    maintainers have to worry about in the future.

I think this is the way to go, regardless of what you end up doing with
internaltypes.h

I'll work on this.
  
Roland McGrath June 24, 2014, 8:14 p.m. UTC | #7
> I think this is the way to go, regardless of what you end up doing with
> internaltypes.h
> 
> I'll work on this.

Thanks.  I tend to agree.  But you could also test the roland/nptl branch
and see if it works. :-)
  
David Miller June 24, 2014, 8:28 p.m. UTC | #8
From: Roland McGrath <roland@hack.frob.com>
Date: Tue, 24 Jun 2014 13:14:58 -0700 (PDT)

>> I think this is the way to go, regardless of what you end up doing with
>> internaltypes.h
>> 
>> I'll work on this.
> 
> Thanks.  I tend to agree.  But you could also test the roland/nptl branch
> and see if it works. :-)

Even with the build fixed I'm getting a lot of NPTL test failures:

FAIL: nptl/tst-cancel13
FAIL: nptl/tst-cancel15
FAIL: nptl/tst-cancelx13
FAIL: nptl/tst-cancelx15
FAIL: nptl/tst-kill6
FAIL: nptl/tst-sem11
FAIL: nptl/tst-sem11-static
FAIL: nptl/tst-sem12
FAIL: nptl/tst-sem12-static
FAIL: nptl/tst-sem14
FAIL: nptl/tst-sem2
FAIL: nptl/tst-sem5
FAIL: nptl/tst-sem6
FAIL: nptl/tst-signal3
FAIL: nptl/tst-tls2
FAIL: nptl/tst-tls3

I suspect it's something else to do with directory dependency
ordering, which I guess is the riskiest aspect of these NPTL directory
move changes.

I will not have time to investigate this today, sorry.
  
Roland McGrath June 24, 2014, 8:34 p.m. UTC | #9
> I suspect it's something else to do with directory dependency
> ordering, which I guess is the riskiest aspect of these NPTL directory
> move changes.

Indeed.  I've tried to do each stage of the change in such a way that it
should not change the compiled code at all.  So rather than debugging the
tests, we can just debug the build, which should be a lot easier.  I use
diffs of objdump -rd output a lot.

> I will not have time to investigate this today, sorry.

No problem.  I will test the other builds that are easiest for me to do
(ARM, and re-test x86 in case I flubbed my previous testing), and might
find some general snafu that way.  Then I'll see what I can do to
investigate the sparc build myself if you haven't gotten there first.
(I have some old pointers from you to log into a machine of yours,
and in years past I've managed to find sparc boxes I could use via
the Debian and/or GCC compile farms or maybe sourceforge.)


Thanks,
Roland
  
David Miller June 24, 2014, 11 p.m. UTC | #10
From: Roland McGrath <roland@hack.frob.com>
Date: Tue, 24 Jun 2014 13:34:52 -0700 (PDT)

>> I will not have time to investigate this today, sorry.
> 
> No problem.  I will test the other builds that are easiest for me to do
> (ARM, and re-test x86 in case I flubbed my previous testing), and might
> find some general snafu that way.  Then I'll see what I can do to
> investigate the sparc build myself if you haven't gotten there first.
> (I have some old pointers from you to log into a machine of yours,
> and in years past I've managed to find sparc boxes I could use via
> the Debian and/or GCC compile farms or maybe sourceforge.)

Your roland/nptl branch results in a new build error, the problem is
that sysdeps/sparc/sparc32/sparcv9/nptl/sem_trywait.c tries to include
the old location of the generic Linux sem_trywait.c file which of
course no longer works.

What's the best way to handle this?  I tried:

#include <nptl/sem_trywait.c>

but that still picks up sysdeps/sparc/sparc32/sparcv9/nptl/sem_trywait.c,
then I thought to try:

#include_next <nptl/sem_trywait.c>

but that won't work because 1) it will generate a warning about using
include_next being used in a primary file and 2) it will end up using
sysdeps/sparc/sparc32/nptl/sem_trywait.c rather than what I want which
is nptl/sem_trywait.c

Ugh!
  

Patch

diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/Makefile b/nptl/sysdeps/unix/sysv/linux/sparc/Makefile
deleted file mode 100644
index e98c9bd..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@ 
-# pull in __syscall_error routine
-libpthread-routines += sysdep
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/Versions b/nptl/sysdeps/unix/sysv/linux/sparc/Versions
deleted file mode 100644
index d102772..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/Versions
+++ /dev/null
@@ -1,6 +0,0 @@ 
-libpthread {
-  GLIBC_2.3.3 {
-    # Changed PTHREAD_STACK_MIN.
-    pthread_attr_setstack; pthread_attr_setstacksize;
-  }
-}
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/Makefile b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/Makefile
deleted file mode 100644
index f7acc01..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/Makefile
+++ /dev/null
@@ -1 +0,0 @@ 
-libpthread-routines += cpu_relax
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/cpu_relax.S b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/cpu_relax.S
deleted file mode 100644
index 4ac4d14..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/cpu_relax.S
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sparc64/cpu_relax.S>
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c
deleted file mode 100644
index 2d32e58..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include "../../pthread_barrier_wait.c"
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_post.c b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_post.c
deleted file mode 100644
index 73d7c56..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_post.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include "../../sem_post.c"
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_timedwait.c b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_timedwait.c
deleted file mode 100644
index 03945b7..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_timedwait.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include "../../sem_timedwait.c"
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_trywait.c b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_trywait.c
deleted file mode 100644
index aae46f7..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_trywait.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include "../../../sem_trywait.c"
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_wait.c b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_wait.c
deleted file mode 100644
index a5dbc5a..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_wait.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include "../../sem_wait.c"
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile b/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
deleted file mode 100644
index 656d2e0..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@ 
-libpthread-routines += cpu_relax
-
-ifeq ($(subdir),nptl)
-CFLAGS-pause.c += -fexceptions
-CFLAGS-sigsuspend.c += -fexceptions
-endif
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Versions b/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Versions
deleted file mode 100644
index 3b111dd..0000000
--- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/Versions
+++ /dev/null
@@ -1,7 +0,0 @@ 
-librt {
-  GLIBC_2.3.3 {
-    # Changed timer_t.
-    timer_create; timer_delete; timer_getoverrun; timer_gettime;
-    timer_settime;
-  }
-}
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/internaltypes.h b/sysdeps/sparc/nptl/internaltypes.h
similarity index 94%
rename from nptl/sysdeps/unix/sysv/linux/sparc/internaltypes.h
rename to sysdeps/sparc/nptl/internaltypes.h
index 4f400a3..e5c2740 100644
--- a/nptl/sysdeps/unix/sysv/linux/sparc/internaltypes.h
+++ b/sysdeps/sparc/nptl/internaltypes.h
@@ -1,5 +1,6 @@ 
 #ifndef _INTERNALTYPES_H
-#include "../internaltypes.h"
+
+#include_next <internaltypes.h>
 
 union sparc_pthread_barrier
 {
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_destroy.c b/sysdeps/sparc/nptl/pthread_barrier_destroy.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_destroy.c
rename to sysdeps/sparc/nptl/pthread_barrier_destroy.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_init.c b/sysdeps/sparc/nptl/pthread_barrier_init.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_init.c
rename to sysdeps/sparc/nptl/pthread_barrier_init.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c b/sysdeps/sparc/nptl/pthread_barrier_wait.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c
rename to sysdeps/sparc/nptl/pthread_barrier_wait.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sem_init.c b/sysdeps/sparc/nptl/sem_init.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sem_init.c
rename to sysdeps/sparc/nptl/sem_init.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c b/sysdeps/sparc/nptl/sem_post.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c
rename to sysdeps/sparc/nptl/sem_post.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c b/sysdeps/sparc/nptl/sem_timedwait.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c
rename to sysdeps/sparc/nptl/sem_timedwait.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c b/sysdeps/sparc/nptl/sem_wait.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c
rename to sysdeps/sparc/nptl/sem_wait.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c b/sysdeps/sparc/sparc32/nptl/lowlevellock.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c
rename to sysdeps/sparc/sparc32/nptl/lowlevellock.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c b/sysdeps/sparc/sparc32/nptl/pthread_barrier_wait.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c
rename to sysdeps/sparc/sparc32/nptl/pthread_barrier_wait.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c b/sysdeps/sparc/sparc32/nptl/sem_post.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c
rename to sysdeps/sparc/sparc32/nptl/sem_post.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c b/sysdeps/sparc/sparc32/nptl/sem_timedwait.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c
rename to sysdeps/sparc/sparc32/nptl/sem_timedwait.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c b/sysdeps/sparc/sparc32/nptl/sem_trywait.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c
rename to sysdeps/sparc/sparc32/nptl/sem_trywait.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c b/sysdeps/sparc/sparc32/nptl/sem_wait.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c
rename to sysdeps/sparc/sparc32/nptl/sem_wait.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/Makefile b/sysdeps/sparc/sparc32/sparcv9/Makefile
index 7d475b0..36f889e 100644
--- a/sysdeps/sparc/sparc32/sparcv9/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/Makefile
@@ -18,3 +18,7 @@  ASFLAGS-.op += -Wa,-Av9a
 ASFLAGS-.og += -Wa,-Av9a
 ASFLAGS-.oS += -Wa,-Av9a
 endif
+
+ifeq ($(subdir), nptl)
+libpthread-routines += cpu_relax
+endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/nptl/cpu_relax.S b/sysdeps/sparc/sparc32/sparcv9/nptl/cpu_relax.S
new file mode 100644
index 0000000..fa88647
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/nptl/cpu_relax.S
@@ -0,0 +1 @@ 
+#include <sysdeps/sparc/sparc64/nptl/cpu_relax.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/nptl/pthread_barrier_wait.c b/sysdeps/sparc/sparc32/sparcv9/nptl/pthread_barrier_wait.c
new file mode 100644
index 0000000..8336f5e
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/nptl/pthread_barrier_wait.c
@@ -0,0 +1 @@ 
+#include <sysdeps/sparc/nptl/pthread_barrier_wait.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/nptl/sem_post.c b/sysdeps/sparc/sparc32/sparcv9/nptl/sem_post.c
new file mode 100644
index 0000000..3c4b940
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/nptl/sem_post.c
@@ -0,0 +1 @@ 
+#include <sysdeps/sparc/nptl/sem_post.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/nptl/sem_timedwait.c b/sysdeps/sparc/sparc32/sparcv9/nptl/sem_timedwait.c
new file mode 100644
index 0000000..f19b2c5
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/nptl/sem_timedwait.c
@@ -0,0 +1 @@ 
+#include <sysdeps/sparc/nptl/sem_timedwait.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/nptl/sem_trywait.c b/sysdeps/sparc/sparc32/sparcv9/nptl/sem_trywait.c
new file mode 100644
index 0000000..80157c5
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/nptl/sem_trywait.c
@@ -0,0 +1 @@ 
+#include <sysdeps/unix/sysv/linux/sem_trywait.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/nptl/sem_wait.c b/sysdeps/sparc/sparc32/sparcv9/nptl/sem_wait.c
new file mode 100644
index 0000000..b6d8287
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/nptl/sem_wait.c
@@ -0,0 +1 @@ 
+#include <sysdeps/sparc/nptl/sem_wait.c>
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/cpu_relax.S b/sysdeps/sparc/sparc64/nptl/cpu_relax.S
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc64/cpu_relax.S
rename to sysdeps/sparc/sparc64/nptl/cpu_relax.S
diff --git a/sysdeps/unix/sysv/linux/sparc/Makefile b/sysdeps/unix/sysv/linux/sparc/Makefile
index 96b783e..e67aecf 100644
--- a/sysdeps/unix/sysv/linux/sparc/Makefile
+++ b/sysdeps/unix/sysv/linux/sparc/Makefile
@@ -11,3 +11,8 @@  endif
 ifeq ($(subdir),sysvipc)
 sysdep_routines += getshmlba
 endif
+
+ifeq ($(subdir),nptl)
+# pull in __syscall_error routine
+libpthread-routines += sysdep
+endif
diff --git a/sysdeps/unix/sysv/linux/sparc/Versions b/sysdeps/unix/sysv/linux/sparc/Versions
index 5d31d1d..4dc1cd7 100644
--- a/sysdeps/unix/sysv/linux/sparc/Versions
+++ b/sysdeps/unix/sysv/linux/sparc/Versions
@@ -30,6 +30,14 @@  libc {
     __getshmlba;
   }
 }
+
+libpthread {
+  GLIBC_2.3.3 {
+    # Changed PTHREAD_STACK_MIN.
+    pthread_attr_setstack; pthread_attr_setstacksize;
+  }
+}
+
 librt {
   GLIBC_2.3 {
     # AIO functions.
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/aio_cancel.c b/sysdeps/unix/sysv/linux/sparc/aio_cancel.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/aio_cancel.c
rename to sysdeps/unix/sysv/linux/sparc/aio_cancel.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h b/sysdeps/unix/sysv/linux/sparc/lowlevellock.h
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h
rename to sysdeps/unix/sysv/linux/sparc/lowlevellock.h
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
rename to sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
index 715af3d..7ea433f 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
@@ -7,3 +7,8 @@  LD += -melf64_sparc
 ifeq ($(subdir),stdlib)
 sysdep_routines += __start_context
 endif
+
+ifeq ($(subdir),nptl)
+CFLAGS-pause.c += -fexceptions
+CFLAGS-sigsuspend.c += -fexceptions
+endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Versions b/sysdeps/unix/sysv/linux/sparc/sparc64/Versions
index cfcc15b..fbea1bb 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/Versions
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Versions
@@ -9,3 +9,11 @@  libc {
     wordexp;
   }
 }
+
+librt {
+  GLIBC_2.3.3 {
+    # Changed timer_t.
+    timer_create; timer_delete; timer_getoverrun; timer_gettime;
+    timer_settime;
+  }
+}
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
rename to sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c b/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c
rename to sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c b/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c
rename to sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c b/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c
rename to sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c b/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c
rename to sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c
diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c b/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c
similarity index 100%
rename from nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c
rename to sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c