きつねさんとおぼえるLLVM の訂正個所【2013年2月24日追記】

C83 にて頒布した
きつねさんとおぼえるLLVM
の訂正個所について、
読者の方から頂いたコメント、
および筆者が読み返して見つけたものを纏めました。
ご確認をお願いします。
(今後新たに訂正個所が見つかった場合は適宜追加します)

※本エントリは同人誌版の「きつねさんとおぼえるLLVM」の訂正箇所一覧です
 電子書籍「きつねさんでもわかるLLVM」の訂正一覧はこちらをご覧ください

repeatedlyさんから頂いた訂正個所とコメント

p6:
(誤)コンパイラ基盤はコンパイラ基盤を作るための〜
(正)コンパイラ基盤はコンパイラを作るための〜


p36:
【コメント】
for.condに到達する変数iの定義が複数存在
とあるが%iもint iも一度しか登場していない

【回答】
ご指摘ありがとうございます。
ご指摘の通り、"定義が"という表現は正確ではありません。
for.cond に到達する複数のブロック内で変数iに対する値の代入が行われる
ということを意図していました。


p64:
(誤)上記の構文図からもわかると思いますが,visitFunctionDeclaration とvisitFunctionDefinitionは
(正)上記の構文図からもわかると思いますが,function declaration とfunction de nfiitionは


p73:
(誤)visitAssignmentExpressionを再帰的に
(正)visitAdditiveExpressionを再帰的に


p95:
【コメント】
generateCallExpressionの処理内の10行目で
Function * func =Mod -> getFunction (" main ");
としているがmainではなくCurFuncではないか

【回答】
ご指摘の通り、CurFunc が正しいです。
Function * func =CurFunc;
が正しい処理となります。
コーディング時に仮で置いていた処理の修正漏れです・・・。


p111:list5.63 に対する行数
(誤)9行目、13行目、
(正)それぞれ13行目、17行目


p113:list5.65
(誤)dcc test.dc -o test.ll
(正)dcc test.dc -o test.ll -jit


p141:3行目,list6.2
(誤)getRequired
(正)getAnalysis


筆者側で確認している訂正個所

p7:コンパイラ基盤としてのLLVM Core 3行目
(誤)ユーザはLLVM は特定の言語やアーキテクチャに対する〜
(正)ユーザは特定の言語やアーキテクチャに対する〜


p15:trunk からソースコードを取得する場合のcompiler-rt の取得
(誤)cd ../llvm/projects
(正)cd ../projects


p15:■ビルドとインストール 内、インストールディレクトリの作成
(誤)mkdir /usr/local/llvm
(正)sudo mkdir /usr/local/llvm


p15:■ビルドとインストール 内、configure時の投入コマンド
(誤)../src/configure --prefix=/usr/local/llvm --enable-optimized
(正)../llvm-3.1.src/configure --prefix=/usr/local/llvm --enable-optimized


p15:Debug ビルド時のconfigure時の投入コマンド
(誤)$ ../src/llvm-3.1.src/configure --prefix=/usr/local/llvm --disable-optimized --enable-assertions --enable-debug-runtime --enable-debug-symbols
(正)$ ../llvm-3.1.src/configure --prefix=/usr/local/llvm --disable-optimized --enable-assertions --enable-debug-runtime --enable-debug-symbols


p40:下から4行目
(誤)正式な紹介は後の節で行います
(正)既に命令の紹介をしているので該当の文を削除


p41:1行目
(誤)range Metadata は後述するload 命令に付加できるMetaData です
(正)range Metadata はload 命令に付加できるMetaData です
  (既にLoad命令は紹介しています)


p90:■generateFunctionStatement 1行目
(誤)generateFunctionStatement ではFunction のボディとを生成します
(正)generateFunctionStatement ではFunction のボディを生成します


p100:list 5.50内 8行目
(誤) if( InputFilename . length ==0){
(正) if(opt.getInputFileName().length()==0){


p109:6行目 注釈15の挿入位置
(誤)〜MachineCode ベースでJIT を行うのだと思います の末尾
(正)次の文(〜JIT コンパイルの実行に嬉しいことがあるのではないかなと予想しています) の末尾


p126:表5.10 llvm::cl::OneOrMoreの概要
(誤)1回以上指定さ.
(正)1回以上指定される.


2013年2月10日追記
p144:生成した共有ライブラリをLLVM IRに適用する際のコマンド
(誤)opt -load easypass.so -mypass test.ll -S > /dev/null
(正)opt -load easypass.so -easypass test.ll -S > /dev/null


p145:debug-pass=Structureを付与してoptを実行する際のコマンド
(誤)コマンドが未記載となっている
(正)opt -load easypass.so -easypass test.ll debug-pass=Structure -S > /dev/null

tomoki_imai さんから頂いたコメント

p36:mem2regの適用コマンド
(誤)$ opt -S mem2reg loop.ll -o loop_reg.ll
(正)$ opt -S -mem2reg loop.ll -o loop_reg.ll

hayamiz さんから頂いたコメント

p25
【コメント】
Signed/Unsigned のオーバーフローって何?

【回答】
こちらは別エントリにて記載したいと思います。


p25
(誤)Unsigned とSigned でオーバーフローが発生した時にUndef Value(未定義の値) になる
(正)Unsigned とSigned でオーバーフローが発生した時にPoison Value になる


p27:表4.5 loadの書式
(誤)!¡index¿ = ! i32 1 align
(正)! = ! i32 1 align


p27:表4.5 LLVM のメモリアクセス演算子内,store命令の構文
(誤)
result = store [volatile] * [, align ] [, !nontemporal !] [, !invariant.load !]
result = store atomic [volatile] * [singlethread] , align
(正)
store [volatile] , * [, align ][, !nontemporal !]
store atomic [volatile] , * [singlethread] , align


p36:下から5行目
(誤)色々行った
(正)色々言った


p39:list4.14
(誤)¥00
(正)\00


p43:本章の概要
(誤)本章での説明では,〜が二回繰り返されている


p48:TokenSetクラスの実装
【コメント】
Setだと順序なしの集合を意味するので,クラス名はTokenStreamやTokenSequenceの方が良いのではないか

【回答】
コメントありがとうございます。
確かにクラス名はそちらの方が適切ですね。。。
既に公開して多くの人の目に触れてしまっているので,
簡単に変えていいのかなぁ。。。とも思うのでちょっと検討してみます.


p51
(誤)list5.7 冒頭のコメントのスタイルが他とずれている


参考資料
(誤)[4][5][6]の先頭にyearがついている
(正)yearは不要なので削除


2013年3月3日 追記

kariya_mitsuru さんから頂いたコメント

p54:list 5.8 AST の基底クラス
【コメント】
BaseAST のデストラクタが仮想関数になってないので、メモリリークが発生する

【回答】
ご指摘の通りです。
pull request で頂いた通り、BaseASTのデストラクタを下記のように修正するのが正しいです。
virtual ~BaseAST(){}


p57:list 5.9 各種ステートメントのAST
【コメント】
BinaryExprAST にデストラクタが無いので、メモリリークが発生する

【回答】
こちらもご指摘の通りです。
pull request で頂いた通り、下記のように修正いたします。
~BinaryExprAST(){SAFE_DELETE(LHS);SAFE_DELETE(RHS);}


p57:list 5.9 各種ステートメントのAST
【コメント】
NumberAST のデストラクタが定義されていない

【回答】
ご指摘ありがとうございます。
下記のデストラクタをNumberASTに追加いたします。
~NumberAST(){}


しかしこれは酷い・・・