aboutsummaryrefslogtreecommitdiff
path: root/libitm
diff options
context:
space:
mode:
authorIain Sandoe <iains@gcc.gnu.org>2011-11-22 09:57:19 +0000
committerIain Sandoe <iains@gcc.gnu.org>2011-11-22 09:57:19 +0000
commit0b41ebef72631ec8cf5ffd16537d1274c3fd6800 (patch)
treedbf525527b3ae9e4434c36c077376e4711f90020 /libitm
parent9c9d352aba3c5b3d921c2f73f0bbcda45f99b99c (diff)
downloadgcc-0b41ebef72631ec8cf5ffd16537d1274c3fd6800.zip
gcc-0b41ebef72631ec8cf5ffd16537d1274c3fd6800.tar.gz
gcc-0b41ebef72631ec8cf5ffd16537d1274c3fd6800.tar.bz2
sjlj.S (CONCAT1, [...]): Respond to __USER_LABEL_PREFIX__ for targets that use it.
libitm: * config/x86/sjlj.S (CONCAT1, CONCAT2, SYM): Respond to __USER_LABEL_PREFIX__ for targets that use it. TYPE, SIZE, HIDDEN): New macros to assist on non-elf targets. (_ITM_beginTransaction): Use SYM, TYPE, SIZE macros to assist in portability to non-elf targets. (GTM_longjmp): LIkewise. * libitm_i.h (begin_transaction): Apply __USER_LABEL_PREFIX__ where required. From-SVN: r181612
Diffstat (limited to 'libitm')
-rw-r--r--libitm/ChangeLog11
-rw-r--r--libitm/config/x86/sjlj.S57
-rw-r--r--libitm/libitm_i.h8
3 files changed, 57 insertions, 19 deletions
diff --git a/libitm/ChangeLog b/libitm/ChangeLog
index b58a4f8..ae091d8 100644
--- a/libitm/ChangeLog
+++ b/libitm/ChangeLog
@@ -1,5 +1,16 @@
2011-11-22 Iain Sandoe <iains@gcc.gnu.org>
+ * config/x86/sjlj.S (CONCAT1, CONCAT2, SYM): Respond to
+ __USER_LABEL_PREFIX__ for targets that use it.
+ TYPE, SIZE, HIDDEN): New macros to assist on non-elf targets.
+ (_ITM_beginTransaction): Use SYM, TYPE, SIZE macros to assist
+ in portability to non-elf targets.
+ (GTM_longjmp): LIkewise.
+ * libitm_i.h (begin_transaction): Apply __USER_LABEL_PREFIX__
+ where required.
+
+2011-11-22 Iain Sandoe <iains@gcc.gnu.org>
+
* testsuite/libitm.c/memcpy-1.c: Allow for MAP_ANON spelling.
* testsuite/libitm.c/memset-1.c: Likewise.
diff --git a/libitm/config/x86/sjlj.S b/libitm/config/x86/sjlj.S
index ed755da..39e0c75 100644
--- a/libitm/config/x86/sjlj.S
+++ b/libitm/config/x86/sjlj.S
@@ -25,12 +25,39 @@
#include "asmcfi.h"
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+#ifdef __USER_LABEL_PREFIX__
+# define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+#else
+# define SYM(x) x
+#endif
+
+#ifdef __ELF__
+# define TYPE(x) .type SYM(x), @function
+# define SIZE(x) .size SYM(x), . - SYM(x)
+# ifdef HAVE_ATTRIBUTE_VISIBILITY
+# define HIDDEN(x) .hidden SYM(x)
+# else
+# define HIDDEN(x)
+# endif
+#else
+# define TYPE(x)
+# define SIZE(x)
+# ifdef __MACH__
+# define HIDDEN(x) .private_extern SYM(x)
+# else
+# define HIDDEN(x)
+# endif
+#endif
+
.text
.align 4
- .globl _ITM_beginTransaction
+ .globl SYM(_ITM_beginTransaction)
-_ITM_beginTransaction:
+SYM(_ITM_beginTransaction):
cfi_startproc
#ifdef __x86_64__
leaq 8(%rsp), %rax
@@ -46,7 +73,7 @@ _ITM_beginTransaction:
movq %r14, 48(%rsp)
movq %r15, 56(%rsp)
movq %rsp, %rsi
- call GTM_begin_transaction
+ call SYM(GTM_begin_transaction)
addq $72, %rsp
cfi_def_cfa_offset(8)
ret
@@ -61,12 +88,12 @@ _ITM_beginTransaction:
movl %ebp, 24(%esp)
leal 8(%esp), %edx
#if defined HAVE_ATTRIBUTE_VISIBILITY || !defined __PIC__
- call GTM_begin_transaction
+ call SYM(GTM_begin_transaction)
#elif defined __ELF__
call 1f
1: popl %ebx
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
- call GTM_begin_transaction@PLT
+ call SYM(GTM_begin_transaction)@PLT
movl 12(%esp), %ebx
#else
# error "Unsupported PIC sequence"
@@ -77,15 +104,13 @@ _ITM_beginTransaction:
#endif
cfi_endproc
-#ifdef __ELF__
- .type _ITM_beginTransaction, @function
- .size _ITM_beginTransaction, .-_ITM_beginTransaction
-#endif
+ TYPE(_ITM_beginTransaction)
+ SIZE(_ITM_beginTransaction)
.align 4
- .globl GTM_longjmp
+ .globl SYM(GTM_longjmp)
-GTM_longjmp:
+SYM(GTM_longjmp):
cfi_startproc
#ifdef __x86_64__
movq (%rdi), %rcx
@@ -116,13 +141,9 @@ GTM_longjmp:
#endif
cfi_endproc
-#ifdef __ELF__
- .type GTM_longjmp, @function
-#ifdef HAVE_ATTRIBUTE_VISIBILITY
- .hidden GTM_longjmp
-#endif
- .size GTM_longjmp, .-GTM_longjmp
-#endif
+ TYPE(GTM_longjmp)
+ HIDDEN(GTM_longjmp)
+ SIZE(GTM_longjmp)
#ifdef __linux__
.section .note.GNU-stack, "", @progbits
diff --git a/libitm/libitm_i.h b/libitm/libitm_i.h
index 58e43b0..ba1afb4 100644
--- a/libitm/libitm_i.h
+++ b/libitm/libitm_i.h
@@ -240,9 +240,15 @@ struct gtm_thread
// Invoked from assembly language, thus the "asm" specifier on
// the name, avoiding complex name mangling.
+#ifdef __USER_LABEL_PREFIX__
+#define UPFX1(t) UPFX(t)
+#define UPFX(t) #t
+ static uint32_t begin_transaction(uint32_t, const gtm_jmpbuf *)
+ __asm__(UPFX1(__USER_LABEL_PREFIX__) "GTM_begin_transaction") ITM_REGPARM;
+#else
static uint32_t begin_transaction(uint32_t, const gtm_jmpbuf *)
__asm__("GTM_begin_transaction") ITM_REGPARM;
-
+#endif
// In eh_cpp.cc
void revert_cpp_exceptions (gtm_transaction_cp *cp = 0);