llvm source review

Get Started. It's Free
or sign up with your email address
llvm source review by Mind Map: llvm source review

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を吐く