1. OwningPtr.h
1.1. llvm/Support/Compiler.hで全部入る
1.2. namespace llvm
1.2.1. javaでいうところのパッケージ
1.3. LLVM_DELETED_FUNCTION
1.3.1. OwningPtrが指しているものを消す
1.4. reset()
1.4.1. 指し示されるものを Delete する
1.4.2. 一度 tmp に入れたあとに最後に Delete
1.5. &operator()
1.5.1. null ポインタのチェックしている
1.5.2. null かどうか bool でチェックできる
1.6. コンパイラインスタンスが入っているポインタ
2. cc1_main.cpp
2.1. Clang->getFrontendOpts().Plugins
2.1.1. vector
2.1.1.1. 長さのある配列
3. IntrusiveRefCntPtr.h
3.1. リファレンスカウンタを持っている
3.1.1. 0になったら Delete
3.2. ref_cnt
3.2.1. mutable
3.2.1.1. 変更可
3.2.2. カウンタ変数
3.3. Retain()
3.3.1. カウンタを増やす
3.4. Release()
3.4.1. カウンタを減らす
3.5. getPtr()
4. CompilerInstance.cpp
5. FrontendAction.cpp
6. CodeGenAction.cpp
7. ParseAST.cpp
7.1. C++ 時点で弾いてる。構文解析もしない
8. ParseAST.h
9. AST.h
10. Stmt.h
11. Preprocessor.cpp
12. SourceManager.cpp
12.1. include とかを処理
12.2. BufStr にソース読み込まれてる
12.3. EnterSourceFile へ
12.3.1. file パースしてる?
13. SourceLocation.h
14. ParseDecl.cpp
14.1. parseattribute ソースコードのどこかを begin と end で示している
14.1.1. end の利点は表示するときに終わりがあったほうが便利
14.2. writtenBS は中括弧とかでたら保持
14.2.1. スコープをセーブ
14.2.2. スコープは名前の連想リスト
14.3. altivec
14.3.1. PowerPC のベクトル演算
14.4. switch 文 -> int i [] とか
14.4.1. アイデンティファイアがある場合とない場合両方で入る
14.4.2. :: はトークナイザで一つにまとめている
14.4.3. case kw_int で int が来たからそこへ
14.4.4. DS.Set~ は状態変更->あんまりいい書き方ではないけど…
14.4.5. 先に入れ物つくってあとから書き換えてる
14.5. (gdb) p Tok でトークン見れます
14.6. goto で switch 文の中に飛び込む…
14.7. imaginary int とか。imaginary は複素数
15. ModuleBuilder.cpp
15.1. Builder
15.1.1. clang::CodeGen::CodeGenModule のインスタンス
15.2. cast<hoge> と (hoge) は同じはず
15.3. getType().arrangeGlobalDeclaration
15.3.1. マップを取ってくる
15.4. CodeGenModule へ
15.4.1. Types
15.4.1.1. clnag::CodeGen::CodeGenTypes
15.4.2. clang の parse tree を llvm の tree に変換する
15.4.3. CodeGenTypes へ
15.4.3.1. コメントが入れ替わってる?
15.4.3.2. 4ってなんだよ
15.4.3.2.1. template だからなにを入れてもいい
15.4.3.2.2. ポインタセットが4つってこと
15.4.3.3. ConvertTyps
15.4.3.3.1. clang の tree を llvm の tree に変換する
15.4.3.3.2. 一回変換してしまえばあとは簡単
15.4.4. llvm::Function::Create
15.4.4.1. ここで llvm の Function を作ってる
15.4.5. F->getFunction()->getTypeID()
15.4.5.1. これで人が読めるように表示できる
15.4.6. コンストラクタは全体に作られる
15.4.7. CodeGenFunction へ
15.4.7.1. やっとわかりやすい名前に関数に出会えた
15.4.7.2. GenerateCode()
15.4.7.2.1. ResTy.getTypePtr()->getScalarTypeKind()
15.4.7.2.2. ResTy.dump() で見れる
15.4.7.3. StartFunction()
15.4.7.3.1. BasicBlock
15.4.7.4. PrologueCleanupDepth
15.4.7.4.1. スタックの確保
15.4.7.4.2. レジスタの確保
15.4.7.4.3. インデックスレジスタのコピー
15.4.7.4.4. そのための中間木つくってる
15.4.7.4.5. コードは生成していないはず
15.4.7.5. indirect goto
15.4.7.5.1. C の拡張にある
15.5. GlobalDecl へ
15.5.1. PointerIntPair へ
15.5.1.1. 空いてる2ビットをタグに使う
15.5.1.2. small integer と pointer のテクニック
15.5.1.2.1. いまとなっては古い
15.5.1.2.2. pointer が短くなる
15.5.1.2.3. 3ビットは使う
15.6. CGCall へ
15.6.1. Qual は Qualify のこと?
15.6.2. FTy
15.6.2.1. FunctionType でキャストすれば
15.6.3. CC は C Compiler
15.6.3.1. アーキテクチャごとに
15.6.3.2. PowerPC は消えた?
15.6.4. ClangCallConvToLLVMCallConv(info.getCC())
15.6.4.1. unsigned が返ってくる
15.6.5. FI
15.6.5.1. FunctionInfo
15.6.6. FoldingSet へ
15.6.6.1. InsertNode
15.6.6.1.1. hash table
15.6.7. DenseMap へ
15.6.7.1. LLVMContextImp1 へ
15.6.7.1.1. hash_combine で hash table を返す
15.6.7.1.2. Hashing へ
15.6.7.2. Open hash かどうかはわからなかった
15.6.8. inserted()
15.6.8.1. inserted() が使われないと文句言われるので付けてる
15.6.9. TargetInfo へ
15.6.9.1. return value のついて色々やってる
15.6.10. 8とかやめて
15.6.11. Types へ
15.6.12. ループするときになにかあるかもしれないから2回
16. Function.h
17. BackendUtil
17.1. オプション関係の処理
17.2. EmitAssemblyHelper
17.2.1. オプティマイゼーションにしたがってオプションを処理
17.3. FunctionPassManager
17.3.1. 関数の展開を最適化
17.4. cl
17.4.1. clang と clang++ との共通オプション?
17.5. PassManager へ
17.5.1. pass の変更の有無で frag を変更
17.5.2. 最初の Pass を取ってくる
17.5.2.1. 最適化をかける前
17.5.3. getName() で取ってこれる
17.5.4. Verifier は pass?
17.5.5. FP->getPassName()
17.5.5.1. pass を確認できる
18. X86AsmPrinter.cpp
18.1. COFF
18.1.1. バイナリフォーマットの形式
18.2. AsmPrinter へ
18.2.1. EmitCostantPool()
18.2.1.1. ものによっては float の定数を table で出さないといけない
18.2.2. EmitFunctionHeader()
18.2.2.1. オブジェクトを直接吐く場合はバイナリに直接出す。それを選択してくれる。
18.2.3. EmitVisibility()
18.2.3.1. Assembler を出力しないから今回はなにもしてない?
18.2.3.1.1. オプションを指定すれば
18.2.4. EmitLinkage
18.2.5. MCMachOStremaer へ
18.2.6. II
18.2.6.1. opcode の iterator
19. AsmPrinter.h
19.1. 間接呼び出しされる
20. Build してる pass は
21. AS DS は値が返るべきノードのこと
21.1. AST ではないけど、パースしてく時の状態を持ち歩いている
21.2. 上記をパラメタとした状態遷移マシン
22. Memo
22.1. C++を書く人は構造体を使わない
22.2. llvm のコメントは謝罪が多い
22.3. いちいち cd 使わない
22.4. Global-Font-Lock
22.4.1. プロジェクターでやるときは便利
22.5. llvmのインスタンスは大文字
22.6. C++は使わない関数はリンクされない
22.7. 処理が分かるコメントが良い
22.8. pointee
22.8.1. 指し示されるもの
22.9. llvm は assert が多い
22.10. scope spec 括弧の範囲
22.11. C++は引数が増える
22.11.1. 縦に並べることが多い
22.12. Parser は小ルーチンで動く
22.13. ライセンスはライセンスを見ろ、というコメントはGood
22.14. Cのラベル
22.14.1. goto文の hoge: とか
22.15. LHS left hand side
22.15.1. 木の左側。右側はRHS
22.16. 大きなソースを読むときにtabを使うのは良くない
22.17. NameDeclとわかった瞬間にそれを作っておく。
22.18. SS -> ScopeSpec
22.18.1. この変数がどこで評価されるか
22.19. unresolvedlookExpr まだ解決していない変数 a * b の途中の「 a *」とか
22.20. LookupResult
22.20.1. へんすうてーぶるを見て来た結果
22.21. ResがもうASTになっているはず。
22.21.1. ExprResultがおそらくExprなので
22.22. DeclRefExpr
22.23. ReaはもうAST。GetStmtClassNameで実際のクラス名を取ることができる。
22.24. ADL:UseArgumentDependentLookup
22.24.1. 引数の型にいぞんしてどうこう
22.25. Stmt でキャスト
22.26. getStmtClassName() で辿れる
22.27. 通常で false を返すものは書くな
22.28. コード生成はできるだけ遅らせる
22.29. fghfghfg
22.29.1. fghfghfg
22.30. コード中に C++ は記述できないので CXX と記述している
22.31. fghfghfg
22.32. ダメなコメントばっかり
22.33. p してもまったくわけがわからないのはちょっと
22.34. include がそばにないとダメ
22.35. publicは普通上だろ
22.36. doit とか最低
22.37. 綺麗に書くと遅いことが多い
22.38. いかにも頭の良い人が書いたソース
22.38.1. わかりづらい
22.39. 巨大なデータ構造をスタックに置きたがる
22.40. FI -> CGFunctionInfos
22.41. clang の途中で llvm にしなかったのは謎
22.42. 最初の一回だけ特別扱いするのはダサい書き方
22.43. ABI -> ApplicationBinaryInterface
22.44. llvm はほとんど for 文で書かれている
22.45. haskell に for 文はないのでこんな書き方できない
22.46. C++のnewは重い
22.47. DenseMapはハッシュテーブル
22.48. 人が読みやすいように出せないのかよ
22.49. return twiceはgccの専門用語
22.50. QualType は const とか volatile とか
22.51. return の処理はけっこう重い
22.52. instructions と instruction がある
22.52.1. これらはまったくべつもの
22.53. AggValueSlot
22.53.1. 変数の受け皿
22.54. あめのひはソースをよもう
22.55. スコープの実装
22.55.1. スコープは基本的には連想配列
22.55.2. それぞれに対応した表を持っている
22.56. Init->dump()
22.56.1. int 3 を確認
22.57. ローカル変数だからGCする必要なし
22.58. visitor pattern
22.58.1. 木を準備して、データと処理を分離する?
22.59. デザインパターンは基本的にアンチパターン
22.59.1. 見た目は綺麗。でも動作がいまいちわからなくなるよね。
22.59.2. GoF
22.59.3. 僕らが使おうとするとまずだめになる。
22.59.4. singleton,visitor,factory method など
22.60. virtual
22.60.1. 仮想関数
22.60.2. Java の関数は全部 virtual
22.61. Macho は MacOS のこと
22.62. DwarfException
22.62.1. Debug 用のバイナリフォーマット
23. driver.cpp
23.1. argv[0]
23.1.1. ポインタではない
23.1.2. コマンドが直接入っている
23.1.3. GetExecutablePath
23.1.4. argvはポインタじゃない
24. Decl.h
24.1. tree を表すオブジェクト
24.2. compile するとき Type Location が必要
24.3. ASTContext
24.3.1. 情報を保持している
24.4. lvalue
24.4.1. 代入されるほう
24.5. MaxFunctionScopeDepth
24.5.1. ネストの最大数
24.5.2. 255
24.6. 宣言の構文
24.7. getName()
24.7.1. 変数名取れた
25. Expr.h
25.1. 式の構文
26. Lexer.cpp
26.1. LexTokenInternal
26.1.1. かっこいい!
26.1.2. 頑張って早くしないとだめ
26.1.3. CurPtr で ソース見れるよ
26.2. もっとでかくてわかりにくい関数にコメントつけろよ
26.3. コメントがいいよなあ
26.4. 最初の方に書いた部分
26.5. if 文で書くより switch のが速い?
26.6. if 文を排除する試みが多い
26.7. UCN はダメなもの? 恐らく Unicode? UpperCase~
27. Parser.cpp
27.1. Tok
27.1.1. enum
27.1.2. Tok.getkind() で見れる
27.2. Parsed AttributesWithRange __xx__ のやつ
27.2.1. PP preprocessor
28. Preprocessor.h
29. Lexer.h
29.1. ResultStartToken がいる
30. CodeGeneration
30.1. ResTy.dump()
30.1.1. int identifierが見れた!
30.2. 引数を評価する順が決まっている
30.2.1. cは決まっていないけれどgccとの互換性のために決めている。
30.3. BBはBasicBlock
30.4. 普通はBuilderを使ってBBを作っている
30.5. SetInsertPoint
30.5.1. これからInsertする地点を設定
30.6. ReturnValueを作る理由
30.6.1. Jumpするときに返す値が必要だから
30.6.2. ちなみにRetuenValueはllvmのValue
30.6.2.1. そういう変数?
30.6.2.2. LLVMの中間木そのもの
30.6.3. コレを作り終わってからgenerateする
30.7. EmitStmt
30.7.1. getBody
30.7.1.1. Body -> { ... } の中
30.7.2. EmitFunctionBody
30.7.2.1. S->getStmtClass()
30.7.3. Slotは変数を格納できる場所を指す
30.7.4. {}でかこまれてるのがcompoundStatement
30.7.5. EmitAutoVarAllocaが変数を作る部分
30.7.6. getIdentifier()->getName()
30.7.6.1. 変数aがとれた!!なまえね
30.7.7. local変数なのでGC擦る必要がない
30.7.7.1. GarbageCollection
30.7.8. TrancelationUnit
30.7.8.1. EmitBackendOutput
30.7.8.1.1. FPM : FunctionPassManager
30.7.8.1.2. EmitVisibility
30.7.8.1.3. AsmPrinter.cpp
30.7.8.2. MCFragment
30.7.8.2.1. マシンコードの一部を生成している
30.7.8.2.2. insertが命令を入れている。
30.7.8.2.3. createLazy
30.7.8.3. addOpでpushbackされる?
30.7.8.3.1. outStreamer.EmitInstruction()でアセンブラ吐かれてる
30.7.8.4. InstructSelectionが直接的なコードを吐く場所。
30.7.8.5. TTI.get(X86.RET)
30.7.8.5.1. X86のreturnを吐く