Create your own awesome maps

Even on the go

with our free apps for iPhone, iPad and Android

Get Started

Already have an account?
Log In

llvm source review by Mind Map: llvm source review
0.0 stars - reviews range from 0 to 5

llvm source review

Build してる pass は

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

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

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

Memo

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

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

いちいち cd 使わない

Global-Font-Lock

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

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

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

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

pointee

指し示されるもの

llvm は assert が多い

scope spec 括弧の範囲

C++は引数が増える

縦に並べることが多い

Parser は小ルーチンで動く

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

Cのラベル

goto文の hoge: とか

LHS left hand side

木の左側。右側はRHS

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

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

SS -> ScopeSpec

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

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

LookupResult

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

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

ExprResultがおそらくExprなので

DeclRefExpr

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

ADL:UseArgumentDependentLookup

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

Stmt でキャスト

getStmtClassName() で辿れる

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

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

fghfghfg

fghfghfg

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

fghfghfg

ダメなコメントばっかり

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

include がそばにないとダメ

publicは普通上だろ

doit とか最低

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

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

わかりづらい

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

FI -> CGFunctionInfos

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

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

ABI -> ApplicationBinaryInterface

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

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

C++のnewは重い

DenseMapはハッシュテーブル

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

return twiceはgccの専門用語

QualType は const とか volatile とか

return の処理はけっこう重い

instructions と instruction がある

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

AggValueSlot

変数の受け皿

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

スコープの実装

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

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

Init->dump()

int 3 を確認

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

visitor pattern

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

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

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

GoF

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

singleton,visitor,factory method など

virtual

仮想関数

Java の関数は全部 virtual

Macho は MacOS のこと

DwarfException

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

driver.cpp

argv[0]

ポインタではない

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

GetExecutablePath

argvはポインタじゃない

OwningPtr.h

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

namespace llvm

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

LLVM_DELETED_FUNCTION

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

reset()

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

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

&operator()

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

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

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

cc1_main.cpp

Clang->getFrontendOpts().Plugins

vector, 長さのある配列

IntrusiveRefCntPtr.h

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

0になったら Delete

ref_cnt

mutable, 変更可

カウンタ変数

Retain()

カウンタを増やす

Release()

カウンタを減らす

getPtr()

CompilerInstance.cpp

FrontendAction.cpp

CodeGenAction.cpp

ParseAST.cpp

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

ParseAST.h

AST.h

Decl.h

tree を表すオブジェクト

compile するとき Type Location が必要

ASTContext

情報を保持している

lvalue

代入されるほう

MaxFunctionScopeDepth

ネストの最大数

255

宣言の構文

getName()

変数名取れた

Expr.h

式の構文

Stmt.h

Preprocessor.cpp

SourceManager.cpp

include とかを処理

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

EnterSourceFile へ

file パースしてる?

Lexer.cpp

LexTokenInternal

かっこいい!

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

CurPtr で ソース見れるよ

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

コメントがいいよなあ

最初の方に書いた部分

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

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

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

SourceLocation.h

Parser.cpp

Tok

enum

Tok.getkind() で見れる

Parsed AttributesWithRange __xx__ のやつ

PP preprocessor

ParseDecl.cpp

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

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

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

スコープをセーブ

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

altivec

PowerPC のベクトル演算

switch 文 -> int i [] とか

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

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

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

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

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

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

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

imaginary int とか。imaginary は複素数

Preprocessor.h

Lexer.h

ResultStartToken がいる

ModuleBuilder.cpp

Builder

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

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

getType().arrangeGlobalDeclaration

マップを取ってくる

CodeGenModule へ

Types, clnag::CodeGen::CodeGenTypes

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

CodeGenTypes へ, コメントが入れ替わってる?, 4ってなんだよ, template だからなにを入れてもいい, ポインタセットが4つってこと, ConvertTyps, clang の tree を llvm の tree に変換する, 一回変換してしまえばあとは簡単

llvm::Function::Create, ここで llvm の Function を作ってる

F->getFunction()->getTypeID(), これで人が読めるように表示できる

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

CodeGenFunction へ, やっとわかりやすい名前に関数に出会えた, GenerateCode(), ResTy.getTypePtr()->getScalarTypeKind(), STK_Integral, integer が見たかった, ResTy.dump() で見れる, int identifier を確認, StartFunction(), BasicBlock, 条件分岐から条件分岐の間をこと, PrologueCleanupDepth, スタックの確保, レジスタの確保, インデックスレジスタのコピー, そのための中間木つくってる, コードは生成していないはず, indirect goto, C の拡張にある

GlobalDecl へ

PointerIntPair へ, 空いてる2ビットをタグに使う, small integer と pointer のテクニック, いまとなっては古い, pointer が短くなる, 3ビットは使う

CGCall へ

Qual は Qualify のこと?

FTy, FunctionType でキャストすれば

CC は C Compiler, アーキテクチャごとに, PowerPC は消えた?

ClangCallConvToLLVMCallConv(info.getCC()), unsigned が返ってくる

FI, FunctionInfo

FoldingSet へ, InsertNode, hash table

DenseMap へ, LLVMContextImp1 へ, hash_combine で hash table を返す, Hashing へ, 素数が入ってる, buffer pointer を作って combine する, Open hash かどうかはわからなかった

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

TargetInfo へ, return value のついて色々やってる

8とかやめて

Types へ

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

Function.h

CodeGeneration

ResTy.dump()

int identifierが見れた!

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

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

BBはBasicBlock

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

SetInsertPoint

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

ReturnValueを作る理由

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

ちなみにRetuenValueはllvmのValue, そういう変数?, LLVMの中間木そのもの

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

EmitStmt

getBody, Body -> { ... } の中

EmitFunctionBody, S->getStmtClass()

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

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

EmitAutoVarAllocaが変数を作る部分

getIdentifier()->getName(), 変数aがとれた!!なまえね

local変数なのでGC擦る必要がない, GarbageCollection

TrancelationUnit, EmitBackendOutput, FPM : FunctionPassManager, 関数の中でのパス, passmanagerはパスをたくさんもってる。, EmitVisibility, AsmPrinter.cpp, x86側にはきてない, DF, デバッグ用のバイナリフォーマット, DD, dwarfdebug, MCFragment, マシンコードの一部を生成している, insertが命令を入れている。, createLazy, addOpでpushbackされる?, outStreamer.EmitInstruction()でアセンブラ吐かれてる, InstructSelectionが直接的なコードを吐く場所。, TTI.get(X86.RET), X86のreturnを吐く

BackendUtil

オプション関係の処理

EmitAssemblyHelper

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

FunctionPassManager

関数の展開を最適化

cl

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

PassManager へ

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

最初の Pass を取ってくる, 最適化をかける前

getName() で取ってこれる

Verifier は pass?

FP->getPassName(), pass を確認できる

X86AsmPrinter.cpp

COFF

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

AsmPrinter へ

EmitCostantPool(), ものによっては float の定数を table で出さないといけない

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

EmitVisibility(), Assembler を出力しないから今回はなにもしてない?, オプションを指定すれば

EmitLinkage

MCMachOStremaer へ

II, opcode の iterator

AsmPrinter.h

間接呼び出しされる