1; RUN: llc -mtriple=x86_64-unknown-linux-gnu %s -o - | FileCheck %s --check-prefixes=ELF 2; RUN: llc -mtriple=x86_64-apple-darwin %s -o - | FileCheck %s --check-prefixes=MACHO 3 4define internal ptr @foo_resolver() { 5entry: 6 ret ptr null 7} 8; ELF: .type foo_resolver,@function 9; ELF-NEXT: foo_resolver: 10 11; MACHO: .p2align 4 12; MACHO-NEXT: _foo_resolver 13 14 15@foo_ifunc = ifunc i32 (i32), ptr @foo_resolver 16; ELF: .globl foo_ifunc 17; ELF-NEXT: .type foo_ifunc,@gnu_indirect_function 18; ELF-NEXT: .set foo_ifunc, foo_resolver 19 20; MACHO: .section __DATA,__data 21; MACHO-NEXT: .p2align 3, 0x0 22; MACHO-NEXT: _foo_ifunc.lazy_pointer: 23; MACHO-NEXT: .quad _foo_ifunc.stub_helper 24; MACHO-NEXT: .section __TEXT,__text,regular,pure_instructions 25; MACHO-NEXT: .globl _foo_ifunc 26; MACHO-NEXT: .p2align 0 27; MACHO-NEXT: _foo_ifunc: 28; MACHO-NEXT: jmpl *_foo_ifunc.lazy_pointer(%rip) 29; MACHO-NEXT: .p2align 0 30; MACHO-NEXT: _foo_ifunc.stub_helper: 31; MACHO-NEXT: pushq %rax 32; MACHO-NEXT: pushq %rdi 33; MACHO-NEXT: pushq %rsi 34; MACHO-NEXT: pushq %rdx 35; MACHO-NEXT: pushq %rcx 36; MACHO-NEXT: pushq %r8 37; MACHO-NEXT: pushq %r9 38; MACHO-NEXT: callq _foo_resolver 39; MACHO-NEXT: movq %rax, _foo_ifunc.lazy_pointer(%rip) 40; MACHO-NEXT: popq %r9 41; MACHO-NEXT: popq %r8 42; MACHO-NEXT: popq %rcx 43; MACHO-NEXT: popq %rdx 44; MACHO-NEXT: popq %rsi 45; MACHO-NEXT: popq %rdi 46; MACHO-NEXT: popq %rax 47; MACHO-NEXT: jmpl *_foo_ifunc.lazy_pointer(%rip) 48 49@weak_ifunc = weak ifunc i32 (i32), ptr @foo_resolver 50; ELF: .type weak_ifunc,@gnu_indirect_function 51; MACHO-NOT: .weak_reference _weak_ifunc.lazy_pointer 52; MACHO: _weak_ifunc.lazy_pointer: 53; MACHO: .weak_reference _weak_ifunc 54; MACHO: _weak_ifunc: 55; MACHO-NOT: .weak_reference _weak_ifunc.stub_helper 56; MACHO: _weak_ifunc.stub_helper: 57