mark arm thread-pointer-loading inline asm as volatile
authorRich Felker <dalias@aerifal.cx>
Thu, 15 Oct 2015 16:04:48 +0000 (12:04 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 15 Oct 2015 16:04:48 +0000 (12:04 -0400)
this builds on commits a603a75a72bb469c6be4963ed1b55fabe675fe15 and
0ba35d69c0e77b225ec640d2bd112ff6d9d3b2af to ensure that a compiler
cannot conclude that it's valid to reorder the asm to a point before
the thread pointer is set up, or to treat the inline function as if it
were declared with attribute((const)).

other archs already use volatile asm for thread pointer loading.

arch/arm/pthread_arch.h

index 5cbb209e7c1060fa004f7364db78cd4efc4dc932..4a4dd09e9c8c26ec5c2df436fef18e8813371dcf 100644 (file)
@@ -4,7 +4,7 @@
 static inline pthread_t __pthread_self()
 {
        char *p;
-       __asm__( "mrc p15,0,%0,c13,c0,3" : "=r"(p) );
+       __asm__ __volatile__ ( "mrc p15,0,%0,c13,c0,3" : "=r"(p) );
        return (void *)(p+8-sizeof(struct pthread));
 }
 
@@ -14,10 +14,10 @@ static inline pthread_t __pthread_self()
 {
 #ifdef __clang__
        char *p;
-       __asm__( "bl __a_gettp\n\tmov %0,r0" : "=r"(p) : : "cc", "r0", "lr" );
+       __asm__ __volatile__ ( "bl __a_gettp\n\tmov %0,r0" : "=r"(p) : : "cc", "r0", "lr" );
 #else
        register char *p __asm__("r0");
-       __asm__( "bl __a_gettp" : "=r"(p) : : "cc", "lr" );
+       __asm__ __volatile__ ( "bl __a_gettp" : "=r"(p) : : "cc", "lr" );
 #endif
        return (void *)(p+8-sizeof(struct pthread));
 }