How to force an unused function declaration in clang

clang doesn’t seem to respect attribute((used)) in C functions. Even if I declare a function like the following: attribute((used)) void function(), then also it doesn’t declare the function in its IR file if I don’t use the function. Is there any other way to force the declaration of “unused” function declarations with clang.

I have hacked in clang 6.0.0 in tools/clang/lib/CodeGen/CodeGenModule.cpp file. I changed in EmitGlobal function to detect if the function has “used” attribute and then if it has then use “GetOrCreateLLVMFunction” this to create the function declaration. However, this hack fails in some other cases. Therefore I am looking for a proper way to do this.

Out of curiosity, how does an unused declaration affect the emitted object file

Zhang

For the same reason GCC allowed the attribute. Even if I want to use/inline a function later on in the pipeline.

Regards,
Soham Sinha
PhD Student, Department of Computer Science
Boston University

It works for me:

https://godbolt.org/g/3QzqAH

Can you share an example?

It does, when the function has a body. When it doesn’t, it ignores. The body might be provided later on in the toolchain via linking a library.

I realize that gcc also doesn’t provide this feature if the function doesn’t have a body. I was wondering if there is any elegant way to achieve this, instead of the “hack” I mentioned earlier.

Regards,
Soham Sinha
PhD Student, Department of Computer Science
Boston University

Define a variable that takes the address of the otherwise-unused function.

–paulr