//unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0;
// syslib.oseのjitc結果を格納する領域を確保。
sysjit00 = mallocRWE(SJITSIZ1);
+ sysjit = sysjit00;
// 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス
// sysjit: 現在のjitc書き込み位置
// sysjit00: jitc結果の先頭
- sysjit = sysjit00;
//ワークメモリを三つくらいもらう
systmp0 = malloc(SYSTMP0SIZ); /* syslibのjitc用 */
systmp1 = malloc(SYSTMP1SIZ);
}
ptrCtrl[0].size = -2;
- /* syslibの読み込み */
- syslib = Init_LoadSysLib(argv[0], systmp0);
+ /* syslibの読み込み */
+ syslib = Init_LoadSysLib(argv[0], systmp0);
- // jitc.cのerrHndl()をCALLするネィティブコードを挿入。
- // sysjitの値は次の書き込み位置へずらされる。
- // 元々のsysjitはsysjit00へ保存されている。
- sysjit = jitCompInit(sysjit);
-
- // sysjit (アドレス変数)は下の関数の実行で変更される(だから参照渡し)
- // もちろんsysjitの値は次の書き込み位置へずらされる。
+ sysjit = jitCompInit(sysjit);
+ sysjit00 = sysjit;
// labelはjitc0()内で初期化される。
- i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_FASTEST, label);
+ i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label);
if (i != 0){
fputs("syslib-file JITC error.\n", stderr);
return 1;
env.preg[0x0b].p = (void *)pxxFlag;
env.preg[0x0c].p = (void *)typLabel;
env.preg[0x0d].p = opTbl;
- jitfunc = (void *)sysjit;
+ jitfunc = (void *)sysjit00;
(*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */
if (env.ireg[0] != 0) {
jp = env.preg[2].p - 1;
memcpy(systmp0, env.appBin, env.appSize1);
tmpsiz = env.appSize1;
}
-
+
if ((argDebug & 2) != 0) {
+ /*変換後のバックエンドコードをファイルへ保存*/
fp = fopen("debug2.bin", "wb");
fwrite(systmp0, 1, tmpsiz, fp);
fclose(fp);
}
+ //JITコンパイル
i = jitc0(&jp, jitbuf + 1024 * 1024, systmp0, systmp0 + tmpsiz, env.executionLevel, label);
if (i == 1){
fputs("app-file header error.\n", stderr);
env.preg[i].p1 = NULL;
}
- env.argc = argc;
- env.argv = (const char **)argv;
env.buf0 = env.buf1 = NULL;
env.preg[0x28].p = p28;
env.preg[0x28].typ = 0; // TYP_CODE