青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 9,  comments - 19,  trackbacks - 0
本人博客地址:http://m.shnenglu.com/pwq1989/

第一篇對(duì)Luajit做一個(gè)大概的介紹,我目前也正在慢慢的讀通源碼中,以后發(fā)現(xiàn)了新東西就補(bǔ)充在這里。

大家可以從官網(wǎng)下載到源碼(http://luajit.org/),也可以從Github(https://github.com/LuaDist/luajit)down下來,順便還可以看下commit記錄。

大家對(duì)著luajit的wiki結(jié)合源碼看的話會(huì)更好些,因?yàn)椤!N臋n太特么少了!!

目錄結(jié)構(gòu):
-- src
    -- host
    -- jit
    *.c
    *.h
    *.dasc
等等,別的不是很重要

最開始我是從main函數(shù)開始看的,然后。。碰了一鼻子灰,后來研究下他的makefile,發(fā)現(xiàn)他是這樣子的編譯的,貼一下關(guān)鍵的msvcbuild.bat的代碼(這個(gè)更容易看懂)
 1 :X64
 2 minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc
 3 @if errorlevel 1 goto :BAD
 4 
 5 %LJCOMPILE% /I "." /I %DASMDIR% host\buildvm*.c
 6 @if errorlevel 1 goto :BAD
 7 %LJLINK% /out:buildvm.exe buildvm*.obj
 8 @if errorlevel 1 goto :BAD
 9 if exist buildvm.exe.manifest^
10   %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe
11 
12 buildvm -m peobj -o lj_vm.obj
13 @if errorlevel 1 goto :BAD
14 buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%
15 @if errorlevel 1 goto :BAD
16 buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%
17 @if errorlevel 1 goto :BAD
18 buildvm -m libdef -o lj_libdef.h %ALL_LIB%
19 @if errorlevel 1 goto :BAD
20 buildvm -m recdef -o lj_recdef.h %ALL_LIB%
21 @if errorlevel 1 goto :BAD
22 buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%
23 @if errorlevel 1 goto :BAD
24 buildvm -m folddef -o lj_folddef.h lj_opt_fold.c
25 @if errorlevel 1 goto :BAD

先創(chuàng)建了一個(gè)buildvm.exe的中間工具,來自動(dòng)生成代碼,分別生成了lj_vm.obj,lj_bcdef.h,lj_ffdef.h ,lj_recdef.h ,jit\vmdef.lua,lj_folddef.h, lj_libdef.h

其中l(wèi)v_vm.obj是依賴于host\buildvm_arch.h的,這個(gè)是用DynASM預(yù)處理vm_x86.dasc生成的,這個(gè)工具的具體分析會(huì)在下一篇博客提及。

先來看下上面自動(dòng)生成的代碼:
lj_bcdef.h:
 1 LJ_DATADEF const uint16_t lj_bc_ofs[] = {
 2 0,
 3 71,
 4 142,
 5 213,
 6 284,
 7 
 8 };
 9 
10 LJ_DATADEF const uint16_t lj_bc_mode[] = {
11 BCDEF(BCMODE)
12 BCMODE_FF,
13 BCMODE_FF,
14 BCMODE_FF,
15 BCMODE_FF,
16 BCMODE_FF,
17 
18 };

lj_bc_ofs[]可能是bc在vm代碼段中的偏移量(這個(gè)我還沒深入進(jìn)去調(diào)試一下),vm的一部分是用DynASM直接擼匯編擼出來的,wiki中也有提到下一步j(luò)it化的opcode等等。
lj_bc_mode[]的用來根據(jù)壓縮后的bytecode構(gòu)造,分離出操作數(shù),第一行的兩個(gè)宏的定義是
#define BCMODE(name, ma, mb, mc, mm) \
  (BCM##ma|(BCM##mb<<3)|(BCM##mc<<7)|(MM_##mm<<11)),
#define BCMODE_FF 0

#define BCDEF(_) \
  /* Comparison ops. ORDER OPR. */ \
  _(ISLT, var, ___, var, lt) \
  _(ISGE, var, ___, var, lt) \
  _(ISLE, var, ___, var, le) \
  _(ISGT, var, ___, var, le) \
...
總之就是充斥著各種拼接起來的宏

lj_ffdef.h:
1 FFDEF(assert)
2 FFDEF(type)
3 FFDEF(next)
4 FFDEF(pairs)
5 FFDEF(ipairs_aux)
6 
FFDEF的定義是在
1 /* Fast function ID. */
2 typedef enum {
3   FF_LUA_ = FF_LUA,    /* Lua function (must be 0). */
4   FF_C_ = FF_C,        /* Regular C function (must be 1). */
5 #define FFDEF(name)    FF_##name,
6 #include "lj_ffdef.h"
7   FF__MAX
8 } FastFunc;
差不多就是用FF_##name把上面的名字拼接起來,然后生成在enum里面,這樣就能當(dāng)成是數(shù)字,在數(shù)組中迅速找到入口了

vmdef.lua:
這個(gè)里面內(nèi)容就不貼了,包括bcname,irname,irfpm,irfield,ircall 的定義,在jit文件夾下面,用于調(diào)試等,比如在dump.lua中就有用到
local jit = require("jit")
assert(jit.version_num == 20002, "LuaJIT core/library version mismatch")
local jutil = require("jit.util")
local vmdef = require("jit.vmdef")  // ← ← ← ←

當(dāng)你用luajit -jdump的時(shí)候,就是調(diào)用的lua的jit庫里面的lua函數(shù)

lj_recdef.h:
 1 static const uint16_t recff_idmap[] = {
 2 0,
 3 0x0100,
 4 0x0200,
 5 0x0300,
 6 0,
 7 0,
 8 0x0400,
 9 
10 };
11 
12 static const RecordFunc recff_func[] = {
13 recff_nyi,
14 recff_c,
15 recff_assert,
16 recff_type,
17 recff_ipairs_aux,
18 
19 };
其中recff_func[]是被注冊(cè)的被traced jit 跟蹤的函數(shù),具體可是在lj_ffrecord.c里面看到
recff_idmap[]被用在lj_ffrecord_func這個(gè)函數(shù)中,有一個(gè)關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)RecordFFData,用來記錄在trace過程中被調(diào)用函數(shù)的參數(shù)和返回值個(gè)數(shù),和一些輔助數(shù)據(jù),opcode,literal等等。通過recff_idmap[]保存的值來區(qū)分函數(shù)(待仔細(xì)研究)


lj_folddef.h:
 1 static const FoldFunc fold_func[] = {
 2   fold_kfold_numarith,
 3   fold_kfold_ldexp,
 4   fold_kfold_fpmath,
 5   fold_kfold_numpow,
 6 
 7 };
 8 
 9 static const uint32_t fold_hash[916] = {
10 0xffffffff,
11 0xffffffff,
12 0x5b4c8016,
13 
14 };
用在FOLD optimization中,見lj_opt_fold.c,主要在
1 if ((fh & 0xffffff) == k || (fh = fold_hash[h+1], (fh & 0xffffff) == k)) {
2       ref = (IRRef)tref_ref(fold_func[fh >> 24](J));
3       if (ref != NEXTFOLD)
4     break;
5     }
是根據(jù)數(shù)組偏移獲取函數(shù),直接執(zhí)行。
(這個(gè)Optimation略復(fù)雜,以后的博文中再說)

----------------------------------------分割線-------------------------------------------

以上就是buildvm生成代碼,在很多.c的文件中,他加入了一些無意義的MARCO,目的是為了能被buildvm識(shí)別出

下面說說src根目錄下面的文件:

lauxlib.h:
用戶開發(fā)擴(kuò)展和與C交互的時(shí)候的頭文件

lib_*.h /.c:
顧名思義,就是利用LuaAPI寫的內(nèi)部標(biāo)準(zhǔn)庫,會(huì)在方法上表明是否會(huì)被trace ( LJLIB_REC(.) )。

ljamalg.c:
文件的合并

lj_alloc.h /.c:
定制的Memory Allocator

lj_api.c:
Public Lua/C API.

lj_arch.h:
Target architecture selection

lj_jit.h:
jit編譯器里面數(shù)據(jù)結(jié)構(gòu)的定義

lj_asm.h/ .c  lj_asm_*.c lj_emit_*.h lj_target_*.h/.c :
將IR編譯成Machine Code,關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)ASMState,線性掃描的O(n2)分配算法

lj_bc.h/ .c:
Luajit字節(jié)碼的定義和內(nèi)存布局

lj_bcdump.c lj_bcread.c  lj_bcwrite.c:
圍繞著字節(jié)碼的操作

lj_carith.c:
C實(shí)現(xiàn)的一些數(shù)字運(yùn)算

lj_ccall.h/ .c  lj_ccallback.h / .c :
FFI C語言函數(shù)調(diào)用和回調(diào)綁定

lj_debug.h/.c :
調(diào)試與自省用

lj_def.h:
這個(gè)很重要,重要的類型和一些宏定義在這里

lj_c*.h/ .c:
和C語言先關(guān)的,比如類型轉(zhuǎn)化,char管理,數(shù)據(jù)管理

lj_frame.h:
Luajit的棧幀管理

lj_func.h/.c:
Function handle和閉包有關(guān)的upvalue數(shù)據(jù)結(jié)構(gòu)

lj_gc.h/.c:
GC相關(guān),GC可以看下luajit的wiki,里面涉及不少增量式GC的paper和作者的看法

lj_gdbjit.h/.c :
對(duì)gdb的支持

lj_ir*.h/.c:
SSA,IR相關(guān)(這個(gè)和bytecode還是不一樣的)操作和優(yōu)化

lj_lex.h/.c  lj_parse.h/.c:
lexer和parser

lj_mcode.h/.c:
Machine Code管理

lj_opt_*.h:
各種bytecode層面上的優(yōu)化

lj_snap.h/.c:
快照支持

lj_state.h/.c:
LuaState和Stack的操作

lj_str*.h/.c  lj_tab.h/.c:
原生類型string和table操作

lj_udata.h/.c:
類型user data的操作

lj_vm.h/.c  lj_vmevent.h/.c:
vm的API和事件注冊(cè)(lj_vmevent_send)

lj_vmmath.h/.c:
對(duì)vm支持的math庫

lua.h:
luaState等基本的Lua結(jié)構(gòu)

lualib.h:
和Lua一樣,標(biāo)準(zhǔn)庫的API

luajit.h:
luajit 的public API

vm_*.dasc:
編譯期被DynASM預(yù)處理的源文件,下一篇講DynASM時(shí)候介紹dasc文件

wmain.c:
windows下面的main入口

和Trace相關(guān)的:
lj_crecord.h/.c  : C操作的trace record
lj_dispatch.h/.c :  指令分發(fā),調(diào)用ASMFuction,處理指令前的hook和記錄trace用的hot count,有一個(gè)重要的數(shù)據(jù)結(jié)構(gòu) GG_State
lj_ff*.h/.c: 上面講lj_ffdef.h的時(shí)候提過,trace的時(shí)候 記錄Fast Function的調(diào)用記數(shù)
lj_trace.h/.c: trace的具體過程
lj_traceerr.h : trace error
posted on 2013-11-28 19:23 右席 閱讀(12671) 評(píng)論(4)  編輯 收藏 引用 所屬分類: Luajit
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品乱码人人做人人爱| 99re热这里只有精品免费视频| 乱中年女人伦av一区二区| 99视频一区二区三区| 久久国产精品网站| 99成人免费视频| 欧美日韩综合一区| 激情综合中文娱乐网| 欧美自拍偷拍| 欧美在线视频全部完| 国产精品久久久久久久久久免费| 亚洲激情在线| 日韩视频一区二区三区| 欧美国产丝袜视频| 久久美女性网| 亚洲黄一区二区| 欧美大尺度在线观看| 蜜臀91精品一区二区三区| 亚洲第一偷拍| av不卡在线观看| 国产视频欧美视频| 亚洲第一视频| 欧美精品一区在线发布| 亚洲欧美日韩在线观看a三区 | 欧美网站在线观看| 亚洲欧美国产三级| 99精品国产高清一区二区| 欧美日韩国产精品成人| 欧美一区二区黄色| 久久影视三级福利片| 一区二区在线观看av| 一本在线高清不卡dvd| 欧美国产日韩精品| 久久精品亚洲一区二区| 蜜臀91精品一区二区三区| 亚洲欧美精品| 一区二区三区日韩精品视频| 欧美亚洲一区二区三区| 夜色激情一区二区| 免费观看不卡av| 久久综合九色欧美综合狠狠| 欧美调教视频| 99精品国产热久久91蜜凸| 亚洲国产经典视频| 久久国产主播精品| 久久久久**毛片大全| 欧美性做爰猛烈叫床潮| 欧美激情一级片一区二区| 在线成人激情黄色| 免费久久99精品国产自在现线| 久久久精品一区| 在线精品在线| 欧美福利小视频| 欧美成人性网| 中文一区字幕| 国产精品成人免费| 亚洲色图自拍| 日韩写真视频在线观看| 久久亚洲综合网| 老司机精品福利视频| 1769国产精品| 欧美日韩日本视频| 亚洲综合色丁香婷婷六月图片| 中日韩视频在线观看| 日韩亚洲欧美中文三级| 精品福利av| 午夜精品久久久久久久久久久久久| 久久久久一区| 在线一区二区视频| 午夜日韩在线| 欧美 日韩 国产精品免费观看| 国产乱理伦片在线观看夜一区| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲一区二区欧美| 欧美天堂亚洲电影院在线播放| 欧美成人免费小视频| 国产区二精品视| 麻豆成人av| 亚洲国产成人精品久久| 欧美伊人久久| 亚洲人成在线观看网站高清| 香蕉久久一区二区不卡无毒影院 | 亚洲第一福利视频| 亚洲欧美电影在线观看| 亚洲另类自拍| 很黄很黄激情成人| 国产精品婷婷| 欧美视频中文字幕| 欧美日韩国产在线看| 六月天综合网| 免费成年人欧美视频| 噜噜噜久久亚洲精品国产品小说| 性欧美精品高清| 欧美在线免费一级片| 久久久久在线观看| 久久五月婷婷丁香社区| 久久久综合视频| 性8sex亚洲区入口| 日韩天天综合| 免费影视亚洲| 久久综合一区二区三区| 欧美日韩精品高清| 久久一区中文字幕| 亚洲福利一区| 欧美专区一区二区三区| 亚洲青色在线| 欧美一区二区三区视频免费| 老司机aⅴ在线精品导航| 国产精品一区二区欧美| 狠狠色狠狠色综合日日tαg| 亚洲乱码国产乱码精品精98午夜| 亚洲一区在线播放| 老鸭窝毛片一区二区三区| 午夜电影亚洲| 国产精品久久久久久模特 | 六月婷婷一区| 国产精品美女久久久久av超清| 亚洲精品在线电影| 亚洲人在线视频| 欧美三级网址| 午夜精品视频网站| 欧美系列亚洲系列| 亚洲一线二线三线久久久| 欧美四级在线观看| 欧美在线精品免播放器视频| 这里只有精品视频在线| 国产精品海角社区在线观看| 亚洲欧美国产高清va在线播| 亚洲精品自在在线观看| 国产精品久久波多野结衣| 久久久亚洲国产美女国产盗摄| 久久综合中文字幕| 亚洲视屏一区| 久久夜色精品亚洲噜噜国产mv | 欧美日韩一区二区在线观看| 久久久久91| 国产日韩欧美不卡| 一区二区三区不卡视频在线观看| 黄色精品免费| 亚洲一区二区av电影| 制服丝袜激情欧洲亚洲| 欧美日韩国产区| 欧美精品网站| 久久av红桃一区二区小说| 欧美精品一区二区三区很污很色的| 9国产精品视频| 亚洲欧洲在线一区| 国产综合色精品一区二区三区| 欧美福利电影网| 国产欧美在线播放| 午夜在线精品| 亚洲五月婷婷| 欧美日韩亚洲三区| 美日韩在线观看| 国产精品爽黄69| 亚洲一区在线看| 亚洲在线成人| 日韩视频免费观看| 日韩午夜精品视频| 男人的天堂亚洲在线| 欧美成人伊人久久综合网| 国产一区二区高清视频| 香蕉乱码成人久久天堂爱免费| 亚洲欧美日韩第一区| 国产精品一区二区黑丝| 中文国产成人精品| 欧美一区二区在线播放| 国产精品视频自拍| 久久久久一区二区三区| 欧美黄色aa电影| 洋洋av久久久久久久一区| 欧美视频中文一区二区三区在线观看| 一本久久综合亚洲鲁鲁| 久久福利影视| 亚洲精品国产日韩| 国产欧美韩国高清| 在线不卡中文字幕播放| 麻豆成人综合网| 亚洲天堂av在线免费| 国产永久精品大片wwwapp| 欧美电影资源| 亚洲欧洲av一区二区三区久久| 欧美激情一区二区久久久| 亚洲精品国产精品乱码不99按摩| 欧美午夜片欧美片在线观看| 久久久久久久久久久成人| 亚洲午夜三级在线| 欧美国产日本韩| 欧美一区二区视频观看视频| **性色生活片久久毛片| 欧美一二三区精品| 亚洲国产女人aaa毛片在线| 一区二区av在线| 亚洲国产精品第一区二区三区| 两个人的视频www国产精品| 午夜久久美女| 亚洲综合不卡| 亚洲一级在线| 在线亚洲欧美视频| 99国产精品视频免费观看|