NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: lib/59391: unnecessary __PIC__ conditionals clutter .S files
The following reply was made to PR lib/59391; it has been noted by GNATS.
From: Valery Ushakov <uwe%stderr.spb.ru@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc:
Subject: Re: lib/59391: unnecessary __PIC__ conditionals clutter .S files
Date: Thu, 8 May 2025 04:09:51 +0300
The patch below allows one to write something like the following. For
static version it will expand to direct absolute accesses. For PIC
version it will do GOT or PC-relative respectively. Same object code
is generated modulo one s/mov/movs/ in cerror.S to make it compilable
as thumb (to verify the same code is generated for thumb as well).
0: PIC_GOT_INIT(r3, .Lgot)
...
MOV_GLOBAL(r4, r3, .Lgvar)
str r0, [r4]
...
1: MOV_PROTECTED(r4, .Llvar)
str r1, [r4]
// and in the data after the function
.p2align 2
.Lgot:
PIC_GOT_INITREF(0b)
.Lgvar: // gvar has default visibility
.word GLOBAL_SYMREF(gvar)
.Llvar: // lvar has protected or hidden visibility
.word PROTECTED_SYMREF(lvar)
Index: sys/arch/arm/include/asm.h
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/include/asm.h,v
retrieving revision 1.39
diff -u -p -c -r1.39 asm.h
*** sys/arch/arm/include/asm.h 7 May 2025 16:26:47 -0000 1.39
--- sys/arch/arm/include/asm.h 8 May 2025 00:32:21 -0000
***************
*** 189,217 ****
#define ASMSTR .asciz
- #ifdef __PIC__
- #define REL_SYM(a, b) ((a) - (b))
- #define PLT_SYM(x) x
- #define GOT_SYM(x) PIC_SYM(x, GOT)
- #define GOT_GET(x,got,sym) \
- ldr x, sym; \
- ldr x, [x, got]
/*
! * Load _GLOBAL_OFFSET_TABLE_ address into register:
*
! * 0: GOT_INIT(rX, .Lgot)
* ...
*
* // and in the data after the function
! * GOT_INITSYM(.Lgot, 0b)
*/
! #define GOT_INIT(Rgot, gotsym) \
! ldr Rgot, gotsym ; \
! add Rgot, Rgot, pc
! #define GOT_INITSYM(gotsym, initlabel) \
! .align 0; \
! gotsym: .word _C_LABEL(_GLOBAL_OFFSET_TABLE_) - (initlabel+(1+2)*_INSN_SIZE)
#ifdef __STDC__
#define PIC_SYM(x,y) x(y)
--- 189,243 ----
#define ASMSTR .asciz
/*
! * Hide the gory details of PIC accesses vs. normal accesses. Use as
! * in the following example. For static version it will expand to
! * direct absolute accesses. For PIC version it will do GOT or
! * PC-relative respectively.
*
! * 0: PIC_GOT_INIT(r3, .Lgot)
* ...
+ * MOV_GLOBAL(r4, r3, .Lgvar)
+ * str r0, [r4]
+ * ...
+ * 1: MOV_PROTECTED(r4, .Llvar)
+ * str r1, [r4]
*
* // and in the data after the function
! * .p2align 2
! * .Lgot:
! * PIC_GOT_INITREF(0b)
! *
! * .Lgvar: // gvar has default visibility
! * .word GLOBAL_SYMREF(gvar)
! *
! * .Llvar: // lvar has protected or hidden visibility
! * .word PROTECTED_SYMREF(lvar)
*/
! #ifdef __PIC__
! #define REL_SYM(a, b) ((a) - (b))
! #define PLT_SYM(x) x
!
! #define PIC_GOT_INIT(Rgot, reflabel) \
! MOV_PROTECTED(Rgot, reflabel)
!
! #define PIC_GOT_INITREF(initlabel) \
! .word PROTECTED_SYMREF(_C_LABEL(_GLOBAL_OFFSET_TABLE_), initlabel)
!
! #define MOV_GLOBAL(Rdst, Rgot, reflabel) \
! ldr Rdst, reflabel; \
! ldr Rdst, [Rdst, Rgot]
!
! #define GLOBAL_SYMREF(sym) \
! PIC_SYM(sym, GOT)
!
! #define MOV_PROTECTED(Rdst, reflabel) \
! ldr Rdst, reflabel; \
! add Rdst, Rdst, pc
!
! #define PROTECTED_SYMREF(sym, movlabel) \
! ((sym) - ((movlabel) + (1+2)*_INSN_SIZE))
#ifdef __STDC__
#define PIC_SYM(x,y) x(y)
***************
*** 219,232 ****
#define PIC_SYM(x,y) x/**/(/**/y/**/)
#endif
! #else
#define REL_SYM(a, b) (a)
#define PLT_SYM(x) x
! #define GOT_SYM(x) x
! #define GOT_GET(x,got,sym) \
! ldr x, sym;
! #define GOT_INIT(Rgot, gotsym)
! #define GOT_INITSYM(gotsym, initlabel)
#define PIC_SYM(x,y) x
#endif /* __PIC__ */
--- 245,267 ----
#define PIC_SYM(x,y) x/**/(/**/y/**/)
#endif
! #else /* !__PIC__ */
#define REL_SYM(a, b) (a)
#define PLT_SYM(x) x
!
! #define PIC_GOT_INIT(Rgot, reflabel)
! #define PIC_GOT_INITREF(initlabel)
!
! #define MOV_GLOBAL(Rdst, Rgot, reflabel) \
! ldr Rdst, reflabel /* Rgot is not used */
!
! #define GLOBAL_SYMREF(sym) (sym)
!
! #define MOV_PROTECTED(Rdst, reflabel) \
! ldr Rdst, reflabel
!
! #define PROTECTED_SYMREF(sym, movlabel) (sym)
!
#define PIC_SYM(x,y) x
#endif /* __PIC__ */
Index: tests/kernel/arch/arm/contextspfunc.S
===================================================================
RCS file: /cvsroot/src/tests/kernel/arch/arm/contextspfunc.S,v
retrieving revision 1.2
diff -u -p -c -r1.2 contextspfunc.S
*** tests/kernel/arch/arm/contextspfunc.S 7 May 2025 16:26:47 -0000 1.2
--- tests/kernel/arch/arm/contextspfunc.S 8 May 2025 00:32:22 -0000
*************** RCSID("$NetBSD: contextspfunc.S,v 1.2 20
*** 39,51 ****
* the global variable contextsp and call contextdone.
*/
ENTRY(contextspfunc)
! 0: GOT_INIT(r0, .Lgot)
mov r1, sp
! GOT_GET(r2, r0, .Lcontextsp)
str r1, [r2]
b PLT_SYM(_C_LABEL(contextdone))
! GOT_INITSYM(.Lgot, 0b)
.Lcontextsp:
! .word GOT_SYM(contextsp)
END(contextspfunc)
--- 39,52 ----
* the global variable contextsp and call contextdone.
*/
ENTRY(contextspfunc)
! 0: PIC_GOT_INIT(r0, .Lgot)
mov r1, sp
! MOV_GLOBAL(r2, r0, .Lcontextsp)
str r1, [r2]
b PLT_SYM(_C_LABEL(contextdone))
! .p2align 2
! .Lgot: PIC_GOT_INITREF(0b)
.Lcontextsp:
! .word GLOBAL_SYMREF(contextsp)
END(contextspfunc)
Index: tests/kernel/arch/arm/execsp.S
===================================================================
RCS file: /cvsroot/src/tests/kernel/arch/arm/execsp.S,v
retrieving revision 1.4
diff -u -p -c -r1.4 execsp.S
*** tests/kernel/arch/arm/execsp.S 7 May 2025 16:26:47 -0000 1.4
--- tests/kernel/arch/arm/execsp.S 8 May 2025 00:32:22 -0000
*************** RCSID("$NetBSD: execsp.S,v 1.4 2025/05/0
*** 40,54 ****
* to the usual csu __start routine.
*/
ENTRY(execsp_start)
! 0: GOT_INIT(r3, .Lgot.execsp_start)
mov r4, sp
! GOT_GET(r5, r3, .Lstartsp)
str r4, [r5]
b PLT_SYM(_C_LABEL(__start))
! GOT_INITSYM(.Lgot.execsp_start, 0b)
.Lstartsp:
! .word GOT_SYM(startsp)
END(execsp_start)
/*
--- 40,56 ----
* to the usual csu __start routine.
*/
ENTRY(execsp_start)
! 0: PIC_GOT_INIT(r3, .Lgot.execsp_start)
mov r4, sp
! MOV_GLOBAL(r5, r3, .Lstartsp)
str r4, [r5]
b PLT_SYM(_C_LABEL(__start))
! .p2align 2
! .Lgot.execsp_start:
! PIC_GOT_INITREF(0b)
.Lstartsp:
! .word GLOBAL_SYMREF(startsp)
END(execsp_start)
/*
*************** END(execsp_start)
*** 58,72 ****
* returns.
*/
ENTRY(execsp_ctor)
! 0: GOT_INIT(r0, .Lgot.execsp_ctor)
mov r1, sp
! GOT_GET(r2, r0, .Lctorsp)
str r1, [r2]
RET
! GOT_INITSYM(.Lgot.execsp_ctor, 0b)
.Lctorsp:
! .word GOT_SYM(ctorsp)
END(execsp_ctor)
/* Make execsp_ctor a constructor. */
--- 60,76 ----
* returns.
*/
ENTRY(execsp_ctor)
! 0: PIC_GOT_INIT(r0, .Lgot.execsp_ctor)
mov r1, sp
! MOV_GLOBAL(r2, r0, .Lctorsp)
str r1, [r2]
RET
! .p2align 2
! .Lgot.execsp_ctor:
! PIC_GOT_INITREF(0b)
.Lctorsp:
! .word GLOBAL_SYMREF(ctorsp)
END(execsp_ctor)
/* Make execsp_ctor a constructor. */
*************** END(execsp_ctor)
*** 82,97 ****
* been initialized.
*/
ENTRY(main)
! 0: GOT_INIT(r0, .Lgot.main)
mov r1, sp
! GOT_GET(r2, r0, .Lmainsp)
str r1, [r2]
mov r0, #0
RET
! GOT_INITSYM(.Lgot.main, 0b)
.Lmainsp:
! .word GOT_SYM(mainsp)
END(main)
/*
--- 86,103 ----
* been initialized.
*/
ENTRY(main)
! 0: PIC_GOT_INIT(r0, .Lgot.main)
mov r1, sp
! MOV_GLOBAL(r2, r0, .Lmainsp)
str r1, [r2]
mov r0, #0
RET
! .p2align 2
! .Lgot.main:
! PIC_GOT_INITREF(0b)
.Lmainsp:
! .word GLOBAL_SYMREF(mainsp)
END(main)
/*
*************** END(main)
*** 102,116 ****
* back to the t_signal_and_sp parent.
*/
ENTRY(execsp_dtor)
! 0: GOT_INIT(r0, .Lgot.execsp_dtor)
mov r1, sp
! GOT_GET(r2, r0, .Ldtorsp)
str r1, [r2]
b PLT_SYM(_C_LABEL(execsp_main))
! GOT_INITSYM(.Lgot.execsp_dtor, 0b)
.Ldtorsp:
! .word GOT_SYM(dtorsp)
END(execsp_dtor)
/* Make execsp_ctor a destructor. */
--- 108,124 ----
* back to the t_signal_and_sp parent.
*/
ENTRY(execsp_dtor)
! 0: PIC_GOT_INIT(r0, .Lgot.execsp_dtor)
mov r1, sp
! MOV_GLOBAL(r2, r0, .Ldtorsp)
str r1, [r2]
b PLT_SYM(_C_LABEL(execsp_main))
! .p2align 2
! .Lgot.execsp_dtor:
! PIC_GOT_INITREF(0b)
.Ldtorsp:
! .word GLOBAL_SYMREF(dtorsp)
END(execsp_dtor)
/* Make execsp_ctor a destructor. */
Index: tests/kernel/arch/arm/signalsphandler.S
===================================================================
RCS file: /cvsroot/src/tests/kernel/arch/arm/signalsphandler.S,v
retrieving revision 1.3
diff -u -p -c -r1.3 signalsphandler.S
*** tests/kernel/arch/arm/signalsphandler.S 7 May 2025 16:26:47 -0000 1.3
--- tests/kernel/arch/arm/signalsphandler.S 8 May 2025 00:32:22 -0000
*************** RCSID("$NetBSD: signalsphandler.S,v 1.3
*** 39,51 ****
* variable signalsp and return.
*/
ENTRY(signalsphandler)
! 0: GOT_INIT(r0, .Lgot)
mov r1, sp
! GOT_GET(r2, r0, .Lsignalsp)
str r1, [r2]
RET
! GOT_INITSYM(.Lgot, 0b)
.Lsignalsp:
! .word GOT_SYM(signalsp)
END(signalsphandler)
--- 39,52 ----
* variable signalsp and return.
*/
ENTRY(signalsphandler)
! 0: PIC_GOT_INIT(r0, .Lgot)
mov r1, sp
! MOV_GLOBAL(r2, r0, .Lsignalsp)
str r1, [r2]
RET
! .p2align 2
! .Lgot: PIC_GOT_INITREF(0b)
.Lsignalsp:
! .word GLOBAL_SYMREF(signalsp)
END(signalsphandler)
Index: lib/libc/arch/arm/gen/_setjmp.S
===================================================================
RCS file: /cvsroot/src/lib/libc/arch/arm/gen/_setjmp.S,v
retrieving revision 1.20
diff -u -p -c -r1.20 _setjmp.S
*** lib/libc/arch/arm/gen/_setjmp.S 8 May 2025 00:28:31 -0000 1.20
--- lib/libc/arch/arm/gen/_setjmp.S 8 May 2025 00:32:22 -0000
*************** ENTRY(_setjmp)
*** 60,71 ****
ldr r1, .L_setjmp_magic
#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
! ldr r2, .Lfpu_present
! #ifdef __PIC__
! add r2, r2, pc /* pc = &.LPIC0 */
! #endif
ldr r2, [r2]
- .LPIC0:
#if defined(__thumb__) && defined(_ARM_ARCH_T2)
cbz r2, 1f
#else
--- 60,67 ----
ldr r1, .L_setjmp_magic
#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
! 0: MOV_PROTECTED(r2, .Lfpu_present)
ldr r2, [r2]
#if defined(__thumb__) && defined(_ARM_ARCH_T2)
cbz r2, 1f
#else
*************** ENTRY(_setjmp)
*** 106,114 ****
RET
#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
! .align 0
.Lfpu_present:
! .word REL_SYM(_libc_arm_fpu_present, .LPIC0)
#endif /* __ARM_EABI__ && (_ARM_ARCH_T2 || !__thumb__) */
END(_setjmp)
--- 102,110 ----
RET
#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
! .p2align 2
.Lfpu_present:
! .word PROTECTED_SYMREF(_C_LABEL(_libc_arm_fpu_present), 0b)
#endif /* __ARM_EABI__ && (_ARM_ARCH_T2 || !__thumb__) */
END(_setjmp)
Index: lib/libc/arch/arm/gen/setjmp.S
===================================================================
RCS file: /cvsroot/src/lib/libc/arch/arm/gen/setjmp.S,v
retrieving revision 1.22
diff -u -p -c -r1.22 setjmp.S
*** lib/libc/arch/arm/gen/setjmp.S 8 May 2025 00:28:31 -0000 1.22
--- lib/libc/arch/arm/gen/setjmp.S 8 May 2025 00:32:22 -0000
*************** ENTRY(__setjmp14)
*** 75,86 ****
ldr r1, .Lsetjmp_magic
#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
! ldr r2, .Lfpu_present
! #ifdef __PIC__
! add r2, r2, pc /* pc = &.LPIC0 */
! #endif
ldr r2, [r2]
- .LPIC0:
#if defined(__thumb__) && defined(_ARM_ARCH_T2)
cbz r2, 1f /* don't save if we don't have a FPU */
#else
--- 75,82 ----
ldr r1, .Lsetjmp_magic
#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
! 0: MOV_PROTECTED(r2, .Lfpu_present)
ldr r2, [r2]
#if defined(__thumb__) && defined(_ARM_ARCH_T2)
cbz r2, 1f /* don't save if we don't have a FPU */
#else
*************** ENTRY(__setjmp14)
*** 120,128 ****
RET
#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
! .align 0
.Lfpu_present:
! .word REL_SYM(_libc_arm_fpu_present, .LPIC0)
#endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
END(__setjmp14)
--- 116,124 ----
RET
#if defined(__ARM_EABI__) && (!defined(__thumb__) || defined(_ARM_ARCH_T2))
! .p2align 2
.Lfpu_present:
! .word PROTECTED_SYMREF(_C_LABEL(_libc_arm_fpu_present), 0b)
#endif /* __ARM_EABI__ && (!__thumb__ || _ARM_ARCH_T2) */
END(__setjmp14)
Index: lib/libc/arch/arm/sys/cerror.S
===================================================================
RCS file: /cvsroot/src/lib/libc/arch/arm/sys/cerror.S,v
retrieving revision 1.18
diff -u -p -c -r1.18 cerror.S
*** lib/libc/arch/arm/sys/cerror.S 7 May 2025 16:26:47 -0000 1.18
--- lib/libc/arch/arm/sys/cerror.S 8 May 2025 00:32:22 -0000
*************** ENTRY_NP(CERROR)
*** 82,92 ****
.fnstart
.cfi_startproc
#endif
! 0: GOT_INIT(r3, .Lgot)
! ldr r1, .Lerrno
! #ifdef __PIC__
! ldr r1, [r3, r1]
! #endif /* __PIC__ */
str r0, [r1]
MOV_RETVAL_MINUS_1
RET
--- 82,89 ----
.fnstart
.cfi_startproc
#endif
! 0: PIC_GOT_INIT(r3, .Lgot)
! MOV_GLOBAL(r1, r3, .Lerrno)
str r0, [r1]
MOV_RETVAL_MINUS_1
RET
*************** ENTRY_NP(CERROR)
*** 94,102 ****
.cfi_endproc
.fnend
#endif
!
! GOT_INITSYM(.Lgot, 0b)
.Lerrno:
! .word GOT_SYM(_C_LABEL(errno))
#endif /* _REENTRANT */
END(CERROR)
--- 91,99 ----
.cfi_endproc
.fnend
#endif
! .p2align 2
! .Lgot: PIC_GOT_INITREF(0b)
.Lerrno:
! .word GLOBAL_SYMREF(_C_LABEL(errno))
#endif /* _REENTRANT */
END(CERROR)
Index: lib/libc/arch/arm/sys/ptrace.S
===================================================================
RCS file: /cvsroot/src/lib/libc/arch/arm/sys/ptrace.S,v
retrieving revision 1.14
diff -u -p -c -r1.14 ptrace.S
*** lib/libc/arch/arm/sys/ptrace.S 6 May 2025 20:21:33 -0000 1.14
--- lib/libc/arch/arm/sys/ptrace.S 8 May 2025 00:32:22 -0000
***************
*** 35,40 ****
--- 35,43 ----
ENTRY(ptrace)
#ifdef _REENTRANT
+ /* __errno() returns the address of a thread local variable */
+ .globl _C_LABEL(__errno)
+
#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
push {r0-r3, lr}
#else
*************** ENTRY(ptrace)
*** 52,69 ****
mov lr, r4
pop {r0-r4}
#endif
! #else
push {r0, r1}
! #ifdef __PIC__
! /* Setup the GOT */
! ldr r0, .Lgot
! adr r1, .Lgot
! add r0, r0, r1
! ldr r1, .Lerrno
! ldr r1, [r0, r1]
! #else
! ldr r1, .Lerrno
! #endif /* __PIC__ */
movs r0, #0
str r0, [r1]
pop {r0, r1}
--- 55,68 ----
mov lr, r4
pop {r0-r4}
#endif
!
! #else /* !_REENTRANT */
! /* errno is a global variable */
! .globl _C_LABEL(errno)
!
push {r0, r1}
! 0: PIC_GOT_INIT(r0, .Lgot)
! MOV_GLOBAL(r1, r0, .Lerrno)
movs r0, #0
str r0, [r1]
pop {r0, r1}
*************** ENTRY(ptrace)
*** 74,86 ****
RET
#ifndef _REENTRANT
! #ifdef __PIC__
! .align 0
! .Lgot:
! .word _C_LABEL(_GLOBAL_OFFSET_TABLE_) - .Lgot
! #endif /* __PIC__ */
!
.Lerrno:
! .word PIC_SYM(_C_LABEL(errno), GOT)
#endif /* !_REENTRANT */
END(ptrace)
--- 73,81 ----
RET
#ifndef _REENTRANT
! .p2align 2
! .Lgot: PIC_GOT_INITREF(0b)
.Lerrno:
! .word GLOBAL_SYMREF(_C_LABEL(errno))
#endif /* !_REENTRANT */
END(ptrace)
Index: lib/libc/arch/arm/sys/sbrk.S
===================================================================
RCS file: /cvsroot/src/lib/libc/arch/arm/sys/sbrk.S,v
retrieving revision 1.14
diff -u -p -c -r1.14 sbrk.S
*** lib/libc/arch/arm/sys/sbrk.S 6 May 2025 20:21:34 -0000 1.14
--- lib/libc/arch/arm/sys/sbrk.S 8 May 2025 00:32:22 -0000
*************** _C_LABEL(__curbrk):
*** 51,67 ****
* Change the data segment size
*/
ENTRY(_sbrk)
! /* get address or offset to __curbrk */
! ldr r2, .Lcurbrk
! #ifdef __PIC__
! add r2, r2, pc /* pc = &.LPIC0 */
! #endif
/* Get the current brk address */
ldr r1, [r2]
/* Calculate new value */
! .LPIC0: mov r3, r0
adds r0, r0, r1
SYSTRAP(break)
_INVOKE_CERROR()
--- 51,64 ----
* Change the data segment size
*/
ENTRY(_sbrk)
! /* Get address of __curbrk */
! 1: MOV_PROTECTED(r2, .Lcurbrk)
/* Get the current brk address */
ldr r1, [r2]
/* Calculate new value */
! mov r3, r0
adds r0, r0, r1
SYSTRAP(break)
_INVOKE_CERROR()
*************** ENTRY(_sbrk)
*** 74,80 ****
/* Return old curbrk value */
RET
! .align 0
.Lcurbrk:
! .word REL_SYM(_C_LABEL(__curbrk), .LPIC0)
END(_sbrk)
--- 71,77 ----
/* Return old curbrk value */
RET
! .p2align 2
.Lcurbrk:
! .word PROTECTED_SYMREF(_C_LABEL(__curbrk), 1b)
END(_sbrk)
-uwe
Home |
Main Index |
Thread Index |
Old Index