diff mbox

[RFA,libitm] Deal with __USER_LABEL_PREFIX__ in the asm

Message ID 04AFC3C8-2BBF-48F7-9E84-D7D8E03CA3AE@sandoe-acoustics.co.uk
State New
Headers show

Commit Message

Iain Sandoe Nov. 18, 2011, 2 p.m. UTC
Darwin needs to account for __USER_LABEL_PREFIX__ in the asm.

I used some of the arm code in libgcc as an example ...

allows the lib to build OK on x86-darwin ... (with working hidden  
symbols etc.)

comments/OK for trunk (assuming a test on linux is successful, of  
course)?
Iain

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.

Comments

Richard Henderson Nov. 18, 2011, 5:36 p.m. UTC | #1
On 11/18/2011 04:00 AM, Iain Sandoe wrote:
> 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.

Ok modulo the conflict you're going to have with RO's patch.
Adjust for his use of .hidden, of course, and the extra symbol ref.


r~
diff mbox

Patch

Index: libitm/config/x86/sjlj.S
===================================================================
--- libitm/config/x86/sjlj.S	(revision 181470)
+++ libitm/config/x86/sjlj.S	(working copy)
@@ -25,12 +25,35 @@ 
 
 #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)
+#  define HIDDEN(x) .hidden SYM(x)
+#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 +69,7 @@ 
 	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
@@ -60,22 +83,20 @@ 
 	movl	%edi, 20(%esp)
 	movl	%ebp, 24(%esp)
 	leal	8(%esp), %edx
-	call	GTM_begin_transaction
+	call	SYM(GTM_begin_transaction)
 	addl	$28, %esp
 	cfi_def_cfa_offset(4)
 	ret
 #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
@@ -106,11 +127,9 @@ 
 #endif
 	cfi_endproc
 
-#ifdef __ELF__
-	.type	GTM_longjmp, @function
-	.hidden	GTM_longjmp
-	.size	GTM_longjmp, .-GTM_longjmp
-#endif
+	TYPE(GTM_longjmp)
+	HIDDEN(GTM_longjmp)
+	SIZE(GTM_longjmp)
 
 #ifdef __linux__
 .section .note.GNU-stack, "", @progbits
Index: libitm/libitm_i.h
===================================================================
--- libitm/libitm_i.h	(revision 181470)
+++ libitm/libitm_i.h	(working copy)
@@ -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);