[LLVMdev] Template and GC root
Harris BAKIRAS
h.bakiras at gmail.com
Thu Apr 25 04:14:53 PDT 2013
Hi Everybody,
I am developing a Clang plugin in order to automate GC roots
identification on the stack in the VMKit project.
Currently, GC roots are manually identified by explicit calls to a
specific C++ function.
Then when C++ code is converted to LLVM IR, an optimization pass is
applied to replace all calls to this specific C++ function by calls to
llvm.gcroot intrinsic.
The process I am using know relies on Clang PluginASTAction and MatchFinder.
Whenever a GC root variable is matched as function parameter or local
variable, then I generate a C++ function call (with the help of Clang
Rewriter) to identify the GC root.
This works quite good in general, except for template methods.
In some cases the same method can be called with GC root parameter or
non GC root parameter (same thing for local variables / return values).
Here is a small example:
template <type T>
void foo(T obj){
// If T is of GC root type, then should
call a function to tag obj parameter.
// If T is not of GC root type, then do
nothing.
T tmp = 0; // Same issue for local variable.
/* do something here*/
}
As my solution modifies the source code, if the Matcher will match the
template parameter as GC root (and it is actually true in some cases), a
function call to identify the template parameter as GC root will be
generated in source code.
The fact that the source code is changed means that the type T should
always be a GC root type, which is actually false.
In some cases, in the previous example T can be of int type, and it will
be identified as a GC root even if it is not.
I need some help to see what I can do for solving this issue.
Does a plugin for writing template instantiation already exist in clang ?
If so, I can apply first template instantiation then launching the
matcher, avoiding the kind of problem I explained above.
Is the approach of generating source code wrong ?
Should I modify the AST directly, once template have been instantiated ?
If it is the case where can I start looking for to perform this ?
AST manipulation is not familiar to me. Some hints would be welcomed.
Thank you for your help,
--
Harris Bakiras
More information about the llvm-dev
mailing list