亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

從零構(gòu)建類LLVM IR框架:C語言實現(xiàn)編譯器后端核心原理與實踐

從零構(gòu)建類LLVM IR框架:C語言實現(xiàn)編譯器后端核心原理與實踐 1. 項目概述為什么一個Rust老手要回頭折騰C和LLVM IR如果你和我一樣是個在Rust生態(tài)里泡了多年的“老Rustacean”聽到“用C語言從零手搓一個LLVM-like的IR框架”這個想法第一反應(yīng)可能是這都202X年了放著現(xiàn)成的、安全的、現(xiàn)代的Rust不用回頭去折騰C語言是不是有點“返祖”了甚至有點“自虐”傾向我得承認一開始我也有同樣的疑惑。但驅(qū)動我啟動這個名為“Calico-IR”的項目的遠不止是技術(shù)懷舊。核心動機其實很實際深度理解編譯器后端的“黑盒”。Rust編譯器rustc的后端重度依賴LLVM我們享受著它帶來的優(yōu)秀代碼生成能力但對其內(nèi)部運作機制——尤其是中間表示IR的設(shè)計、優(yōu)化和降低lowering過程——往往停留在“知其然”的層面。當遇到一些棘手的代碼生成bug、性能調(diào)優(yōu)瓶頸或者想為特定領(lǐng)域比如嵌入式、新硬件架構(gòu)定制優(yōu)化時這種“黑盒”感就會變得非常強烈。你只能對著LLVM IR的文本輸出和一堆.bc文件撓頭或者去翻那浩如煙海的LLVM源碼過程相當痛苦。所以Calico-IR項目的目標很明確用C語言從最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)開始構(gòu)建一個簡化但核心完備的、類似LLVM IR的框架。這不是要造一個替代LLVM的輪子而是打造一個“教學(xué)級”或“實驗級”的工具。通過親手實現(xiàn)IR的構(gòu)建、遍歷、轉(zhuǎn)換和簡單的優(yōu)化來徹底吃透靜態(tài)單賦值形式SSA、基本塊Basic Block、控制流圖CFG、指令選擇等核心概念。C語言的選擇恰恰是因為它“足夠底層”——沒有RAII、沒有所有權(quán)系統(tǒng)、需要手動管理內(nèi)存這迫使你必須清晰地思考每一個數(shù)據(jù)結(jié)構(gòu)的生命周期、每一次內(nèi)存訪問的合法性這種“赤裸裸”的體驗對于理解編譯器后端這種系統(tǒng)軟件的本質(zhì)是無可替代的。這就像學(xué)開車自動擋Rust讓你快速上路但手動擋C能讓你真正理解離合、變速箱和發(fā)動機的協(xié)同。這個項目適合誰首先當然是像我一樣對編譯器后端感到好奇不滿足于只做前端的開發(fā)者。其次是那些希望深入理解程序如何從高級語言變成機器碼的學(xué)生或研究者。最后甚至包括那些想鞏固C語言編程、數(shù)據(jù)結(jié)構(gòu)與算法功底的實踐派。你會發(fā)現(xiàn)實現(xiàn)一個IR框架是對鏈表、哈希表、圖算法、內(nèi)存池等知識的絕佳綜合運用。2. 核心設(shè)計思路Calico-IR要模仿LLVM的哪些精髓設(shè)計Calico-IR首先要回答LLVM IR的核心抽象是什么我們不需要也做不到復(fù)現(xiàn)其全部但必須抓住幾個關(guān)鍵骨架。2.1 模塊、函數(shù)與基本塊的三級結(jié)構(gòu)LLVM IR采用層次化的模塊化設(shè)計Calico-IR也遵循此道。模塊Module這是IR的頂級容器對應(yīng)一個編譯單元比如一個.c文件。它持有全局變量列表和函數(shù)列表。在Calico-IR中我們用calico_module_t結(jié)構(gòu)體表示內(nèi)部包含兩個動態(tài)數(shù)組或鏈表分別管理全局變量和函數(shù)。函數(shù)Function模塊內(nèi)的子單元。它包含參數(shù)列表、基本塊列表以及重要的屬性如調(diào)用約定、是否內(nèi)聯(lián)等。calico_function_t需要記錄其所屬模塊、入口基本塊以及維護一個符號表用于快速查找命名的值如指令產(chǎn)生的虛擬寄存器?;緣KBasic Block函數(shù)內(nèi)線性執(zhí)行的指令序列只有一個入口點開頭和一個出口點結(jié)尾。出口通常是終結(jié)指令Terminator Instruction如跳轉(zhuǎn)br、返回ret。calico_basic_block_t需要包含指令鏈表、前驅(qū)基本塊列表和后繼基本塊列表這構(gòu)成了控制流圖CFG的邊。注意內(nèi)存管理是C項目的重中之重。我們必須為每個層級設(shè)計清晰的創(chuàng)建create和銷毀destroy函數(shù)。例如銷毀一個模塊必須遞歸地銷毀其下所有函數(shù)、基本塊、指令以及它們用到的所有值Value。稍有不慎就是內(nèi)存泄漏或懸空指針。2.2 值Value與指令I(lǐng)nstruction的統(tǒng)一抽象這是LLVM設(shè)計最精妙的地方之一。在LLVM中一切皆Value常量、參數(shù)、指令、基本塊、函數(shù)、全局變量都是Value的子類。這為數(shù)據(jù)流分析提供了極大的便利。Calico-IR也采用這種設(shè)計?;恈alico_value_t可以是一個簡單的結(jié)構(gòu)體包含一個類型枚舉標記它是常量、指令、參數(shù)等、一個指向具體數(shù)據(jù)的void*指針、一個使用此值的用戶User列表用于構(gòu)造def-use鏈以及一個唯一的ID或名稱便于調(diào)試。指令作為特殊的Valuecalico_instruction_t繼承自calico_value_t。它需要包含操作碼Opcode如add,icmp,load、操作數(shù)列表指向其他Value的指針以及它所處的基本塊。對于二元運算指令操作數(shù)就是兩個Value對于load指令操作數(shù)是一個指針Value。靜態(tài)單賦值SSA形式這是現(xiàn)代編譯器IR的基石。它要求每個變量只被賦值一次這極大地簡化了優(yōu)化算法。在Calico-IR中每條產(chǎn)生新值的指令如add,load本身就是一個獨立的Value它的結(jié)果虛擬寄存器由該指令代表。這意味著我們不需要“變量”只需要“值”。實現(xiàn)SSA的關(guān)鍵在于處理控制流合并處的值這需要引入φPhi指令。calico_phi_inst_t是一種特殊的指令它根據(jù)當前基本塊的前驅(qū)塊選擇對應(yīng)的輸入值。2.3 類型系統(tǒng)的簡化設(shè)計LLVM有著強大的類型系統(tǒng)支持整數(shù)、浮點、指針、數(shù)組、結(jié)構(gòu)體、向量等。對于Calico-IR我們初期可以大幅簡化。核心類型實現(xiàn)i1布爾、i8、i32、i64幾種整數(shù)類型以及float、double浮點類型。ptr指針類型可以簡單地表示為“指向某類型的指針”如ptr i32。類型對象設(shè)計一個calico_type_t聯(lián)合體union或帶標簽的結(jié)構(gòu)體來表示類型。類型對象應(yīng)該是不可變的并且可以被共享。例如所有i32類型實例可以指向同一個全局類型對象以節(jié)省內(nèi)存。指令與類型的綁定每條指令都需要知道其操作數(shù)的類型和其結(jié)果值的類型。這需要在創(chuàng)建指令時進行類型檢查。例如add指令的兩個操作數(shù)必須是相同類型的整數(shù)結(jié)果類型與之相同。這個設(shè)計過程讓我這個Rustacean感觸最深的是對“顯式”的回歸。在Rust里所有權(quán)和生命周期由編譯器檢查在C里每一個指針的歸屬、每一塊內(nèi)存的釋放都需要你親手繪制藍圖。實現(xiàn)Value的用戶列表use-def鏈時你需要手動在添加/刪除操作數(shù)時更新鏈表確保引用計數(shù)或關(guān)系的一致性這種“事必躬親”的體驗恰恰是理解復(fù)雜系統(tǒng)依賴關(guān)系的絕佳訓(xùn)練。3. 核心數(shù)據(jù)結(jié)構(gòu)與內(nèi)存管理實現(xiàn)用C語言實現(xiàn)一個復(fù)雜的IR框架數(shù)據(jù)結(jié)構(gòu)的設(shè)計和內(nèi)存管理策略直接決定了項目的健壯性和可維護性。這里沒有Box或Rc一切都需要手動安排。3.1 核心結(jié)構(gòu)體定義我們首先定義幾個核心的結(jié)構(gòu)體。為了清晰這里使用typedef創(chuàng)建易于理解的類型別名。// calico_value.h typedef enum { VALUE_CONSTANT, VALUE_INSTRUCTION, VALUE_ARGUMENT, VALUE_BASIC_BLOCK, VALUE_FUNCTION, VALUE_GLOBAL_VAR, } CalicoValueKind; typedef struct CalicoValue CalicoValue; typedef struct CalicoUser CalicoUser; // 用戶鏈記錄誰使用了這個Value struct CalicoUser { CalicoValue* user; // 使用此Value的指令或節(jié)點 struct CalicoUser* next; }; // 值的基類 struct CalicoValue { CalicoValueKind kind; CalicoType* type; // 類型信息 CalicoUser* users; // 使用此值的用戶鏈表 unsigned int id; // 唯一標識用于調(diào)試和打印 // 根據(jù)kind指向更具體的子結(jié)構(gòu) union { CalicoConstant* constant; CalicoInstruction* instruction; // ... 其他子類型指針 } sub; }; // calico_instruction.h typedef enum { INST_ADD, INST_SUB, INST_MUL, // 二元運算 INST_ICMP_EQ, INST_ICMP_NE, // 整數(shù)比較 INST_BR, INST_RET, // 終結(jié)指令 INST_PHI, // Phi指令 INST_LOAD, INST_STORE, // 內(nèi)存操作 INST_ALLOCA, // 棧分配 INST_CALL, // 函數(shù)調(diào)用 } CalicoInstOpcode; struct CalicoInstruction { CalicoValue base; // 繼承自CalicoValue CalicoInstOpcode opcode; CalicoBasicBlock* parent_block; // 所屬基本塊 // 動態(tài)數(shù)組存儲操作數(shù)Value指針 CalicoValue** operands; unsigned int num_operands; unsigned int operands_capacity; };3.2 內(nèi)存管理與對象池頻繁創(chuàng)建和銷毀Value和Instruction會帶來嚴重的性能問題和內(nèi)存碎片。一個常見的優(yōu)化策略是使用對象池Object Pool。指令池為每種指令類型預(yù)分配一大塊連續(xù)內(nèi)存一個數(shù)組或鏈表。當需要創(chuàng)建新指令時從池中取一個空閑槽位銷毀時并不真正釋放內(nèi)存而是將其標記為空閑并放回池中。這避免了頻繁調(diào)用malloc/free。歸屬性內(nèi)存管理采用“誰創(chuàng)建誰負責主要生命周期”的原則。例如CalicoBasicBlock負責其內(nèi)部所有Instruction的內(nèi)存。當銷毀一個基本塊時它遍歷指令鏈表將每條指令歸還給指令池而不是直接free。模塊Module則負責其下所有函數(shù)、全局變量的內(nèi)存。這種層級化的管理簡化了所有權(quán)邏輯。引用與清理Value之間的引用通過指針實現(xiàn)。當一個Value被銷毀時它需要遍歷自己的users鏈表通知所有“用戶”自己即將失效或者更常見的做法是確保銷毀操作只在更高層級如銷毀模塊時發(fā)生此時所有相關(guān)對象都被一并清理避免了復(fù)雜的實時更新。實操心得在實現(xiàn)初期我強烈建議先實現(xiàn)一個簡單的、基于malloc/free的版本并搭配Valgrind或AddressSanitizer進行嚴格的測試。確保基礎(chǔ)邏輯正確后再引入對象池等優(yōu)化。否則內(nèi)存錯誤會隱藏得很深。另外為所有核心對象設(shè)計一個dump()或print()函數(shù)用于將IR以可讀文本形式輸出這是調(diào)試的“生命線”。3.3 類型系統(tǒng)的實現(xiàn)類型對象應(yīng)該是輕量級且可共享的。// calico_type.h typedef enum { TYPE_INT, TYPE_FLOAT, TYPE_POINTER, TYPE_FUNCTION, TYPE_VOID, } CalicoTypeKind; struct CalicoType { CalicoTypeKind kind; unsigned int bit_width; // 用于整數(shù)類型如i32的32 struct CalicoType* pointed_to; // 用于指針類型指向目標類型 // 對于函數(shù)類型可能需要參數(shù)類型列表和返回類型 struct { CalicoType* return_type; CalicoType** param_types; unsigned int num_params; } func; }; // 全局類型表用于共享常見類型實例 extern CalicoType* calico_type_i32; extern CalicoType* calico_type_i1; extern CalicoType* calico_type_void; extern CalicoType* calico_type_float; CalicoType* calico_type_get_pointer(CalicoType* element_type); CalicoType* calico_type_get_function(CalicoType* return_type, CalicoType** param_types, unsigned int num_params);通過calico_type_get_pointer和calico_type_get_function這樣的工廠函數(shù)我們可以緩存和返回相同的類型對象避免重復(fù)創(chuàng)建。4. IR構(gòu)建器IRBuilder的實現(xiàn)與使用手動拼接指令、基本塊和值非常繁瑣且容易出錯。LLVM提供了IRBuilder類來簡化這個過程Calico-IR也需要一個類似的組件。4.1 IRBuilder的核心職責CalicoIRBuilder是一個狀態(tài)機它跟蹤當前插入指令的位置哪個基本塊的哪個位置并提供一組易于使用的API來創(chuàng)建指令和修改控制流。// calico_ir_builder.h typedef struct CalicoIRBuilder { CalicoModule* module; CalicoFunction* current_function; CalicoBasicBlock* current_block; // 指向當前基本塊中最后一條指令之后的位置 // 在實際實現(xiàn)中可能維護一個指向鏈表尾部的指針 } CalicoIRBuilder; // 設(shè)置當前插入點 void calico_ir_builder_set_insert_point(CalicoIRBuilder* builder, CalicoBasicBlock* block); // 創(chuàng)建指令的輔助函數(shù) CalicoValue* calico_ir_builder_create_add(CalicoIRBuilder* builder, CalicoValue* lhs, CalicoValue* rhs, const char* name); CalicoValue* calico_ir_builder_create_icmp_eq(CalicoIRBuilder* builder, CalicoValue* lhs, CalicoValue* rhs); CalicoValue* calico_ir_builder_create_load(CalicoIRBuilder* builder, CalicoValue* ptr, const char* name); void calico_ir_builder_create_store(CalicoIRBuilder* builder, CalicoValue* value, CalicoValue* ptr); // 控制流操作 CalicoBasicBlock* calico_ir_builder_create_basic_block(CalicoIRBuilder* builder, const char* name); void calico_ir_builder_create_cond_br(CalicoIRBuilder* builder, CalicoValue* cond, CalicoBasicBlock* true_block, CalicoBasicBlock* false_block); void calico_ir_builder_create_br(CalicoIRBuilder* builder, CalicoBasicBlock* target_block); void calico_ir_builder_create_ret(CalicoIRBuilder* builder, CalicoValue* ret_value);4.2 使用IRBuilder構(gòu)建一個簡單函數(shù)讓我們用IRBuilder構(gòu)建一個計算階乘的簡單函數(shù)int fact(int n)。CalicoModule* module calico_module_create(fact_module); CalicoIRBuilder builder; calico_ir_builder_init(builder, module); // 1. 創(chuàng)建函數(shù)類型: i32 (i32) CalicoType* param_types[] {calico_type_i32}; CalicoType* fact_type calico_type_get_function(calico_type_i32, param_types, 1); // 2. 在模塊中創(chuàng)建函數(shù) CalicoFunction* fact_func calico_module_create_function(module, fact, fact_type); builder.current_function fact_func; // 3. 創(chuàng)建入口基本塊 CalicoBasicBlock* entry_block calico_ir_builder_create_basic_block(builder, entry); calico_ir_builder_set_insert_point(builder, entry_block); // 4. 獲取函數(shù)參數(shù) CalicoValue* n_arg calico_function_get_arg(fact_func, 0); // 第一個參數(shù) // 5. 創(chuàng)建循環(huán)和基本塊 CalicoBasicBlock* loop_header calico_ir_builder_create_basic_block(builder, loop.header); CalicoBasicBlock* loop_body calico_ir_builder_create_basic_block(builder, loop.body); CalicoBasicBlock* exit_block calico_ir_builder_create_basic_block(builder, exit); // 6. 在entry塊判斷 n 1? CalicoValue* one_const calico_constant_int_get(calico_type_i32, 1); CalicoValue* cmp calico_ir_builder_create_icmp_sle(builder, n_arg, one_const); // 有符號小于等于 calico_ir_builder_create_cond_br(builder, cmp, exit_block, loop_header); // 7. 在loop.header塊實現(xiàn)循環(huán)歸納變量和條件判斷 calico_ir_builder_set_insert_point(builder, loop_header); // 這里需要Phi指令來處理循環(huán)變量i和累加結(jié)果acc的初始值與更新值 // 為簡化假設(shè)我們已創(chuàng)建了Phi節(jié)點i_phi和acc_phi CalicoValue* i_phi ...; CalicoValue* acc_phi ...; CalicoValue* loop_cmp calico_ir_builder_create_icmp_sgt(builder, i_phi, one_const); // i 1? calico_ir_builder_create_cond_br(builder, loop_cmp, loop_body, exit_block); // 8. 在loop.body塊計算 acc acc * i; i i - 1; 并跳回loop.header calico_ir_builder_set_insert_point(builder, loop_body); CalicoValue* new_acc calico_ir_builder_create_mul(builder, acc_phi, i_phi, acc.next); CalicoValue* new_i calico_ir_builder_create_sub(builder, i_phi, one_const, i.next); // 更新Phi指令的輸入在實際實現(xiàn)中需要在loop.header塊末尾添加Phi的incoming值 // ... calico_ir_builder_create_br(builder, loop_header); // 9. 在exit塊返回結(jié)果 calico_ir_builder_set_insert_point(builder, exit_block); // 另一個Phi指令決定返回1還是acc CalicoValue* ret_val_phi ...; calico_ir_builder_create_ret(builder, ret_val_phi);這個例子展示了IRBuilder如何讓IR的構(gòu)建過程更符合直覺。它隱藏了指令鏈表的插入、基本塊之間前驅(qū)后繼關(guān)系的維護等細節(jié)讓開發(fā)者專注于算法邏輯。注意事項Phi指令的實現(xiàn)是SSA形式中最容易出錯的部分。Phi指令必須位于基本塊的開頭并且它的每個“incoming”值必須對應(yīng)其父基本塊的一個前驅(qū)塊。在構(gòu)建控制流時當創(chuàng)建一條跳轉(zhuǎn)到某個包含Phi指令的基本塊的分支時必須同時更新該Phi指令為其添加一個來自當前塊的incoming值。這要求IRBuilder或創(chuàng)建者仔細維護這種關(guān)聯(lián)。5. IR遍歷、分析與簡單優(yōu)化有了IR我們就可以在其上進行分析和轉(zhuǎn)換。這是編譯器優(yōu)化的核心。5.1 支配樹Dominator Tree計算許多優(yōu)化如死代碼刪除、循環(huán)不變代碼外提都依賴于支配信息。一個節(jié)點d支配節(jié)點n意味著從入口節(jié)點到n的所有路徑都必須經(jīng)過d。計算支配樹的標準算法是Lengauer-Tarjan算法它的時間復(fù)雜度幾乎是線性的。在Calico-IR中實現(xiàn)我們需要深度優(yōu)先搜索DFS編號對控制流圖進行DFS為每個節(jié)點分配一個DFS序號dfn。半支配者Semi-Dominator計算這是Lengauer-Tarjan算法的核心。對于每個節(jié)點w找到其所有前驅(qū)v中具有最小半支配者sd(v)的節(jié)點。計算直接支配者Immediate Dominator, idom基于半支配者信息通過迭代查找確定每個節(jié)點的直接支配者。實現(xiàn)這個算法是對圖論知識的絕佳實踐。代碼會涉及大量的節(jié)點指針操作和集合/列表管理。計算出的支配樹可以附加到函數(shù)上供后續(xù)優(yōu)化使用。5.2 死代碼消除Dead Code Elimination, DCE這是一個經(jīng)典且有效的優(yōu)化。思路很簡單如果一個指令產(chǎn)生的值沒有被任何其他指令使用除了可能被它自己使用比如store指令并且該指令沒有副作用如store,call到可能帶副作用的函數(shù)ret那么這條指令就是“死”的可以安全刪除。實現(xiàn)步驟收集根指令遍歷函數(shù)中所有指令將具有副作用的指令store,call,ret等以及返回指令標記為“活的”live加入工作列表。這些是分析的起點。迭代傳播活躍性從工作列表中取出一條指令遍歷它的所有操作數(shù)即它使用的Value。如果某個操作數(shù)是一條指令而不是常量或參數(shù)那么將那條定義指令也標記為“活的”并加入工作列表。因為如果當前指令是活的那么它依賴的定義也必須是活的。刪除死指令再次遍歷所有指令刪除那些未被標記為“活”的指令。刪除時需要小心地從其操作數(shù)的users鏈表中移除自己如果某個操作數(shù)因此沒有了用戶它可能在未來迭代中也變成死代碼這需要多輪迭代直到收斂稱為“激進死代碼消除”。5.3 常量傳播與折疊Constant Propagation Folding這是另一個立竿見影的優(yōu)化。如果一條指令的所有操作數(shù)都是常量那么可以在編譯時計算出結(jié)果并用這個常量替換掉該指令。常量傳播在數(shù)據(jù)流分析中如果一個變量SSA中的Value被證明在某個點總是持有某個常量值那么所有使用該變量的地方都可以直接用該常量替換。常量折疊對于像add i32 5, 3這樣的指令我們可以直接計算出結(jié)果為8然后創(chuàng)建一個常量8并用它替換原來的add指令。這甚至適用于比較復(fù)雜的表達式只要操作數(shù)是常量。實現(xiàn)一個常量折疊函數(shù)calico_constant_fold(CalicoInstruction* inst)它檢查指令的操作碼和操作數(shù)如果所有操作數(shù)都是常量則執(zhí)行相應(yīng)的計算整數(shù)加減乘除、比較等返回一個新的常量Value否則返回NULL。然后在遍歷IR時可以嘗試折疊每條指令并用結(jié)果替換它。實操心得優(yōu)化Pass的設(shè)計最好采用“Visitor訪問者”模式。定義一個CalicoPass接口包含visit_function,visit_basic_block,visit_instruction等回調(diào)函數(shù)。每個具體的優(yōu)化如DCEPass、ConstPropPass實現(xiàn)這個接口。然后寫一個PassManager來按順序運行這些Pass。這樣添加新的優(yōu)化會非常清晰。在實現(xiàn)DCE時要特別注意指令之間的循環(huán)依賴雖然SSA形式減少了這種情況但通過內(nèi)存操作仍可能形成。確保你的算法能正確處理這些情況避免無限循環(huán)。6. 從IR到低級表示指令選擇與代碼生成初探最終我們的IR需要被轉(zhuǎn)換成特定目標架構(gòu)比如x86-64的機器碼或匯編。這個過程稱為代碼生成Code Generation其中第一步通常是指令選擇Instruction Selection。6.1 指令選擇簡介指令選擇的任務(wù)是將與機器無關(guān)的IR指令如通用的add、load映射到目標機器支持的、具體的機器指令序列上。例如一個IR的add指令在x86上可能對應(yīng)add指令在ARM上可能對應(yīng)ADD指令。但事情往往更復(fù)雜IR中的一條icmp整數(shù)比較指令在x86上可能需要用cmp指令設(shè)置標志位然后用set或條件跳轉(zhuǎn)指令來使用這個比較結(jié)果。一種經(jīng)典的方法是樹模式匹配。將基本塊內(nèi)的指令序列在SSA形式下可以看作一個數(shù)據(jù)流圖切分成一個個的“樹”Tree每個樹以一個“根”節(jié)點通常是產(chǎn)生結(jié)果并可能被后續(xù)指令使用的指令結(jié)束其葉子節(jié)點是常量、參數(shù)或內(nèi)存地址。然后我們有一個目標機器的指令描述表描述了每條機器指令對應(yīng)的“樹模式”以及生成的成本。指令選擇算法如動態(tài)規(guī)劃算法會為每個樹找到成本最低的機器指令序列來覆蓋它。對于Calico-IR這樣的教學(xué)項目我們可以實現(xiàn)一個極度簡化的版本。6.2 實現(xiàn)一個簡單的模式匹配器我們可以為目標架構(gòu)比如假設(shè)一個簡單的RISC風格虛擬機定義一組“模式Pattern”。typedef struct CalicoISelPattern { CalicoInstOpcode ir_opcode; // 匹配的IR指令 const char* asm_template; // 匯編模板如 add %dst, %src1, %src2 // 一個函數(shù)指針用于將IR操作數(shù)映射到匯編模板的占位符 void (*emit_asm)(CalicoInstruction* inst, FILE* out); } CalicoISelPattern; // 模式表 static CalicoISelPattern simple_patterns[] { {INST_ADD, add %0, %1, %2, emit_binary_op}, {INST_SUB, sub %0, %1, %2, emit_binary_op}, {INST_MUL, mul %0, %1, %2, emit_binary_op}, {INST_LOAD, ldr %0, [%1], emit_load_store}, {INST_STORE, str %1, [%0], emit_load_store}, // ... 更多模式 };然后指令選擇器遍歷每個基本塊中的每條指令查找匹配的模式并調(diào)用對應(yīng)的emit_asm函數(shù)該函數(shù)負責將具體的寄存器名或立即數(shù)填入模板并輸出到匯編文件流中。6.3 寄存器分配概念性在指令選擇后我們得到的是使用虛擬寄存器的匯編指令。真實的CPU只有有限數(shù)量的物理寄存器。寄存器分配Register Allocation的任務(wù)就是將無限多的虛擬寄存器映射到有限的物理寄存器上必要時將寄存器內(nèi)容“溢出”Spill到棧內(nèi)存中。這是一個NP難問題通常使用圖著色Graph Coloring等啟發(fā)式算法。對于Calico-IR我們可以實現(xiàn)一個極其簡單的“線性掃描寄存器分配器”它按指令順序分配寄存器當寄存器不夠時就選擇某個已分配的寄存器將其內(nèi)容保存到棧上溢出然后復(fù)用該寄存器。即使只實現(xiàn)一個非?;A(chǔ)的、可能效率不高的寄存器分配器這個過程也能讓你深刻理解編譯器后端在代碼生成階段面臨的核心挑戰(zhàn)如何在資源約束下高效地映射抽象的計算到具體的硬件。7. 調(diào)試、測試與常見問題實錄開發(fā)Calico-IR這樣的底層框架調(diào)試是家常便飯。以下是我在開發(fā)過程中積累的一些經(jīng)驗和遇到的典型問題。7.1 調(diào)試工具與技巧文本化IR輸出這是最重要的調(diào)試手段。為Module,Function,BasicBlock,Instruction,Value都實現(xiàn)一個dump(FILE*)函數(shù)以類似LLVM IR文本格式.ll文件打印出來。肉眼觀察IR的結(jié)構(gòu)是否正確是發(fā)現(xiàn)邏輯錯誤最快的方法。圖形化CFG實現(xiàn)一個將控制流圖導(dǎo)出為DOT格式Graphviz的函數(shù)。通過dot -Tpng graph.dot -o graph.png命令生成圖片可以直觀地看到基本塊之間的跳轉(zhuǎn)關(guān)系檢查循環(huán)、不可達代碼等問題。斷言Assert在代碼中大量使用assert。檢查函數(shù)前置條件如指針非空、數(shù)據(jù)結(jié)構(gòu)不變量如雙向鏈表的正確性、SSA屬性如Phi指令位于塊首等。在調(diào)試版本中打開斷言能快速定位違反約定的地方。內(nèi)存檢查工具務(wù)必使用Valgrind特別是Memcheck工具或編譯器自帶的AddressSanitizer (-fsanitizeaddress)來運行你的測試。C項目90%的詭異崩潰都是內(nèi)存錯誤越界、泄漏、重復(fù)釋放導(dǎo)致的。7.2 常見問題與排查表問題現(xiàn)象可能原因排查思路與解決方案程序隨機崩潰Segmentation fault1. 訪問了已釋放的內(nèi)存懸空指針。2. 數(shù)組越界訪問。3. 使用了未初始化的指針。1. 使用Valgrind/AddressSanitizer運行它會精確指出非法訪問的位置。2. 檢查所有內(nèi)存分配和釋放是否成對出現(xiàn)特別是復(fù)雜數(shù)據(jù)結(jié)構(gòu)嵌套銷毀時。3. 確保指針在解引用前已被正確賦值。內(nèi)存使用量持續(xù)增長內(nèi)存泄漏分配的內(nèi)存沒有被正確釋放。1. Valgrind的Memcheck或-fsanitizeleak可以檢測泄漏。2. 為每個create函數(shù)實現(xiàn)對應(yīng)的destroy函數(shù)并確保在模塊銷毀等高層操作中調(diào)用鏈完整。3. 檢查對象池的實現(xiàn)確保“釋放”操作正確地將對象放回空閑列表。IR構(gòu)建時出現(xiàn)奇怪的指令關(guān)聯(lián)錯誤指令的操作數(shù)指向了錯誤的作用域或已被刪除的Value。Phi指令的incoming值設(shè)置錯誤。1. 在dumpIR時同時打印每個Value的ID和其users列表檢查引用關(guān)系。2. 單步調(diào)試IRBuilder的API確保在設(shè)置Phi指令的incoming值時對應(yīng)的前驅(qū)塊關(guān)系已經(jīng)建立。3. 實現(xiàn)一個IR驗證器Verifier遍歷整個模塊檢查SSA屬性、控制流完整性、類型匹配等約束在每次Pass運行前后調(diào)用。優(yōu)化Pass改變了程序語義優(yōu)化算法有bug錯誤地刪除了有副作用的指令或改變了執(zhí)行順序。1. 為優(yōu)化前和優(yōu)化后的IR生成匯編或模擬執(zhí)行代碼對同一組輸入比較結(jié)果是否一致。2. 實現(xiàn)一個非常簡單的解釋器直接解釋執(zhí)行IR。用它對優(yōu)化前后的IR進行差分測試Differential Testing。3. 將優(yōu)化Pass分解為更小的步驟并保存每一步的IR快照定位引入錯誤的精確步驟。生成的代碼性能極差或邏輯錯誤指令選擇模式匹配錯誤或寄存器分配算法有缺陷。1. 手動檢查為關(guān)鍵代碼段如內(nèi)層循環(huán)生成的匯編看是否有冗余的加載/存儲spill過多或低效的指令序列。2. 對比LLVM為相同邏輯生成的匯編尋找差異點。3. 簡化你的目標架構(gòu)模型先確保功能正確再優(yōu)化性能。7.3 測試策略單元測試為每個核心數(shù)據(jù)結(jié)構(gòu)如鏈表、哈希表和算法如支配樹計算編寫?yīng)毩⒌臏y試。集成測試測試IRBuilder構(gòu)建IR的能力。編寫一個小型“前端”將簡單的算術(shù)表達式或控制流語句用自定義的AST表示轉(zhuǎn)換成Calico-IR然后dump出來檢查。端到端測試定義一組小的、有代表性的C語言子集程序如計算斐波那契數(shù)列、階乘。手動或?qū)懸粋€簡單的腳本將其翻譯成Calico-IR然后通過你的后端生成代碼或解釋執(zhí)行驗證結(jié)果是否正確。模糊測試Fuzzing生成隨機的、但語法合法的IR片段喂給你的優(yōu)化Pass或解釋器結(jié)合AddressSanitizer可以暴露出許多邊界情況下的錯誤?;貧wC語言編寫Calico-IR就像一次深度的“計算機系統(tǒng)原理”實踐。它強迫你重新關(guān)注內(nèi)存的每一字節(jié)、指針的每一次解引用、數(shù)據(jù)結(jié)構(gòu)的每一次遍歷。這個過程充滿了挑戰(zhàn)但每解決一個bug每實現(xiàn)一個優(yōu)化你對編譯器如何將高級思想轉(zhuǎn)化為機器指令的理解就加深一分。這種從底層構(gòu)建的理解是使用任何高級語言工具都無法替代的財富。當你再回頭使用Rust編譯器時面對那些LLVM錯誤信息你會有一種“我大概知道你在哪一層出了問題”的底氣這種底氣正是這個項目最大的回報。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
青青草综合在线| 激情文学88| 无码自拍SM| 一起草高清无码| 无码操逼天堂| 美骚妇av高清在线| 亚洲欧美大香蕉| 啪啪AV导航| 日本视频在线中文字幕| 日韩小电影| 97视频900| 人人澡人人弄| 少妇被玩视频二三区| 91中文在线| 性久久| 日本国产亚洲一区在线观看| 97在线免费观看| 91天天综合在线| 一区超碰一区| 中文字幕97| 九九九国产| 蜜桃香蕉久草精品在线| 99re6在线视频精品免费完整版安卓版| 美女诱惑1区2区| 人妻嗯啊啊在线播放| 97干在线视频| 丁香五月激情综合国产| 久久精品国产72国产精品福利 | 欧美大香蕉久| 日产操逼| 亚洲熟伦熟妇AV无码春色| 少妇淫妇久久久久久久| 青青草原伊人网| 玖玖资源视频一区二区三区| 久久精品国产97欧美精品亚洲 | 久久精品国产72国产精品福利| 亚洲天堂人妻一区二区| 人人色人人射人人妻| 偷拍 精品另类 凸凹了四区| 艾草av| 综合久欧洲| 欧美五区| 亚州九九九精品视频| 青青青艹在线视频| 骚妻少妇精品性色无码四色A V| 91 亚洲情侣偷拍 久久| 97精品一区二区视频在线观看| 人人妻人人色一区二区三区| 欧美色干| 收看日本人日bb| 亚洲一区二区三区中文字幕| 麻豆这里只有精品| 少妇99成人麻豆| 国产精品国产自产高清AV | 天天日天天操天天射河南省| 超碰美国| 一中国女人毛片水真多| www.激情| 中文字幕视频2区| 欧美最婬乱婬爆婬性视频 | 超碰97人人乐| 91亚洲人| 性色av网站| 久久婷婷精品| 国产精品亚洲四五区在线观看| 少妇第一页| 91久热| 久久久精精精| www.亚洲黄色| 国产超碰在线| 97资源免费视频| 久久精品女同亚洲女同13| 欧美性高潮| 国产高清不卡视频| 中文子幕一二三| 九七超碰| 懂色AV蜜臀无码精品APP| 婷婷激情五月| 蜜臀久久99精品久久久久久成人小说 | 欧美亚洲天天| 樱花蜜乳av| 欧美v亚洲v日韩v最新在线二区 | 久久性生大片免费观看性| 无码精品久久久天天影视| 久久98| 东北女人| 久久亚洲AV无码白度| 啪啪AV导航| 久久久久免费少妇| 亚洲做性| 操屄不卡视频| 色妇91| 成人精品无码| 91色情黑丝搞鸡在线观看一区二区三区三州| 一区二区三区日韩欧美 | 激情综合婷婷| 美女性91| 久久五月天婷婷| 久久激情视频| 亚洲男人天堂Av| 天天情欲宗合网| 18啪啪手机免费性爱| 欧美亚洲日韩人妻在线观看| 亚洲综合色在线| 岛国在线免费视频| 久艹伊人精品综合在线| 欧美激情久操网| 密桃99999| 亚州五月| 香蕉综合网| 人妻黑丝袜电影| 日韩中文字幕国产| 蜜臀AV成人精品蜜臀| 日本阿v天堂在线观看| 久久99亚洲精品久久99果| 亚洲在钱| 色色色色综合网| 国产精品对白自产拍| 乱伦日本色图AⅤ| 九一性生活免费视频| 免费日韩黄片| 小电影欧美91| 中文字幕一区 二区三四五 区日 日骚| 好一吊区二区| 97人妻碰碰中文无码久热丝袜| 熟女一区二区三区四区| 中文字幕 国产 精品| 中文字幕欧美精品亚洲日韩蜜臀| 一区二区三区激情在线观看| 久久精品无码专区| 一本一道人妻久久一区二区三区| 91精品老女人| 黄总AV色图| 国产精品直播在线观看直播| 欧美,日韩,中文,另类| 成人午夜视频免费播放| 97天天综合| 三级片大波波| 欧亚乱色熟女一区二区| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 91处女视频在线观看| 天天干天天舔| 国产欧洲精品亚洲午夜拍精品| 欧美日韩在线国产在线| 久久久久久久久女黄| 欧美黄色片AAAAA| 欧美亚洲首页| WWW.加勒比人妻一区不卡.com| 精品无码不卡视频| 欧美亚洲系列| 日韩精品电影| 人妻天天夜夜爽一区二区| 精品欧美不卡在线播放| 女上位精品在线| 亚洲国产精品乱码在线观看| 婷婷五月天激情网| yw尤物av无码点击进入麻豆| 欧美色图97| 日韩欧美麻豆大片| 黄色网址在线免费观看| 人妻无一区二区三区| 国产一| 熟妇视频一区二区三区在线观看| 毛片电影一区二区三区| 立川理惠被中出无码| 日韩不卡网操逼中文字幕日韩| 狠狠干综合| 国产一区二区三区免费视频在性观看| 亚洲日本大香蕉1| 97在线免费看| 激情六月天| 无码日韩人妻av一| 欧美一区二区日韩三区| 欧美精品三级黄片| 亚洲。日韩。欧美| 亚洲精品丝袜-不卡成人免费……| 欧洲成人性爱视频| 俄罗斯一区二区视频在线观看| 中文字幕午夜精品久久久| 精品国产一区二区久久| 翘臀vidoes| 久99视频| 日本色色色色色视频| 91老妇女| 97色欧洲| 久久伊人东京热| 天堂射| 一二三四免费视频| 女同在线视频一区| 91成人无码| 欧美拳交在线播放| 日韩黄色成人性爱| 丝袜美腿制服人妻二区中文字幕| 国产精品操| 97精品一区| 亚洲综合贴图91| 91丨人妻丨国产丨丝袜| 麻豆一区二区三区在线看| 久久一区二区加油站| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 五月丁香色婷婷| 天天看精品动漫视频一区| 日产成人久久| 丁香婷婷久久 | 日韩高潮一区| 99精彩视频| 色噜噜婷婷| 麻豆国产免费影片| 九九无码视频| 青草视频在线看看看看看看看看看| 国产一区二区三区精品观看啪| 亚洲中文字幕熟女少妇一区二区| 97精品在线| 狠狠爱夜夜干| 成人久久久精品| 国产第11页| 乳欲人妻办公室奶水| 亚洲阿v天堂在线| 久久三区四区| 国产第12页| 色天使亚洲综合在线观看| 久久这里是精品| 国产99精品一区二区三区免费| 国产亚洲精品久久久久小| AV一区观看| 天天做日日做| 中文字幕jul-617人妻熟女| 日本一级黄色电影| 天天操av懂色| 久久女同性恋一二区| 青青草无码视频| 青青草依人大香蕉| 人妻偷拍一区二区三区| 亚洲一区二区性爱电影| 69精品少妇一区二区三区蜜桃| http://qxhbdz.com| 99re不伦| 欧美日韩不卡传媒| av网站在线观看了| 我要看免费韩日黄片| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 97在线视频免费| 日韩在线观看三级电影| 欧美大香蕉久| 亚洲欧美国产其他二区| 色综合五月天| 久久网亚洲| 97在线视频网站| 精品国产一区探花在线观看| 97国产色综合| 亚洲操逼无码| 国产精品亚洲色婷婷久久久| 91超碰人人操| 天堂伊人久久| 久久在肏| 最好看的中文字幕在线2018| 久热九九| 日本精品一区二区三| 人人操人人肉久久精品| 91肏屄网| 婷婷五月天av| 亚洲国内精品成人不卡| 97操| 翔田千里av一区二区三区| 欧美五十路熟| 啊啊啊97视频| 97欧美精品| 闷骚老熟女15P| 免费精品中文字幕| 精品九九九| 欧美片第一页| 亚洲高清91| 国产多人在线观看视频| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 在线观看精品国产免费| 亚州免费啪啪视频| yiqicaoav| 人妻少妇久久久| 天美传媒麻豆一区二区三区国产精| 日韩激情电影中文字幕 | 99热在线不卡| 欧美成不卡网| 激情五月天中文字幕色| 天天干少妇| 精品超碰色| 亚洲无码AV九九九| 激情啪啪视频| 女人双腿搬开让男人桶| chaopen97久久| 国产小u女在线观看| 97久久免费| 国产精品成人AV片免费看网站| 久久乐| 天天躁日日躁狠狠狠躁| 亚洲欧美日韩夜夜| 91久久国产精品| 免费一级毛片在线视频观看| 无套内射性感少妇视频| 国产91丝袜在线播放蜜月| 熟妇操花| 视频不卡中文字幕| 校园春色亚洲欧洲| 人人做,人人操,人人摸| 91 综合 色| 囯产操逼片| 夜夜国自区| 色色色色电影网| 蜜臀久久99精品久久久久久成人小说 | 亚州综合在线| 女人一区| 久久亚洲AV无码专区国产精品 | 综合影院永久入口国产| 国精综合一二三区影视| 日本无码1| 智利AV在线网| 天天日少妇逼AV| 欧美日韩97| 亚洲瓯美色图| 六月丁香久久| 97久久国产精品女不卡| 色五月69夫妻| 亚洲丝袜色图| www.亚洲成人一区| 伊人午夜福利视频| 91美女中出| 国产精品片| 青青草五月天| 偷拍伦理视频| 激情抓乳插进去啪啪啪日韩| 视频在线97| 性做久久久久久免费观看软件| 久热久一区二区三区| 香蕉在线一区二区三区| 亚洲图片 91| 超碰这里只有精品| 色综合色欲色综合色综合色综合| 东京热双插| 欧美日韩国产电影| 97超碰jingpin| 国产高清精品一区二区三区毛片| 综合情欲网| 日韩三四五区| 久久草在线综合视频| 蜜臀无码视频在线观看| 清纯唯美综合亚洲| 少妇同性| 玖玖97综合 | 九九久久精品| 91成人在线免费视频| 91亚洲色图| 熟女久久久| 91无码西班牙视频在线| 中文字幕精品亚洲熟女| 日影院久久婷婷夜夜网| 色女99一级片在线观看| 亚洲综合97中文网| 97干在线| 日韩国产乱子伦App| 国产精品美女视频诱惑| 熟妇人妻丰满久久久久久久无码| 美女91av| 东北女人操比视频| 亚洲系列欧美| 亚洲国内精品成人不卡| 97色涩| 欧美日韩情色一区二区| 999在线电影香蕉| 激情综合婷婷| 欧美日韩岛国大片在线观看| 日本丝袜人妻内射| 久干9操| 人人操人人操人人人操| 亚欧美综合| 激情五月天婷婷| 亚洲色婷婷综合久久一区二区三区| 伊人网免费视频| 婷婷性网| 天天干天天日天天射黄色| 日韩BBN| 久久久久无码一妻区| 国产夫妻一区二区| 日han少妇无码| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 久久超碰爱| 99re视频在线观看这里只有精品| www久久99| 中文字幕av乱伦| 中文字幕精品资源在线| 开心五月婷婷激情| 女人的久久久| 日日干夜夜操视频h| 刺激精品视频| 亚州欧美综合| 丰满人妻-区二区三区免费看| 中出20p| 99re视频在线播放青草| 97在线视频免费| 偷拍精品一区二区三区| 亚洲性爱成人| AV不卡在线| 欧亚免费视频| 亚洲图片 91| 四季AV综合网址| 亚洲视频二区| 黄色成年| 亚州熟女乱伦| 郑州宾馆老熟女露脸啪啪| 久久久久久AⅤ无码免费肉站 | 伊人aaa| 国产高清在线自在拍69| 性色A∨91| 成人av在线播放| 中文字幕成人理论在线| 开心五月天激情网| 美美91成人国产精品欧美精品久久久久久久 | 国产免费一区| 亚洲91色| 韩国三级理论在线| 99国产精品人妻人伦| 亚洲色香| 亚洲精品久久久久毛片A片拉屎 | 好吊色一区| 国产精品第一页国产大屁股视频免费区i| 96国产精品| 操国产逼| 婷婷丁香成人| 91无码人妻| 国产深喉视频一区二区| 久久高清欧美国产| 淫色网综合| 亚州精品人妻一二三区| 亚洲影院成人| 六月激情网| 都市激情人妻一区二区青青操视频 | 欧美96在线|欧| 亚洲另类小说卡通动漫| 天天爽天天爽| 麻豆区久久久久亚| 亚洲黄色视频在线观看视频| 婷婷啪啪| 亚洲色图第一页| J?P?NESEHD熟女熟妇伦| 激情小说五月天| 91精品婷婷国产综合久久| 免费AV中文网在线观看| 97色色网| 亚洲春色欧美| 日本中文字幕在线视频| 青青伊人加勒比海| 黄片免费视频2019| 国产精品天美传媒| 精品对白久久不卡| 婷婷亚洲色| 日韩中文9| 免费的黄片有限公司| 一区二区三区 丝袜 高跟 美腿 | 精品一区二区三区最新| 中文字幕人妻丝袜乱一区三区| 免费伦费视频在线观看| 精品无码久久久久| 韩国一级婬片A片无码天美 | 高清无码一区二区三区| 国产亚卅97| 亚洲 中文字幕 精品| 久久免费老司机精品| 日本一级黄色电影| 97久久久久久久久久| 秋霞影音一区二区三区| 校园春色家庭伦理欧美激情| 秋霞一级视频在线观看免费| 久操av在线| 激情视屏国产乱伦强奸| 99在线观看视频在线高清| 人人干人人搞人人摸| 啊啊啊啊啊舒服| 久久高清欧美国产| 久肏视频字幕| 激情五月天婷婷| 欧美日韩传媒| 人人超碰在线观看黄| 午夜视频久久久久一区| 亚洲男人天堂2013| JULIA一区二区三区在线播放| 东京热AV男人的天堂| 99ri在线视频| 人人操,人人液| 97超碰天天爱天天爱| 久久无码一区二区二三区性色| 亚洲精品欧洲精品| 日本熟妇人妻中出视频| 校园春色美腿丝袜 | 久久精品中文字幕观看| 日韩有码 一区二区三区| 色综合超碰超| 操逼操逼逼操操逼91 | 久久久久9999精品九九九| 亚洲第一精品在线视频| 久久久久幕乱码| 蜜臀av在线播放一区二区三区| 久久久96| 九九九九免费视频| 日日夜夜天天| 一级aaaaa欧美中文字幕录像片| 国产日韩美女小穴视频网站不卡| 日韩偷拍色图| 最新日产中文在线麻豆| 亚洲综合在线第一页| 操逼内射干逼白丝91| 麻豆伊人网| 噜噜噜亚洲精品| 大香蕉黄色一级片免费看| 中文字幕精品亚洲熟女| 九一亚洲国产免费| 欧美视频边做饭边橾| 久久久久九九九| 嗯~啊~快点 死我视频免费看网站| 97久久超碰| 精品人妻1区| 亚洲高潮影院| 久久6热精品99视频| 日本操逼视频导航| 中文字幕精品日韩中文字幕| 老司机午夜精品视频| 黄色AAAAAAAAAAA大片| 色五月av| 久久久久久99999国产精品| 黄色成品网站| 人人人人人人少妇| 中文字幕性感少妇av| 成人无码在线视频网站| 中出欧美| 久久久一二三四区| 高清肉丝中文无码| 天天碰操中国年青熟妇| 男人天堂.AB| 色婷婷丁香五月天| 免费观看啪视频| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 亚洲影视高清三级-草1024榴社区入口-品爱AV| 91亚洲影院综合| 无码免费一区二区三区啪啪| 九九亚洲视频| 综合一区中亚洲国产成人综合精品| 中文字幕日韩精品久久| 欧美精品成人一区二区在线观看| 好吊色青靑草| 日韩十八禁| 男生通女生屁股| 疯操AV| 久久久久久久久国产| 在线观看视频91| 操b网站亚洲无码| 成人女人国产| 91撸色网 玖玖网 欧美| 亚洲棕合电彰| 玖玖资源中文字幕制服丝袜| 蜜臀99999| 99蜜桃臀亚洲成人在线观看| 高跟伊人julia ann| 日本999精品视频| 色九九九九| 殴洲老熟女| 青草视频人妻在线观看| 青青草久草AV| 午夜亚洲| 亚欧色图在线激情| 人妻一区二区三区视频 | 96爱综合| 亚洲色图欧美另类在线| 任我爽在线视频免费观看 | 97人人模人人爽人人| 亚洲精品亚洲人成人网| 久久99操天天日| 亚洲情色婷婷五月天| 久九九九九九九热| 91久久国产综合精品| 丝袜色综合| 久久精品操| 淫荡网址| 影音先锋视频在线| 国产亚洲国产超碰| 亚洲AV乱码专区国产噜噜亚洲| 你草精品在线视频| 青青草女人天天干| 精品国产乱码久久| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 岛国小电影| 久久m| 欧美精品黑人猛交高潮| 天天躁日日躁成人字幕aⅴ| 亚洲一卡2卡3卡4卡乱码网站 | 97精品97| 欧洲精品二区| 九月激情婷婷| 亚洲色吧网| 久久啊啊啊视频| 久久啊啊| 思思热影视| 无码人妻一区二区一牛影视| 熟女熟妇伦久久影院毛片一区二区| 国产精品白丝在线播放| 51一区二区三区| 亚洲色图激情小说| 天天摸天天舔天天操| 欧美熟妇精品黑人巨大91| 第四色奇米影视777| 国产亚洲综合欧美一区| A啊啊在线观看| 97这里有精品| 免费av大片| 啊啊啊啊二区好大| 男人天堂欧美| www.久久久久| 色天欧美| 国产成人无码a| 九九热九九热| 麻豆一区二区AV天美| 韩日性爱av| 淫色网综合| 久久女人| 亚洲欧美中文日韩视频中国语| 97精品久久久久久久| 亚洲一区二区AV| 欧美十八禁在线看| 精品人妻一二三四区视频| 26uuu久久| 日韩乱码Av| 在线二区不卡| 亚洲夜夜欢无码一区二区| 97操在线| 天天看天天在线精品| 台湾佬中文娱乐自偷自拍| 亚洲欧洲日韩中文字幕一区| 亚洲天堂人妻熟妇视频| 天天综合香 ld视频| 久久春色| 碰碰在线视频| 亚洲色人阁| 激情第四色| 亚洲黄色电影| 99热这里只有精品8| 噜噜瑟| 探花一区在线| 91美女高潮| 日本在线激情一区二区三区 | 久久草草亚洲蜜桃臀| 欧美日韩国产中文精品字幕自在自线,| 蜜臀AV一区二区三区| 欧洲熟妇xxXx欧美老妇裸体| av2014 日韩在线中文字幕| 日本性爱少妇| 67914在线兔费成人视频| 日本精品一区二区中文字幕| 日本黄色精品| 乱人伦 国语对白:视频直接看| 国产一二三在线视频五十路| 中文高清一区二区的| 欧美综合网| 亚洲色图加勒比| 7777奇米影视久久| 超碰97导航| 婷婷色色五月| 小说区 图片区色 综合区| 熟妇人妻一区二区| 免费观看国产不卡av| 91网站在线播放| 免费观看的av| 一级做a爰片性色毛片久久| 亚州色图欧美| 日本午夜精品理论片A级APP发布| 天天干人人乐| 91九色丨国产丨爆乳| 男女性感激情网站| 蜜桃天美传媒AV一区二区三区| 啊啊啊不要好疼视频| 亚洲欧洲自拍图片专区满春格| 日韩欧美偷拍美女视频| 凹凸视频特色日本特黄| 精品免费视频国产一区| 亚洲伊人久久精品影院| 大香网伊人久久综合| 中文字幕国产在线天堂| av72网| 人妻熟女一区在| www.久久制服糖| 国内精品99999| 免费人人搞97| 超碰狠狠操| 在线无码视频| 欧成人精品一区二区三区| 少妇三P| 99操99| 中国少妇XXXX做受| 91丝袜视频在线观看| 欧美猛交黑寡妇中文字幕| 99在线观看| 爽极品影院| 超碰91在线| 久久久久96| 美女的肌被草喷水视频| 色综合色综合网| 亚洲国产精品有声| 大学生美女口爆| 精品无av| 一区二区亚州激情久婷婷欧美| 欧美人妻精品| 97色干| 新婚人妻扶着粗大强行坐下| 中国农村熟妇毛片视频| 亚洲丝袜少妇在线| 大干人妻| 99精品高潮| 神马午夜久久久| 日韩素人无码一区二区三区三州| 日本在线视频导航| 日韩精品中文字幕一| 精品国产一区探花在线观看| 91无码精品| 亚洲乱熟女一区二区| 欧美亚洲高清不卡| 97色色国产视频| AV一二区| 尤物一级在线免费观看| 日本 成 人 小说 电影 一区二区| 亚洲精品aa久久伊人| 丝袜内射| 久久极品一区二区| 狠狠爱综合网| 日本熟女中文| 国产黄色av大片网站| 可以在线观看的黄色网址| 青女在线| 色老汉色| 亚洲人在线成线成人| 中文字幕 码 自拍 视频 区| 五月色网| 99亚洲天堂| 丁香五月影院| 狠狠穞A片一區二區三區| 大香蕉黄色一区| 国产精品99久久久www| 91精品无码人妻系列| 92午夜免费福利视频| 大香蕉一线视频| 成人国产精品三级A片| 中文自拍欧美影视| 99自拍视频在线| 丰满人妻-区二区三区免费| 婷婷中文字幕| 欧美制服网站美腿丝袜| 999日韩中文精品观看视频。| 精品少妇后入一区二区三区四区人妻巨乳 | 人人爽夜夜玩视频| 熟女久久| 97亚洲欧美| 日本伦乱九九九综合| 狠狠色伊人亚洲综合网站色| 熟妇的味道HD中文字幕| 无码操逼网| 91狼人| 乱人伦 国语对白:视频直接看| 欧美黑人猛交春色影视大全| 日日干夜夜操视频h| julia中文字幕在线观看| 伊人久久亚洲色欲综合网站 | 久热9| 91亚洲不卡一区| 日韩精品作爱导航| 久久风骚城市人| 97免费在线观看| .精品人妻一区二区三| 亚洲无码?第一页| 人人操av| 无码视频一区二区| 久区视频| 久久中文字幕一区不卡| 久久精品国产72国产精品福利 | 国产中文字幕在线观看| 亚洲国产综合图区中文字幕 | 人人摸人人舔一区二区| 97超碰美女| 日本免费一级AAA大片器| 中国探花熟女| 综合久欧洲| 91综合天天看| 91国产操逼视频| 探花一区在线| 91亚州欧美| 国产suv一区二区三区6| 亚洲图片色图欧美另类| 操操AV电影| 91九九九吃| 日本乱人伦片中文三区| 国产农村一一级特黄毛片| 色婷婷蜜臀av| 啊啊啊啊好爽好舒服一区二区易域| 久综合国内精品自在自线| 久久乐| 97欧美色综合| 久久久久久久久久va| 99热精品在线| 激情文学欧美| 91麻豆va国产精品| 麻豆精品A片免费观看| 九久久精| 成人美女av| 国产又大又粗又长视频在线| 欧在线一二区| 蜜桃无码AV一区二区| 超碰综合色| 91少妇| 亚洲欧美精品一区天堂久久| 国产极品久久久| 九九超碰综合网| 亚洲天堂五月天国产| 婷婷五月天成人网| 久久原创中文| 九九精品99| 日本午夜福利视频| 人妻铁牛TV| 丁香五月天视频| 久艹视频在线| av日韩在线观看电影| 青青草啪啪网| 欧美一二三级精品在线| 亚洲天堂性爱| 色汉综合| 天美国产三级传媒| 天久久久噜噜噜久久国产精品爽爽| 成年女人18级毛片毛片免费观看| 国产精品丝袜久久亚洲不卡| 91人妻精华帖| 97一区二压| 奇米四色影视777久久久| 加勒比AV网| αⅴ天堂| 男人的天堂日本东京热| 强奸乱伦亚洲第一页| 97一区二区三区视频| A V视频日本| 操曰本熟女| 国产美女高潮叫床视频| 99热这里只有精品1| 色婷网| 亚洲区 欧美区| 大香蕉色十月| 中英熟女操女| 欧美日韩大陆黑人少妇99| 日韩性爱视频在线免费观看 | 久久一区二区三区四区五区| 中文字幕二区日韩天堂| 日本欧美中文字幕| 人妻精品一区二区全免费| 成人无码在线超碰网| 一区二区三区色综合| 亚洲精品中文字幕一区在线视频 | 国产精品一区二区 尿失禁| 欧美日韩国产色五月综合在线| 国产精品久久久久av| 青娱乐妇女性生活| 妇女视频网站| 亚洲欧美国产成人综合不卡| 久久9精品| 麻豆区99999| 欧美国产欧美在线观看| 日本高清有码网址视频| 在线观看啊啊啊啊啊| 欧美淫穴| 国产精品女生av| 国产suv精品一区二六| 欧日韩不卡视.频| heyZO天然素人无码AⅤ专区| 黑人综合色| 日本91白丝| 日韩精品在线观看观看| 欧中美三级一区二区三区| 九九热免费在线国产视频伊人五月| 激情抓乳插进去啪啪啪日韩| 大干人妻| 亚洲色9| 色婷婷亚洲婷婷| 乱伦熟妇一区二区| 久污| 婷婷丁香五月综合| 操逼逼一区视频| 欧美色图99| 二级久久网| 日韩在线76| 国产一区二区欧美日本| 视频一区二区免费在线| 91精品国| 在线黄色污污网站| 屌色在线97视频| 成人aⅴ一区二区三区| 久久久人妻| 亚洲麻豆18发?| 久久超碰97中文字幕| 玖玖婷婷五月天| 精品少妇人妻av久久免费| 精品视频在线观看| 久久精品国产97欧美精品亚洲| 亚洲三级网址久久最新| 亚洲中文字幕网| 福利视频香蕉免费一区二区在线| 久久精品国产久精国产| 农村妇女一级二级三级视频| 探花一区在线| 四虎影视永久在线免费| 久久精品 六十路 熟女 欧美| 亚洲熟女诱惑| 中文字幕女同在线| 91欧美偷拍| 翘臀vidoes| 志村玲子视频一区二区| 中文字幕亚洲在线一区| 午夜偷拍久久熟女| 操淫穴亚洲五月丁香 | 97超碰人人模人人拍人人| 97在线视频免费看| 男人的天堂日韩| 使劲用力艹少妇视频一区二区 | 黑人狂躁日本妞一区二区三区| 性无码专区2020| 91老熟女| 98久久| 久艹免费| 天天做天天爱天天爽AV| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 熟女精品日韩一区二区三区| 欧美日韩第一页| 亚洲乱码国产乱码精网站| 伦激情人妻另类人妻| 国产在线视频午夜精华在| 麻豆 美女 丝袜 人妻 中文| 97超碰公开| 日本二区不卡| 亚洲丨在线| 78精品| 少妇天堂| 97超碰欧美| 综合影院永久入口国产| 热思思免费视频| 秋霞一集毛片观看| 国产成人99久久亚洲综合| 日韩中文字幕视频| 日日日日做夜夜夜夜无码| 天堂俺去俺来也www久久婷婷| 26uuu性物| 亚洲欧洲日韩国产自在线| 国产乱人伦AVA麻豆软件.| 自慰白浆在线观看| 久久香蕉影院| 男人兔费天堂| 精品美女在线视频| 久久久久网站-538在线视频-欧美永久乱码 | 国产亚洲色婷婷久久99精品91| 67194国产| 美女91AV| 岛国在线国产| 一区二区视频在线播放| 4399成人黄A片| 麻豆黄色五月天| 99RE在线视频精品,这里只有精品| 青青伊人久久| 97久操| 91福利网在线观看| 欧美精品xxxwww| 五月天色图| 日本精品人妻少妇一区二区| 97在线青| 夜夜欧美 | 亚洲色图欧美另类在线| 日本国产二线女色| 国产极品馒头逼| 一级aaaaa欧美中文字幕录像片| 婷婷丁香五月激情啪啪| 美女啊啊啊啊pc| 日本熟妇色熟妇在线视频播放| 欧美日韩制服| www.亚洲黄色| 91天堂色男人的天堂| 无码av永久免费专区网站| 爱我干综合| 强上我不卡卡| 欧美色图小说综合| 国产精品成人AV片免费看网站| 操操逼操操逼操操逼逼| 中文字幕啊啊啊在线观看视频| 国产黄色动态精品| 天天舔日美女视频| 综合国产影视三级| 久久香蕉网| 天天激色| 无遮挡男女激烈动态图| 日韩成人大片在线观看| 和协无码影院| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 伊人青青草久久| 日本熟妇人妻一区二区三区| 国产精品乱码久久久久久久久久久久| 性欧美| 欧美三级免费伊人| 嗯嗯,啊啊,国产精品| 久久精品电影| 视频国产成人精品日本亚洲18| 久久AV无码网址| 欧美色66| 久久这里只有精品9| 亚洲欧美在线观看2021| 国内操逼视频二区| 欧美黄页| 丁香五月影院| 亚洲熟女一区二区| 探花熟女,姿勢到位,體驗感也到位| 亚洲综合888| 920日本午夜免费| 亚洲少妇自拍中文字幕懂色| 自拍偷拍亚洲熟女妇人精品| 婷婷情色综合网| 国产97亚洲| 婷婷色色五月天| 91精品操美女| 日韩欧美俄罗斯A片| 日本男人插女人的逼黄色| 伊人热综合| 欧美在线官网| 1区2区3区视频| 偷拍 精品另类 凸凹了四区| 91 偷| 色情五月婷婷| 麻豆色约约| av中文在线| 1区2区3区中文字幕日韩| av网站免费看| av天天在线观看| 亚洲黑人在线| 国色天香av| 夫妻天天操岛国视频| 久久乐| 亚洲久久久久| 97天天爽| 尤物av网站免费在线播放| 黄色大片一区二区密桃丝袜| 97在线观看| av在线人气| 一个人免费视频观看在线WWW| 国产自产91区13区| 澳门黄片一香蕉视频| 婷婷激情综合网| 欧美一级久久久丰满| 加勒比色综合| 视频在线观看免费一区二区三区| 国产精品免费视频人成| 大香蕉伊人网WWWn0n| 久久久久久九九九九九九| 亚洲色图亚洲无码强奸乱伦| 欧美日日人人天天| 激情五月天综合网| 97香蕉网| 超碰中文字幕人妻草一区| 免费一级黄色录像影片| 九九九草| 天天弄天天操| 明星性猛交ⅹxxx乱大交| 欧美白嫩在线放| 激情接吻视频久久久久久| 中文字幕1区2区| 国产欧美一区二区| 亚洲中文一区二区三区| 91激情国产| 日本久久久久久久久| 为用户提供免费看黄网址在线观看| 亚洲熟女偷拍在线观看| 婷婷久久五月| 伊人热综合| 91网站18+| 国产成人在线观看网址| 91欧美另类| 大香蕉九九| 91成人高清在线观看| 91痴汉| 有码免费观看| 激情五月天丁香社区| 亚洲日韩天堂| 伦理日韩国产久久| 天美传媒国产原创中文字幕亚洲欧美另类 | 五月丁香六月激情| 人人操人人摸人人看人人插| 91丝袜人妻| 日韩av色图综合| 激情AV| 99热成人| 韩国女主播青草在线| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 日韩综合成人免费视频| 久久熟女嫩草成人片免费| 怡红院视频在线| 色嗨嗨在线| 午夜小电影在线插入淫高潮| 插入粉嫩少妇视频| 91老司机在线视频免费观看| 户外裸露刺激视频第一区| 欧美91精品国产自产| 亚洲91射| 97视频7| 黄色网址久久精品欧美喷水| 亚洲乱伦图片视频| 中文字幕-区二区三区四区视频中国| 国产精品爆乳懂色蜜乳| 91综合天天看| 91草草草| 成人AV素股で擦久久| 二色av| 国产超碰人人爽人人做| 日本乱人伦片中文三区| 亚洲中文丝袜美腿诱惑字幕| 欧美 亚洲 综合 制服 另类| 蜜臀精品1区2区| 黄色av网站在线播放| 久久久久ab| A级在线视频| 人妻久久久久久| 五月丁香婷婷色| 蜜桃久久久久久| 99热18| 无码聚合| 无码精品人妻一区二区三区妖精| 亚洲婷婷丁香在线| 四虎在线观看视频| 躁躁躁日日躁2020| 国产精品视频播放| 丰满人妻区一区二区三| 午夜久久一区二区无码中出| 久久久蜜桃一区二区三区| 日韩av一级黄片| 搡老女人老妇女AAA一VU麻豆 | 好吊色青靑草| 欧美精品另类人妖xxxx| 成人精品一区二区91毛片不卡| 91模特在线观看| 久草久热| 国产亚洲精品第一最新| 91狠婷| 九九久久一区二区伦理| 精品视频一区二区| 欧美青青视频| 四虎 精品 WWW| 欧美性爱91| 在线视频资源| 国产一区二区三三视频| 日韩15p| 啊啊啊啊啊啊在线观看| 黄骗免费网站| 9色国产精品一区粉嫩| 2024黄色视频| 国产精品白丝在线播放| 久久无码一区二区二三区性色| 九九精品无码专区免费| 亚洲h片在线免费观看| 色噜噜精品一区二区三|