From: Neale Ferguson Date: Mon, 8 Jun 2015 15:25:53 +0000 (-0400) Subject: Add support for -fPIE on s390x X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=bb8d8e475e5b59e5b79dd0ec0c13006cb4e486a6;p=mono.git Add support for -fPIE on s390x --- diff --git a/mono/utils/mono-compiler.h b/mono/utils/mono-compiler.h index 322b9124be9..d06a2143a02 100644 --- a/mono/utils/mono-compiler.h +++ b/mono/utils/mono-compiler.h @@ -130,30 +130,43 @@ : "=r" (offset)) #endif #elif defined(__s390x__) -# if defined(PIC) +# if defined(__PIC__) +# if !defined(__PIE__) // This only works if libmono is linked into the application -# define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo; \ - __asm__ ("basr %%r1,0\n\t" \ - "j 0f\n\t" \ - ".quad " #var "@TLSGD\n\t" \ +# define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo; \ + __asm__ ("basr %%r1,0\n\t" \ + "j 0f\n\t" \ + ".quad " #var "@TLSGD\n" \ "0:\n\t" \ - "lg %%r2,4(%%r1)\n\t" \ + "lg %%r2,4(%%r1)\n\t" \ "brasl %%r14,__tls_get_offset@PLT:tls_gdcall:"#var"\n\t" \ "lgr %0,%%r2\n\t" \ : "=r" (foo) : \ : "1", "2", "14", "cc"); \ offset = foo; } while (0) +# elif __PIE__ == 1 +# define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo; \ + __asm__ ("lg %0," #var "@GOTNTPOFF(%%r12)\n\t" \ + : "=r" (foo)); \ + offset = foo; } while (0) +# elif __PIE__ == 2 +# define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo; \ + __asm__ ("larl %%r1," #var "@INDNTPOFF\n\t" \ + "lg %0,0(%%r1)\n\t" \ + : "=r" (foo) : \ + : "1", "cc"); \ + offset = foo; } while (0) +# endif # else -# define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo; \ - __asm__ ("basr %%r1,0\n\t" \ - "j 0f\n\t" \ - ".quad " #var "@NTPOFF\n" \ - "0:\n\t" \ - "lg %0,4(%%r1)\n\t" \ - : "=r" (foo) : : "1"); \ +# define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo; \ + __asm__ ("basr %%r1,0\n\t" \ + "j 0f\n\t" \ + ".quad " #var "@NTPOFF\n" \ + "0:\n\t" \ + "lg %0,4(%%r1)\n\t" \ + : "=r" (foo) : : "1"); \ offset = foo; } while (0) # endif - #else #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1 #endif