Changeset 62 in dev for BasicCompiler64


Ignore:
Timestamp:
Feb 22, 2007, 3:57:56 AM (18 years ago)
Author:
dai_9181
Message:

グローバル変数に対してByRefを指定できるようにした

Location:
BasicCompiler64
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Calc.cpp

    r55 r62  
    286286    }
    287287
    288     if( VarType == DEF_OBJECT && VarRelativeVar.dwKind == VAR_REFLOCAL ){
     288    if( VarType == DEF_OBJECT
     289        && (VarRelativeVar.dwKind == VAR_REFLOCAL || VarRelativeVar.dwKind == VAR_REFGLOBAL ) ){
    289290        // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する
    290291        PTR_LEVEL_UP( VarType );
    291292
    292         VarRelativeVar.dwKind = VAR_LOCAL;
     293        if( VarRelativeVar.dwKind == VAR_REFGLOBAL ){
     294            VarRelativeVar.dwKind = VAR_GLOBAL;
     295        }
     296        else if( VarRelativeVar.dwKind == VAR_REFLOCAL ){
     297            VarRelativeVar.dwKind = VAR_LOCAL;
     298        }
    293299
    294300        if( CalcType == DEF_OBJECT ){
  • BasicCompiler64/Compile_Calc_PushVar.cpp

    r40 r62  
    2727            obp+=sizeof(long);
    2828        }
     29    }
     30    else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
     31        SetError(300,NULL,cp);
    2932    }
    3033    else if(pRelativeVar->dwKind==VAR_LOCAL){
     
    109112        }
    110113    }
     114    else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
     115        SetError(300,NULL,cp);
     116    }
    111117    else if(pRelativeVar->dwKind==VAR_LOCAL){
    112118        if(pRelativeVar->bOffsetOffset){
     
    188194        }
    189195    }
     196    else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
     197        if(pRelativeVar->bOffsetOffset){
     198            //add r11,qword ptr[offset]
     199            op_add_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
     200            obp-=sizeof(long);
     201            pobj_GlobalVarSchedule->add();
     202            obp+=sizeof(long);
     203        }
     204        else{
     205            //mov r11,qword ptr[offset]
     206            op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
     207            obp-=sizeof(long);
     208            pobj_GlobalVarSchedule->add();
     209            obp+=sizeof(long);
     210        }
     211
     212        goto directmem;
     213    }
    190214    else if(pRelativeVar->dwKind==VAR_LOCAL){
    191215        if(pRelativeVar->bOffsetOffset){
  • BasicCompiler64/Compile_Set_Var.cpp

    r40 r62  
    153153            obp+=sizeof(long);
    154154        }
     155    }
     156    else if(pRelative->dwKind==VAR_REFGLOBAL){
     157        SetError(300,NULL,cp);
    155158    }
    156159    else if(pRelative->dwKind==VAR_LOCAL){
     
    242245        }
    243246    }
     247    else if(pRelative->dwKind==VAR_REFGLOBAL){
     248        SetError(300,NULL,cp);
     249    }
    244250    else if(pRelative->dwKind==VAR_LOCAL){
    245251        if(pRelative->bOffsetOffset){
     
    367373        }
    368374    }
     375    else if( pRelative->dwKind == VAR_REFGLOBAL ){
     376        if(pRelative->bOffsetOffset){
     377            //add r11,qword ptr[offset]
     378            op_add_RM( sizeof(_int64), REG_R11, REG_NON, (int)pRelative->offset, MOD_DISP32 );
     379            obp-=sizeof(long);
     380            pobj_GlobalVarSchedule->add();
     381            obp+=sizeof(long);
     382        }
     383        else{
     384            //mov r11,qword ptr[offset]
     385            op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelative->offset,MOD_DISP32);
     386            obp-=sizeof(long);
     387            pobj_GlobalVarSchedule->add();
     388            obp+=sizeof(long);
     389        }
     390
     391        goto directmem;
     392    }
    369393    else if(pRelative->dwKind==VAR_LOCAL){
    370394        if(pRelative->bOffsetOffset){
     
    386410        if(pRelative->bOffsetOffset){
    387411            //add r11,qword ptr[rsp+offset]
    388             OpBuffer[obp++]=(char)0x4C;
    389             OpBuffer[obp++]=(char)0x03;
    390             OpBuffer[obp++]=(char)0x9C;
    391             OpBuffer[obp++]=(char)0x24;
    392             *((long *)(OpBuffer+obp))=(int)pRelative->offset;
     412            op_add_RM( sizeof(_int64), REG_R11, REG_RSP, (int)pRelative->offset, MOD_BASE_DISP32 );
     413            obp-=sizeof(long);
    393414            AddLocalVarAddrSchedule();
    394415            obp+=sizeof(long);
  • BasicCompiler64/Compile_Var.cpp

    r56 r62  
    647647    pRelativeVar->offset=GlobalVar[i].offset;
    648648    pRelativeVar->bOffsetOffset=0;
    649     pRelativeVar->dwKind=VAR_GLOBAL;
     649    if(GlobalVar[i].fRef){
     650        // 参照型
     651        pRelativeVar->dwKind = VAR_REFGLOBAL;
     652    }
     653    else pRelativeVar->dwKind=VAR_GLOBAL;
    650654    *pType=GlobalVar[i].type;
    651655    lpIndex=GlobalVar[i].u.index;
     
    11811185        GetNowStaticVarFullName(VarName,temporary);
    11821186
    1183         AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
     1187        AddGlobalVariable(isRef,temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11841188
    11851189        /*
     
    11941198            /////////////////////////
    11951199
    1196             AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
     1200            AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11971201        }
    11981202        else{
     
    13671371        }
    13681372    }
     1373    else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
     1374        if(pRelativeVar->bOffsetOffset){
     1375            //add r11,qword ptr[offset]
     1376            op_add_RM( sizeof(_int64), REG_R11, REG_NON, (int)pRelativeVar->offset, MOD_DISP32 );
     1377            obp-=sizeof(long);
     1378            pobj_GlobalVarSchedule->add();
     1379            obp+=sizeof(long);
     1380        }
     1381        else{
     1382            //mov r11,qword ptr[offset]
     1383            op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
     1384            obp-=sizeof(long);
     1385            pobj_GlobalVarSchedule->add();
     1386            obp+=sizeof(long);
     1387        }
     1388
     1389        goto directmem;
     1390    }
    13691391    else if(pRelativeVar->dwKind==VAR_LOCAL){
    13701392        if(pRelativeVar->bOffsetOffset){
  • BasicCompiler64/Opcode.h

    r56 r62  
    5353//変数の種類
    5454#define NON_VAR             0
    55 #define VAR_GLOBAL          1   //Global Variable
    56 #define VAR_LOCAL           2   //Local Variable
    57 #define VAR_REFLOCAL        3   //Local Refference Variable
    58 #define VAR_DIRECTMEM       5   //Direct memory
     55#define VAR_GLOBAL          1   // Global Variable
     56#define VAR_REFGLOBAL       2   // Global Refference Variable
     57#define VAR_LOCAL           3   // Local Variable
     58#define VAR_REFLOCAL        4   // Local Refference Variable
     59#define VAR_DIRECTMEM       5   // Direct memory
    5960
    6061
  • BasicCompiler64/WatchList.cpp

    r40 r62  
    1414    if(pRelativeVar->dwKind==VAR_GLOBAL){
    1515        return ImageBase+MemPos_RWSection+pRelativeVar->offset;
     16    }
     17    else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
     18        extern HANDLE hDebugProcess;
     19        LONG_PTR lpData;
     20        SIZE_T stAccBytes;
     21        ReadProcessMemory(hDebugProcess,
     22            (void *)(ImageBase+MemPos_RWSection+pRelativeVar->offset),
     23            &lpData,
     24            sizeof(LONG_PTR),
     25            &stAccBytes);
     26
     27        return lpData;
    1628    }
    1729    else if(pRelativeVar->dwKind==VAR_LOCAL){
     
    430442
    431443        pRelativeVar->offset=GlobalVar[i].offset;
    432         pRelativeVar->dwKind=VAR_GLOBAL;
     444        if(GlobalVar[i].fRef) pRelativeVar->dwKind=VAR_REFGLOBAL;
     445        else pRelativeVar->dwKind=VAR_GLOBAL;
    433446        *pType=GlobalVar[i].type;
    434447        lpIndex=GlobalVar[i].u.index;
Note: See TracChangeset for help on using the changeset viewer.