LLVMのActionResultはポインタタグを使っているのね。ポインタは下2bit-3bit空いているのが普通。そこにフラグを入れるのをポインタタグという。その変換にいろんなテクニックがあるんだけど、LLVMは Template を使っているらしい。はいはい。
PtrTy get() const {
void *VP = reinterpret_cast<void *>(PtrWithInvalid & ~0x01);
return PtrTraits::getFromVoidPointer(VP);
}
これねぇ。
p *RHS.take()
とかすると良いようです。
CompundStatement は配列ですか。別に普通にリストで良かったと思うんだけど。
Body = new (C) Stmt*[NumStmts];
うーん。さらに SmallVector も使っているらしい。
コンパイラで富豪プログラミングすると結構ハマることも確かなんだけどね。LISPっぽく全部リストにして欲しかったかな。gcc はリストだったはず。
iterator 使えば見かけは同じという説もあるけどさ。でも、せこいプログラミングだと読みづらいよ。
たぶん、デバッグ用のブラウザがあると思うんだけど。
あと、gdb が enum をうまく扱えないので少し困りました。
enum TokenKind {
#define TOK(X) X,
#include "clang/Basic/TokenKinds.def"
NUM_TOKENS
};
で、*.h にないっては愛嬌があるんだけど
p (int)tok::identifier
とか動くんだけど、逆がだめ。
p (enum tok::TokenKind)257
が表示できない。
p tok::identifier
だと、
$10 = tok::identifier
とかでるくせに〜
明日は、コード生成を読むつもりです。が、どうなることやら… 今日も結構はまったしな〜
No comments:
Post a Comment