llvm

llvmでsizeof

LLVMのアセンブリ言語で構造体のサイズ(その構造体を表現するのに必要なバイト数)を取得する方法。 C言語のsizeof演算子のような構造体(或いは型一般)のサイズを取得する直接的な方法はなさそうだけど、対象となる構造体のポインタの値を利用して算出するこ…

llvm: ビットコードのデコード

LLVM Bitcode File Format — LLVM 3.4 documentationを読んでllvmのビットコードをデコード(パース)してみたので、そのメモ(あくまでも個人用メモ。用語とかは結構自分の好き勝手に書いているので、ちゃんと知りたい人はオリジナルのドキュメントを参照のこ…

llvm : tutorial : jit

チュートリアル第四章『4. Kaleidoscope: Adding JIT and Optimizer Support — LLVM 3.4 documentation』の2。タイトルにはJITとあるが、僕のこれまでの進め方ではチュートリアル通りのJITは実現できないので、似たような動作をする方法でごまかす。 実装 …

llvm : tutorial : optimize

チュートリアル第四章『4. Kaleidoscope: Adding JIT and Optimizer Support — LLVM 3.4 documentation』。 タイトルの通り、ここではJIT(を用いたRead-Eval-Print-Loop)とoptimizeがKaleidoscopeに加わっている。 前者は少しやっかいなので、分割して今回は…

llvm : tutorial : code generation

llvmのチュートリアルの続き。 今回はパースして得られた抽象構文木から、llvmの(llvm IRの?)コードを生成する。 概要? オリジナルのチュートリアルでは、コード生成にC++のビルダクラスが使われているが、common lisp用のそういったモジュールは用意されて…

llvm : tutorial : lexer,parser

llvmに関する基本的な(?)ドキュメントには一通り目を通した感じなので、次は『LLVM Tutorial』に沿って、Kaleidoscopeという言語を実装してみることにする。 上記チュートリアルでは実装言語として、C++及びOCamlが用いられていたが、自分はcommon lispが一…

llvm : 例外処理

llvm(2.6)での例外処理。 例外処理のドキュメン*1は一応用意されているのだが、簡潔かつ実例が皆無なので、試すのに結構苦労した。 以下は、その簡単なまとめとメモ。 llvmでの例外処理の種類 llvmであらかじめサポートされている(?)例外処理の方法は三つ。 …

llvm : GC, bitcode

llvmのGC*1およびビットコード*2に関するドキュメントに、ごく簡単に目を通す。 GC llvmはすぐに使えるようなGCを提供してはいなかった。 ただ、GCを組み込むことはあらかじめ想定されており、そのためのフレームは用意されているようなので、GCを実装・利用…

llvm : 'phi' Instruction

『LLVM Language Reference Manual — LLVM 3.4 documentation』を引き続き読む。 phi命令の動作が読んだだけでは分からなかったので、実際に動かして試してみた。 コード: ;;; ファイル名: phi.ll ;;; コンパイル: llvm-as phi.ll -o phi.bc ;;; コマンドの…

llvm : ハノイの塔

少し面白そうだったのでllvm(Low Level Virtual Machine)のマニュアル*1を読んでみる。 今日は、半分くらいまで読んで終了。 現時点の知識で、ハノイの塔を実装してみた。 ;;; ファイル名: hanoi.ll ; printf関数に渡すフォーマット文字列 @.MSG = internal …