diff --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp --- a/llvm/lib/MC/MCELFStreamer.cpp +++ b/llvm/lib/MC/MCELFStreamer.cpp @@ -263,6 +263,7 @@ case MCSA_ELF_TypeIndFunction: Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_GNU_IFUNC)); + getAssembler().getWriter().markGnuAbi(); break; case MCSA_ELF_TypeObject: diff --git a/llvm/test/MC/ELF/ifunc-gnu.s b/llvm/test/MC/ELF/ifunc-gnu.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/ELF/ifunc-gnu.s @@ -0,0 +1,22 @@ +# REQUIRES: x86-registered-target +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux-gnu %s -o -| llvm-readelf -hs - | FileCheck %s + +.text + +.type foo_impl,@function +foo_impl: + ret + +.type foo_resolver,@function +foo_resolver: + mov $foo_impl, %rax + ret + +.type foo,@gnu_indirect_function +.set foo,foo_resolver + +## ELFOSABI_NONE is changed to ELFOSABI_GNU. Other OSABI values are unchanged. +# CHECK: OS/ABI: UNIX - GNU +# CHECK: FUNC LOCAL DEFAULT 2 foo_impl +# CHECK-NEXT: FUNC LOCAL DEFAULT 2 foo_resolver +# CHECK-NEXT: IFUNC LOCAL DEFAULT 2 foo