Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -841,10 +841,36 @@ AC_DEFINE(HAVE_VFP2, 1, [Whether we have VFP2 or above]) AC_MSG_RESULT(yes) ], [ AC_MSG_RESULT(no) ]) + ;; +i?86) + AC_MSG_CHECKING(for endbr32) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([], [ + __asm__ __volatile__ ("endbr32"); + ]) + ], [ + AC_DEFINE(HAVE_ENDBR32, 1, [Whether we have endbr32]) + AC_MSG_RESULT(yes) + ], [ + AC_MSG_RESULT(no) + ]) + ;; +x86_64) + AC_MSG_CHECKING(for endbr64) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([], [ + __asm__ __volatile__ ("endbr64"); + ]) + ], [ + AC_DEFINE(HAVE_ENDBR64, 1, [Whether we have endbr64]) + AC_MSG_RESULT(yes) + ], [ + AC_MSG_RESULT(no) + ]) ;; esac AC_CHECK_LIB(m, fmod, LIBS="$LIBS -lm") AC_CHECK_LIB(complex, creal, TESTS_LIBS="$TESTS_LIBS -lcomplex") Index: src/forwarding/apple-forwarding-amd64.S ================================================================== --- src/forwarding/apple-forwarding-amd64.S +++ src/forwarding/apple-forwarding-amd64.S @@ -29,10 +29,14 @@ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions _OFForward: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -102,10 +106,14 @@ popq %rbp jmp _OFMethodNotFound _OFForward_stret: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ Index: src/forwarding/apple-forwarding-x86.S ================================================================== --- src/forwarding/apple-forwarding-x86.S +++ src/forwarding/apple-forwarding-x86.S @@ -29,10 +29,14 @@ .section __OBJC, __image_info .long 0, 0 .section __TEXT, __text, regular, pure_instructions _OFForward: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -79,10 +83,14 @@ popl %ebp jmp _OFMethodNotFound _OFForward_stret: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp Index: src/forwarding/forwarding-amd64-elf.S ================================================================== --- src/forwarding/forwarding-amd64-elf.S +++ src/forwarding/forwarding-amd64-elf.S @@ -20,10 +20,14 @@ .globl OFForward .globl OFForward_stret .section .text OFForward: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -105,10 +109,14 @@ jmp OFMethodNotFound@PLT .type OFForward, %function .size OFForward, .-OFForward OFForward_stret: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -192,10 +200,14 @@ jmp OFMethodNotFound_stret@PLT .type OFForward_stret, %function .size OFForward_stret, .-OFForward_stret init: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + leaq module(%rip), %rdi jmp __objc_exec_class@PLT #ifdef OF_SOLARIS .section .init_array, "aw" Index: src/forwarding/forwarding-amd64-macho.S ================================================================== --- src/forwarding/forwarding-amd64-macho.S +++ src/forwarding/forwarding-amd64-macho.S @@ -20,10 +20,14 @@ .globl _OFForward .globl _OFForward_stret .section __TEXT, __text, regular, pure_instructions _OFForward: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -103,10 +107,14 @@ popq %rbp jmp _OFMethodNotFound _OFForward_stret: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -188,10 +196,14 @@ popq %rbp jmp _OFMethodNotFound_stret init: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + leaq module(%rip), %rdi jmp ___objc_exec_class .section __DATA, __mod_init_func, mod_init_funcs .quad init Index: src/forwarding/forwarding-amd64-win64.S ================================================================== --- src/forwarding/forwarding-amd64-win64.S +++ src/forwarding/forwarding-amd64-win64.S @@ -18,10 +18,14 @@ .globl OFForward .globl OFForward_stret .section .text OFForward: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0x90, %rsp /* 16-byte alignment */ @@ -93,10 +97,14 @@ .scl 2 .type 32 .endef OFForward_stret: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0x90, %rsp /* 16-byte alignment */ @@ -170,10 +178,14 @@ .scl 2 .type 32 .endef init: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + leaq module(%rip), %rcx jmp __objc_exec_class .section .ctors, "aw" .quad init Index: src/forwarding/forwarding-x86-elf.S ================================================================== --- src/forwarding/forwarding-x86-elf.S +++ src/forwarding/forwarding-x86-elf.S @@ -20,10 +20,14 @@ .globl OFForward .globl OFForward_stret .section .text OFForward: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -84,10 +88,14 @@ jmp *%eax .type OFForward, %function .size OFForward, .-OFForward OFForward_stret: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -148,10 +156,14 @@ jmp *%eax .type OFForward_stret, %function .size OFForward_stret, .-OFForward_stret init: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + pushl %ebp movl %esp, %ebp pushl %ebx subl $4, %esp Index: src/forwarding/forwarding-x86-win32.S ================================================================== --- src/forwarding/forwarding-x86-win32.S +++ src/forwarding/forwarding-x86-win32.S @@ -18,10 +18,14 @@ .globl _OFForward .globl _OFForward_stret .section .text _OFForward: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -79,10 +83,14 @@ .scl 2 .type 32 .endef _OFForward_stret: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -140,10 +148,14 @@ .scl 2 .type 32 .endef init: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + pushl %ebp movl %esp, %ebp pushl %ebx subl $4, %esp Index: src/runtime/lookup-asm/lookup-asm-amd64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-amd64-elf.S +++ src/runtime/lookup-asm/lookup-asm-amd64-elf.S @@ -23,10 +23,14 @@ .globl objc_msg_lookup_super_stret .section .text .macro GENERATE_LOOKUP name notFound \name: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + testq %rdi, %rdi jz returnNilMethod testb $1, %dil jnz .LtaggedPointer_\name @@ -66,10 +70,14 @@ .size \name, .-\name .endm .macro GENERATE_LOOKUP_SUPER name lookup \name: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + movq %rdi, %r8 movq (%rdi), %rdi testq %rdi, %rdi jz returnNilMethod Index: src/runtime/lookup-asm/lookup-asm-amd64-win64.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-amd64-win64.S +++ src/runtime/lookup-asm/lookup-asm-amd64-win64.S @@ -21,10 +21,14 @@ .globl objc_msg_lookup_super_stret .section .text .macro GENERATE_LOOKUP name notFound \name: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + testq %rcx, %rcx jz returnNilMethod testb $1, %cl jnz .LtaggedPointer_\name @@ -73,10 +77,14 @@ .endef .endm .macro GENERATE_LOOKUP_SUPER name lookup \name: +#ifdef HAVE_ENDBR64 + endbr64 +#endif + movq %rcx, %r8 movq (%rcx), %rcx testq %rcx, %rcx jz returnNilMethod Index: src/runtime/lookup-asm/lookup-asm-x86-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-x86-elf.S +++ src/runtime/lookup-asm/lookup-asm-x86-elf.S @@ -23,10 +23,14 @@ .globl objc_msg_lookup_super_stret .section .text .macro GENERATE_LOOKUP name notFound \name: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + movl 4(%esp), %edx testl %edx, %edx jz returnNilMethod testb $1, %dl @@ -76,10 +80,14 @@ .size \name, .-\name .endm .macro GENERATE_LOOKUP_SUPER name lookup \name: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + movl 4(%esp), %edx movl (%edx), %eax testl %eax, %eax jz returnNilMethod Index: src/runtime/lookup-asm/lookup-asm-x86-win32.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-x86-win32.S +++ src/runtime/lookup-asm/lookup-asm-x86-win32.S @@ -21,10 +21,14 @@ .globl _objc_msg_lookup_super_stret .section .text .macro GENERATE_LOOKUP name notFound \name: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + movl 4(%esp), %edx testl %edx, %edx jz returnNilMethod testb $1, %dl @@ -65,10 +69,14 @@ .endef .endm .macro GENERATE_LOOKUP_SUPER name lookup \name: +#ifdef HAVE_ENDBR32 + endbr32 +#endif + movl 4(%esp), %edx movl (%edx), %eax test %eax, %eax jz returnNilMethod