This patch is a minor change which adds a flag to generate LLVM's
va_arg instruction instead of target-specific instructions for
handling variadic arguments. The flag is called -fuse-llvm-variadics,
but feel free to pick a better name :-). By default, this flag is
disabled, which preserves the existing behavior.
This functionality is useful for Clang users who want to do program
analysis in LLVM in a platform-independent way. Currently, there is no
way to disable the platform-specific instructions. We needed this
functionality for our research and we are aware of other groups who
want this as well.
Thanks,
David
va_arg-flag.patch (4.09 KB)
This patch is a minor change which adds a flag to generate LLVM's
va_arg instruction instead of target-specific instructions for
handling variadic arguments. The flag is called -fuse-llvm-variadics,
but feel free to pick a better name :-). By default, this flag is
disabled, which preserves the existing behavior.
This functionality is useful for Clang users who want to do program
analysis in LLVM in a platform-independent way. Currently, there is no
way to disable the platform-specific instructions. We needed this
functionality for our research and we are aware of other groups who
want this as well.
I’d like to add that this functionality would be useful for projects like DSA (a points-to analysis) and SAFECode (a memory safety tool). Currently, these tools have platform-specific code in them so that they understand the format of the varargs objects generated by the C/C++ front-ends. This prevents them from handling varargs functions in a platform-independent way.
For example, DSA has code to understand the x86 and x86_64 varargs structures, but it is very conservative for all other platforms. DSA could be more aggressive and platform-independent if it could just analyze varargs intrinsics like the ones that LLVM had originally.
– John T.
As John mentioned, many analysis passes would benefit from such a
feature, including a few of my own, and I'd personally be very happy
to see this included in clang.
Coincidentally, a while back I also submitted a similar patch, and I
think the resulting discussion absolutely work revisiting:
http://old.nabble.com/Is-va_arg-deprecated--tp29208110p32284898.html .
In short, this isn't as a simple as just tweaking clang, and is of
somewhat limited (doomed?) use since the resulting IR is
non-functional on many targets (including x86_64). This is also
mentioned in the LangRef (see
http://llvm.org/docs/LangRef.html#i_va_arg).
So this leaves us with a few questions: What would it take to fix
these issues? Is it okay to accept this feature as a stepping-stone
of sorts? Does this properly work on any target?
I apologize that I don't have the answers to these questions, but
hopefully others do. Thanks for rekindling this discussion/feature,
and submitting the patch!
*crosses fingers*
~Will