Applying custom filters after preprocessing (and compile-time sprintf optimization)


Recently I have started writing a preprocessor that wraps the C
preprocessor for optimizing calls to sprintf, since it is the one of the
bottlenecks of my application.

For GCC, it was easy for me to override the default C preprocessor, by
using its -no-integrated-cpp and -wrapper options (how I have done it
can be found in the qrinf-gcc and qrintf-gcc-wrapper files included in
the above repository).

However I have so far been unable to find a similar command-line option
for Clang. Is there any way to post-process the output of the preprocessor
in Clang? Or do I need to modify the source code of Clang itself?

Thank you in advance.

PS. BTW it would be great if compile-time optimization of sprintf goes
into Clang. Is there any chance of such possibility?

In the general case, it’s not possible to optimize sprintf fully, because
its behavior depends on the current locale (this affects %d and %u, which
it looks like you optimize) and it might have libc-specific extensions, but
LLVM does optimize in some simple cases: for instance, a sprintf containing
no % is optimized into memcpy. I expect patches would be accepted to
implement further cases, such as handling %s and %c.

…for instance, a sprintf containing no % is optimized into memcpy…

Could you point out where this happens? I’m not having any luck finding it.


lib/Transforms/Utils/SimplifyLibCalls.cpp; search for optimizeSPrintF.