三日目は、LLVM CodeGen を読んでました。clang で LLVM IR を生成するところですね。
AST(Abstract Syntax Tree)
を生成するのは、Sema にある Factory は良いのだが、
Sema.h は1万2千行
おいおい。
CodeGen は、ASTを Visitor pattern でたどって生成する方式。
Visitor pattern とは木構造とかを順次たどってくものなんですが、その時にノードによって違う処理をする必要がある。
その処理はVisitCallExprとかなんですが、
.td から生成した .inc を読み込む方式
コード生成しないと思っていたが、そんなことしていたのか。うーむ。Varidic Type Var とか使っていて
C++の brain damaged なコード炸裂
ってなところ。これに比べると Java はかなり楽。Smart pointer から .get() で本体を取るとかアホなのないしな。
で、結局、llvm::IRBuilder の Insert で生成されたIRを登録する方式らしい。
なので、そこにbreak pointを書ければ簡単に生成をtraceできます。
llvm::IRBuilder<llvm::ConstantFolder, clang::CodeGen::CGBuilderInserter>::Insert<llvm::CallInst> (
this=0x7fffffff7ca8, I=0xe6c2ee0, Name=...)
at /mnt/dalmore-home/one/src/LLVM_original/llvm/include/llvm/IR/IRBuilder.h:993
993 this->InsertHelper(I, Name, BB, InsertPt);
(gdb) l
988 const T &getFolder() { return Folder; }
989
990 /// Insert and return the specified instruction.
991 template<typename InstTy>
992 InstTy *Insert(InstTy *I, const Twine &Name = "") const {
993 this->InsertHelper(I, Name, BB, InsertPt);
994 this->SetInstDebugLocation(I);
995 return I;
996 }
ただし、template なので 109箇所にいっぺんに break point がかかるらしい。
No comments:
Post a Comment