[cfe-dev] Rewriting calls to varargs functions

Dávid Bolvanský via cfe-dev cfe-dev at lists.llvm.org
Tue May 22 02:32:27 PDT 2018


Hello,

A new patch:
https://reviews.llvm.org/D47159

proposes transformations like:
printf("Hello, %s %d", "world", 123) - > printf("Hello world 123")

As Eli noted:

"I'm not sure we can rewrite calls to varargs functions safely in general
given the current state of the C ABI rules in LLVM.

Sometimes clang does weird things to conform with the ABI rules, because
the LLVM type system isn't the same as the C system. For most functions,
it's pretty easy to tell it happened: if the IR signature of the function
doesn't match the expected signature, something weird happened, so we can
just bail out. But varargs functions don't specify a complete signature, so
we can't tell if the clang ABI code was forced to do something weird, like
split an argument into multiple values, or insert a padding value. For
example, for the target mips64-unknown-linux-gnu, a call like
printf("asdf%Lf", 1.0L); gets lowered to the following:

%call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8],
[5 x i8]* @.str, i32 0, i32 0), i64 undef, fp128
0xL00000000000000003FFF000000000000) #2"


I would to hear more suggestions whether it is safe or not. Seems like
for mips Clang produces some weird IR, but e.g. x86 IR seems ok.

Any folks from Clang/LLVM to bring more information about "varargs vs ABI
vs LLVM vs Clang"?
And whether we can rewrite calls to varargs functions safely under some
conditions..

Thanks
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180522/d8487a0e/attachment.html>


More information about the cfe-dev mailing list