!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 inline ASTMultiPtr move_arg(ASTOwningVector &vec) { return ASTMultiPtr(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(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(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)