Saturday, 15 February 2020

LLVM CodeGen

三日目は、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: