llvm source review

登録は簡単!. 無料です
または 登録 あなたのEメールアドレスで登録
Rocket clouds
llvm source review により Mind Map: llvm source review

1. Build してる pass は

2. AS DS は値が返るべきノードのこと

2.1. AST ではないけど、パースしてく時の状態を持ち歩いている

2.2. 上記をパラメタとした状態遷移マシン

3. Memo

3.1. C++を書く人は構造体を使わない

3.2. llvm のコメントは謝罪が多い

3.3. いちいち cd 使わない

3.4. Global-Font-Lock

3.4.1. プロジェクターでやるときは便利

3.5. llvmのインスタンスは大文字

3.6. C++は使わない関数はリンクされない

3.7. 処理が分かるコメントが良い

3.8. pointee

3.8.1. 指し示されるもの

3.9. llvm は assert が多い

3.10. scope spec 括弧の範囲

3.11. C++は引数が増える

3.11.1. 縦に並べることが多い

3.12. Parser は小ルーチンで動く

3.13. ライセンスはライセンスを見ろ、というコメントはGood

3.14. Cのラベル

3.14.1. goto文の hoge: とか

3.15. LHS left hand side

3.15.1. 木の左側。右側はRHS

3.16. 大きなソースを読むときにtabを使うのは良くない

3.17. NameDeclとわかった瞬間にそれを作っておく。

3.18. SS -> ScopeSpec

3.18.1. この変数がどこで評価されるか

3.19. unresolvedlookExpr まだ解決していない変数 a * b の途中の「 a *」とか

3.20. LookupResult

3.20.1. へんすうてーぶるを見て来た結果

3.21. ResがもうASTになっているはず。

3.21.1. ExprResultがおそらくExprなので

3.22. DeclRefExpr

3.23. ReaはもうAST。GetStmtClassNameで実際のクラス名を取ることができる。

3.24. ADL:UseArgumentDependentLookup

3.24.1. 引数の型にいぞんしてどうこう

3.25. Stmt でキャスト

3.26. getStmtClassName() で辿れる

3.27. 通常で false を返すものは書くな

3.28. コード生成はできるだけ遅らせる

3.29. fghfghfg

3.29.1. fghfghfg

3.30. コード中に C++ は記述できないので CXX と記述している

3.31. fghfghfg

3.32. ダメなコメントばっかり

3.33. p してもまったくわけがわからないのはちょっと

3.34. include がそばにないとダメ

3.35. publicは普通上だろ

3.36. doit とか最低

3.37. 綺麗に書くと遅いことが多い

3.38. いかにも頭の良い人が書いたソース

3.38.1. わかりづらい

3.39. 巨大なデータ構造をスタックに置きたがる

3.40. FI -> CGFunctionInfos

3.41. clang の途中で llvm にしなかったのは謎

3.42. 最初の一回だけ特別扱いするのはダサい書き方

3.43. ABI -> ApplicationBinaryInterface

3.44. llvm はほとんど for 文で書かれている

3.45. haskell に for 文はないのでこんな書き方できない

3.46. C++のnewは重い

3.47. DenseMapはハッシュテーブル

3.48. 人が読みやすいように出せないのかよ

3.49. return twiceはgccの専門用語

3.50. QualType は const とか volatile とか

3.51. return の処理はけっこう重い

3.52. instructions と instruction がある

3.52.1. これらはまったくべつもの

3.53. AggValueSlot

3.53.1. 変数の受け皿

3.54. あめのひはソースをよもう

3.55. スコープの実装

3.55.1. スコープは基本的には連想配列

3.55.2. それぞれに対応した表を持っている

3.56. Init->dump()

3.56.1. int 3 を確認

3.57. ローカル変数だからGCする必要なし

3.58. visitor pattern

3.58.1. 木を準備して、データと処理を分離する?

3.59. デザインパターンは基本的にアンチパターン

3.59.1. 見た目は綺麗。でも動作がいまいちわからなくなるよね。

3.59.2. GoF

3.59.3. 僕らが使おうとするとまずだめになる。

3.59.4. singleton,visitor,factory method など

3.60. virtual

3.60.1. 仮想関数

3.60.2. Java の関数は全部 virtual

3.61. Macho は MacOS のこと

3.62. DwarfException

3.62.1. Debug 用のバイナリフォーマット

4. driver.cpp

4.1. argv[0]

4.1.1. ポインタではない

4.1.2. コマンドが直接入っている

4.1.3. GetExecutablePath

4.1.4. argvはポインタじゃない

5. OwningPtr.h

5.1. llvm/Support/Compiler.hで全部入る

5.2. namespace llvm

5.2.1. javaでいうところのパッケージ

5.3. LLVM_DELETED_FUNCTION

5.3.1. OwningPtrが指しているものを消す

5.4. reset()

5.4.1. 指し示されるものを Delete する

5.4.2. 一度 tmp に入れたあとに最後に Delete

5.5. &operator()

5.5.1. null ポインタのチェックしている

5.5.2. null かどうか bool でチェックできる

5.6. コンパイラインスタンスが入っているポインタ

6. cc1_main.cpp

6.1. Clang->getFrontendOpts().Plugins

6.1.1. vector

6.1.1.1. 長さのある配列

7. IntrusiveRefCntPtr.h

7.1. リファレンスカウンタを持っている

7.1.1. 0になったら Delete

7.2. ref_cnt

7.2.1. mutable

7.2.1.1. 変更可

7.2.2. カウンタ変数

7.3. Retain()

7.3.1. カウンタを増やす

7.4. Release()

7.4.1. カウンタを減らす

7.5. getPtr()

8. CompilerInstance.cpp

9. FrontendAction.cpp

10. CodeGenAction.cpp

11. ParseAST.cpp

11.1. C++ 時点で弾いてる。構文解析もしない

12. ParseAST.h

13. AST.h

14. Decl.h

14.1. tree を表すオブジェクト

14.2. compile するとき Type Location が必要

14.3. ASTContext

14.3.1. 情報を保持している

14.4. lvalue

14.4.1. 代入されるほう

14.5. MaxFunctionScopeDepth

14.5.1. ネストの最大数

14.5.2. 255

14.6. 宣言の構文

14.7. getName()

14.7.1. 変数名取れた

15. Expr.h

15.1. 式の構文

16. Stmt.h

17. Preprocessor.cpp

18. SourceManager.cpp

18.1. include とかを処理

18.2. BufStr にソース読み込まれてる

18.3. EnterSourceFile へ

18.3.1. file パースしてる?

19. Lexer.cpp

19.1. LexTokenInternal

19.1.1. かっこいい!

19.1.2. 頑張って早くしないとだめ

19.1.3. CurPtr で ソース見れるよ

19.2. もっとでかくてわかりにくい関数にコメントつけろよ

19.3. コメントがいいよなあ

19.4. 最初の方に書いた部分

19.5. if 文で書くより switch のが速い?

19.6. if 文を排除する試みが多い

19.7. UCN はダメなもの? 恐らく Unicode? UpperCase~

20. SourceLocation.h

21. Parser.cpp

21.1. Tok

21.1.1. enum

21.1.2. Tok.getkind() で見れる

21.2. Parsed AttributesWithRange __xx__ のやつ

21.2.1. PP preprocessor

22. ParseDecl.cpp

22.1. parseattribute ソースコードのどこかを begin と end で示している

22.1.1. end の利点は表示するときに終わりがあったほうが便利

22.2. writtenBS は中括弧とかでたら保持

22.2.1. スコープをセーブ

22.2.2. スコープは名前の連想リスト

22.3. altivec

22.3.1. PowerPC のベクトル演算

22.4. switch 文 -> int i [] とか

22.4.1. アイデンティファイアがある場合とない場合両方で入る

22.4.2. :: はトークナイザで一つにまとめている

22.4.3. case kw_int で int が来たからそこへ

22.4.4. DS.Set~ は状態変更->あんまりいい書き方ではないけど…

22.4.5. 先に入れ物つくってあとから書き換えてる

22.5. (gdb) p Tok でトークン見れます

22.6. goto で switch 文の中に飛び込む…

22.7. imaginary int とか。imaginary は複素数

23. Preprocessor.h

24. Lexer.h

24.1. ResultStartToken がいる

25. ModuleBuilder.cpp

25.1. Builder

25.1.1. clang::CodeGen::CodeGenModule のインスタンス

25.2. cast<hoge> と (hoge) は同じはず

25.3. getType().arrangeGlobalDeclaration

25.3.1. マップを取ってくる

25.4. CodeGenModule へ

25.4.1. Types

25.4.1.1. clnag::CodeGen::CodeGenTypes

25.4.2. clang の parse tree を llvm の tree に変換する

25.4.3. CodeGenTypes へ

25.4.3.1. コメントが入れ替わってる?

25.4.3.2. 4ってなんだよ

25.4.3.2.1. template だからなにを入れてもいい

25.4.3.2.2. ポインタセットが4つってこと

25.4.3.3. ConvertTyps

25.4.3.3.1. clang の tree を llvm の tree に変換する

25.4.3.3.2. 一回変換してしまえばあとは簡単

25.4.4. llvm::Function::Create

25.4.4.1. ここで llvm の Function を作ってる

25.4.5. F->getFunction()->getTypeID()

25.4.5.1. これで人が読めるように表示できる

25.4.6. コンストラクタは全体に作られる

25.4.7. CodeGenFunction へ

25.4.7.1. やっとわかりやすい名前に関数に出会えた

25.4.7.2. GenerateCode()

25.4.7.2.1. ResTy.getTypePtr()->getScalarTypeKind()

25.4.7.2.2. ResTy.dump() で見れる

25.4.7.3. StartFunction()

25.4.7.3.1. BasicBlock

25.4.7.4. PrologueCleanupDepth

25.4.7.4.1. スタックの確保

25.4.7.4.2. レジスタの確保

25.4.7.4.3. インデックスレジスタのコピー

25.4.7.4.4. そのための中間木つくってる

25.4.7.4.5. コードは生成していないはず

25.4.7.5. indirect goto

25.4.7.5.1. C の拡張にある

25.5. GlobalDecl へ

25.5.1. PointerIntPair へ

25.5.1.1. 空いてる2ビットをタグに使う

25.5.1.2. small integer と pointer のテクニック

25.5.1.2.1. いまとなっては古い

25.5.1.2.2. pointer が短くなる

25.5.1.2.3. 3ビットは使う

25.6. CGCall へ

25.6.1. Qual は Qualify のこと?

25.6.2. FTy

25.6.2.1. FunctionType でキャストすれば

25.6.3. CC は C Compiler

25.6.3.1. アーキテクチャごとに

25.6.3.2. PowerPC は消えた?

25.6.4. ClangCallConvToLLVMCallConv(info.getCC())

25.6.4.1. unsigned が返ってくる

25.6.5. FI

25.6.5.1. FunctionInfo

25.6.6. FoldingSet へ

25.6.6.1. InsertNode

25.6.6.1.1. hash table

25.6.7. DenseMap へ

25.6.7.1. LLVMContextImp1 へ

25.6.7.1.1. hash_combine で hash table を返す

25.6.7.1.2. Hashing へ

25.6.7.2. Open hash かどうかはわからなかった

25.6.8. inserted()

25.6.8.1. inserted() が使われないと文句言われるので付けてる

25.6.9. TargetInfo へ

25.6.9.1. return value のついて色々やってる

25.6.10. 8とかやめて

25.6.11. Types へ

25.6.12. ループするときになにかあるかもしれないから2回

26. Function.h

27. CodeGeneration

27.1. ResTy.dump()

27.1.1. int identifierが見れた!

27.2. 引数を評価する順が決まっている

27.2.1. cは決まっていないけれどgccとの互換性のために決めている。

27.3. BBはBasicBlock

27.4. 普通はBuilderを使ってBBを作っている

27.5. SetInsertPoint

27.5.1. これからInsertする地点を設定

27.6. ReturnValueを作る理由

27.6.1. Jumpするときに返す値が必要だから

27.6.2. ちなみにRetuenValueはllvmのValue

27.6.2.1. そういう変数?

27.6.2.2. LLVMの中間木そのもの

27.6.3. コレを作り終わってからgenerateする

27.7. EmitStmt

27.7.1. getBody

27.7.1.1. Body -> { ... } の中

27.7.2. EmitFunctionBody

27.7.2.1. S->getStmtClass()

27.7.3. Slotは変数を格納できる場所を指す

27.7.4. {}でかこまれてるのがcompoundStatement

27.7.5. EmitAutoVarAllocaが変数を作る部分

27.7.6. getIdentifier()->getName()

27.7.6.1. 変数aがとれた!!なまえね

27.7.7. local変数なのでGC擦る必要がない

27.7.7.1. GarbageCollection

27.7.8. TrancelationUnit

27.7.8.1. EmitBackendOutput

27.7.8.1.1. FPM : FunctionPassManager

27.7.8.1.2. EmitVisibility

27.7.8.1.3. AsmPrinter.cpp

27.7.8.2. MCFragment

27.7.8.2.1. マシンコードの一部を生成している

27.7.8.2.2. insertが命令を入れている。

27.7.8.2.3. createLazy

27.7.8.3. addOpでpushbackされる?

27.7.8.3.1. outStreamer.EmitInstruction()でアセンブラ吐かれてる

27.7.8.4. InstructSelectionが直接的なコードを吐く場所。

27.7.8.5. TTI.get(X86.RET)

27.7.8.5.1. X86のreturnを吐く

28. BackendUtil

28.1. オプション関係の処理

28.2. EmitAssemblyHelper

28.2.1. オプティマイゼーションにしたがってオプションを処理

28.3. FunctionPassManager

28.3.1. 関数の展開を最適化

28.4. cl

28.4.1. clang と clang++ との共通オプション?

28.5. PassManager へ

28.5.1. pass の変更の有無で frag を変更

28.5.2. 最初の Pass を取ってくる

28.5.2.1. 最適化をかける前

28.5.3. getName() で取ってこれる

28.5.4. Verifier は pass?

28.5.5. FP->getPassName()

28.5.5.1. pass を確認できる

29. X86AsmPrinter.cpp

29.1. COFF

29.1.1. バイナリフォーマットの形式

29.2. AsmPrinter へ

29.2.1. EmitCostantPool()

29.2.1.1. ものによっては float の定数を table で出さないといけない

29.2.2. EmitFunctionHeader()

29.2.2.1. オブジェクトを直接吐く場合はバイナリに直接出す。それを選択してくれる。

29.2.3. EmitVisibility()

29.2.3.1. Assembler を出力しないから今回はなにもしてない?

29.2.3.1.1. オプションを指定すれば

29.2.4. EmitLinkage

29.2.5. MCMachOStremaer へ

29.2.6. II

29.2.6.1. opcode の iterator

30. AsmPrinter.h

30.1. 間接呼び出しされる