[llvm-dev] RFC: __attribute__((ifunc("resolver")) representation in LLVM IR

Dmitry Polukhin via llvm-dev
Fri, 18 Dec 2015 18:44:56 -0000

Hi Everyone,

I would like to implement GCC ifunc attribute support in Clang and LLVM. At
the moment Clang ignores the attribute with a warning. On LLVM IR level
there is no support for ifunc. But there is some support for ELF symbol
type `@gnu_indirect_function` in ELF reader/writer/target asm parser. This
RFC is looking for thoughts and suggestions about representation of ifunc
in LLVM IR.

Alternatives for ifunc representation:

1. Add a boolean flag isIFunc to`GlobalAlias`
>From implementation perspective ifunc is very close to a function alias
that points to resolver function as a target. During asm emissions
`@gnu_indirect_function` symbol attribute is added. In printed LLVM it
could look like this:

`@foo = alias ifunc i32 (i32), bitcast (i64 ()* @foo_ifunc to i32 (i32)*)`

Pros:
- minimal changes LLVM code base

Cons:
- ifunc is not really an alias, if some code passes through alias and
starts using resolver function instead of ifunc, it is always an error
- in particular in my prototype I had to add weak linkage to inhibit
optimizations (it prevents them because LLVM assumes that linker could
change the symbol but it could be fixed without changing linkage)

2. Extract common parts for alias and ifunc into a base class
Both alias and ifunc will be derived classes. Similar to first proposal add
`@gnu_indirect_function` symbol attribute. In printed LLVM it could look
like:

`@foo = ifunc i32 (i32), i64 ()* @foo_ifunc`

Pros:
- no confusion for existing code
- cleaner from design perspective

Cons:
- Add new type of Global i.e. more textual changes
- Some potential code duplication (need prototyping to estimate)

3. Emit global asm statement from Clang
Generate global asm statement like `__asm__ (".type resolver_alias_name,
@gnu_indirect_function")` in Clang for alias generated for resolver
function.

Pros:
- (almost?) no changes in LLVM

Cons:
- ifunc is not marked in LLVM IR at all so some hacks are required to
detect and inhibit optimizations in LLVM for such alias (it is always wrong
to use resolver instead of ifunc they even have different function type)
- asm statement in general not very reliable mechanism in general, highly
depends on expected asm generated by compiler
- using low-level platform dependent information in Clang

I prototyped first approach, changes in http://reviews.llvm.org/D15525. But
got feedback that I should use second approach instead + request to write
RFC about this IR extension for broader discussion. I'm convinced that the
second approach is cleaner and if there is no better suggestion or push
back, I'm going to prepare such patch. Third approach mostly added for
completeness.

References:
- GCC ifunc documentation
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
- IFUNC low-level technical details http://www.airs.com/blog/archives/403

Thanks,
Dmitry Polukhin
--
Software Engineer
Intel Compiler Team
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20151218/b5c390b9/attachment.html>