- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!clangのCUDA対応について調査
ちょっとソースを読んでみたり.
まず,lib/Lex/Lexer.cppで
<<<
と
>>>
を,それぞれtoke::lesslesslessとtoke::greatergreatergreaterとして取得.
その後,lib/Parse/ParseExpr.cppでパーズしている.
case tok::l_paren: // p-e: p-e '(' argument-expression-list[opt] ')'
case tok::lesslessless: { // p-e: p-e '<<<' argument-expression-list '>>>'
// '(' argument-expression-list[opt] ')'
は共通のcaseになっていて,内部で処理が分岐している.
LLLocとGGGLocの間を取りだして,式を作っているのは次の部分.
ExprResult ECResult = Actions.ActOnCUDAExecConfigExpr(getCurScope(),
LLLLoc, move_arg(ExecConfigExprs), GGGLoc);
ここで,大事な中身はmove_arg(ExecConfigExprs)で渡されている.
move_argeは,
include/clang/Sema/Ownership.h
で定義されている.
template <class T, unsigned N> inline
ASTMultiPtr<T> move_arg(ASTOwningVector<T, N> &vec) {
return ASTMultiPtr<T>(vec.take(), vec.size());
}
Sema::ActOnCUDAExecConfigExprは,lib/Sema/SemaExpr.cpp
に実装されている.で,ごにょごにょ何か処理したあと,真打は,
return ActOnCallExpr(S, ConfigDR, LLLLoc, execConfig, GGGLoc, 0);
で呼ばれているSema::ActOnCallExpr.
if (Dependent) {
if (ExecConfig) {
return Owned(new (Context) CUDAKernelCallExpr(
Context, Fn, cast<CallExpr>(ExecConfig), Args, NumArgs,
Context.DependentTy, VK_RValue, RParenLoc));
} else {
return Owned(new (Context) CallExpr(Context, Fn, Args, NumArgs,
Context.DependentTy, VK_RValue,
RParenLoc));
}
}
で,CUDAKernelCallExprのインスタンスが作られている.
...と思ったら,この条件にマッチしないぞ?
DpendentもExecConfigも0だなあ...
結局
return BuildResolvedCallExpr(Fn, NDecl, LParenLoc, Args, NumArgs, RParenLoc,
ExecConfig);
という最後のreturn文で呼び出し元へ返っている.
ああ,Dependentって,定義部分なのか?と.
で,GPUカーネルのcallerの場合,BuildResolvedCallExprの中で,
if (Config) {
TheCall = new (Context) CUDAKernelCallExpr(Context, Fn,
cast<CallExpr>(Config),
Args, NumArgs,
Context.BoolTy,
VK_RValue,
RParenLoc);
} else {
TheCall = new (Context) CallExpr(Context, Fn,
Args, NumArgs,
Context.BoolTy,
VK_RValue,
RParenLoc);
}
と,CUDAKernelCallExprを生成している.ここでArgsが,LLLLocとGGGLocの中身だと思うのだけど
dumpしても一見ではわからないな...また今度.
CUDAKernelCallExprは./include/clang/AST/ExprCXX.hに定義されている.
!一言メモ
* FSWikiの整形,プログラム系のメモを残すときには不便だな (Fri Mar 25 16:11:07 2011 +0900)
* 研究室の自分の端末<->研究科のサーバ より さくらレンタルサーバ<->研究科のサーバの方がpingのround-tripが1桁くらい速い... (Fri Mar 25 12:18:59 2011 +0900)
* Rubyスクリプト中の__END__以降の行はDATAでアクセスできるのか.これは嬉しい♪ http://www.mapee.jp/ruby/data__end.html (Fri Mar 25 10:57:17 2011 +0900)
* みかけたら欲しいなあ.http://www.amazon.co.jp/exec/obidos/ASIN/4774138649/ (Fri Mar 25 03:45:47 2011 +0900)