llvmでsizeof
LLVMのアセンブリ言語で構造体のサイズ(その構造体を表現するのに必要なバイト数)を取得する方法。
C言語のsizeof演算子のような構造体(或いは型一般)のサイズを取得する直接的な方法はなさそうだけど、対象となる構造体のポインタの値を利用して算出することが可能。
;; 整数値のペアを保持する構造体(の型) %PAIR = type {i32, i32} ;; %PAIR型のサイズを取得する ;; 次のC言語の文に対応: int size = (int)((PAIR*)(NULL)+1); %size = i32 ptrtoint (%PAIR* getelementptr (%PAIR* null, i32 1) to i32
malloc関数に渡すバイトサイズをどうやって求めたらいいのか分からなかったので、リファレンスを調べていたらllvm.memory.barrier関数のexampleにそのものの例が掲載されていた。
sizeof演算子的なものに拘り過ぎていて、なかなか気づかなかった(見つけられなかった)けど「ポインタ値の差分からバイトサイズを算出する」といったことは、配列の中身をバイナリファイルに書き出す際などには普通に行なっていることなので、分かってみればまあ納得。
直截的ではないと思うけど。