Changeset 273 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Aug 11, 2007, 4:03:49 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/MakeExe.cpp

    r272 r273  
    135135    //"コンパイル中..."
    136136    CompileMessage(STRING_COMPILE_COMPILING);
    137 
    138     //グローバル変数に関する情報
    139     // TODO: AllGlobalVarSize、AllInitGlobalVarSizeをVariablesクラスに入れる
    140     extern int AllGlobalVarSize;
    141     extern int AllInitGlobalVarSize;
    142     compiler.GetObjectModule().meta.GetGlobalVars().clear();
    143     AllGlobalVarSize=0;
    144     AllInitGlobalVarSize=0;
    145137
    146138    Compile();
  • trunk/abdev/BasicCompiler_Common/VariableOpe.cpp

    r265 r273  
    970970    // グローバル変数を追加
    971971    /////////////////////////
    972     extern int AllInitGlobalVarSize;
    973     extern int AllGlobalVarSize;
    974972
    975973    if( compiler.GetObjectModule().meta.GetGlobalVars().DuplicateCheck( Symbol( name ) ) ){
     
    997995
    998996    // 変数を追加
    999     compiler.GetObjectModule().meta.GetGlobalVars().push_back( pVar );
    1000 
    1001     //アラインメントを考慮
    1002     int alignment = 0;
    1003     if( pVar->GetType().IsStruct() ){
    1004         alignment = pVar->GetType().GetClass().GetFixedAlignment();
    1005     }
    1006 
    1007     if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){
    1008         //初期バッファがあるとき
    1009 
    1010         if( alignment ){
    1011             if( AllInitGlobalVarSize % alignment ){
    1012                 AllInitGlobalVarSize += alignment - (AllInitGlobalVarSize % alignment);
    1013             }
    1014         }
    1015 
    1016         pVar->SetOffsetAddress( AllInitGlobalVarSize );
    1017         AllInitGlobalVarSize += pVar->GetMemorySize();
    1018     }
    1019     else{
    1020         //初期バッファがないとき
    1021 
    1022         if( alignment ){
    1023             if( AllGlobalVarSize % alignment ){
    1024                 AllGlobalVarSize += alignment - (AllGlobalVarSize % alignment);
    1025             }
    1026         }
    1027 
    1028         pVar->SetOffsetAddress( AllGlobalVarSize | 0x80000000 );
    1029         AllGlobalVarSize += pVar->GetMemorySize();
    1030     }
     997    compiler.GetObjectModule().meta.GetGlobalVars().Add(
     998        pVar,
     999        ( InitBuf[0] != 0 || dwFlag == DIMFLAG_INITDEBUGVAR )
     1000    );
    10311001
    10321002    if(InitBuf[0]){
     
    10351005            //初期バッファにデータをセット
    10361006            extern BYTE *initGlobalBuf;
    1037             initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
     1007            initGlobalBuf = (BYTE *)HeapReAlloc(
     1008                hHeap,
    10381009                HEAP_ZERO_MEMORY,
    10391010                initGlobalBuf,
    1040                 AllInitGlobalVarSize);
     1011                compiler.GetObjectModule().meta.GetGlobalVars().GetAllInitSize()
     1012            );
    10411013
    10421014            result = SetInitGlobalData(pVar->GetOffsetAddress(),
  • trunk/abdev/BasicCompiler_Common/include/DataTable.h

    r256 r273  
    77    char *buffer;
    88    int size;
     9
     10    void Realloc( int size )
     11    {
     12        this->buffer = (char *)realloc( this->buffer, size + 100 );
     13        this->size = size;
     14    }
    915
    1016    // XMLシリアライズ用
     
    7581    }
    7682
    77     void operator =( const DataTable &dataTable )
     83    void operator = ( const DataTable &dataTable )
    7884    {
    7985        Clear();
     
    8187    }
    8288
    83     void Realloc( int size );
    8489    int AddBinary( const void *buffer, int size );
    8590    int Add( _int64 i64data );
     
    8994    int AddString( const char *str, int length );
    9095    int AddString( const char *str );
     96    void Add( const DataTable &dataTable )
     97    {
     98        AddBinary( dataTable.GetPtr(), dataTable.GetSize() );
     99    }
    91100
    92101    const void *GetPtr() const;
  • trunk/abdev/BasicCompiler_Common/include/Linker.h

    r270 r273  
    3535
    3636    // リンク
    37     void Link( vector<ObjectModule *> &objectModules );
     37    void Link( ObjectModule &masterObjectModule );
    3838};
  • trunk/abdev/BasicCompiler_Common/include/Meta.h

    r272 r273  
    7575
    7676    // 静的リンク
    77     void StaticLink( Meta &meta );
     77    void StaticLink( Meta &meta, long dataSectionBaseOffset );
    7878
    7979    const NamespaceScopesCollection &GetNamespaces() const
  • trunk/abdev/BasicCompiler_Common/include/NativeCode.h

    r272 r273  
    427427    }
    428428    void NextSourceLine();
     429
     430    void ResetDataSectionBaseOffset( long dataSectionBaseOffset );
    429431};
  • trunk/abdev/BasicCompiler_Common/include/ObjectModule.h

    r270 r273  
    2828        ar & BOOST_SERIALIZATION_NVP( dataTable );
    2929    }
     30
     31public:
     32    void StaticLink( ObjectModule &objectModule );
    3033};
    3134typedef std::vector<ObjectModule *> ObjectModules;
  • trunk/abdev/BasicCompiler_Common/include/Variable.h

    r271 r273  
    214214class Variables : public vector<Variable *>
    215215{
     216    int allSize;
     217    int allInitSize;
    216218public:
    217     Variables(){}
     219    Variables()
     220        : allSize( 0 )
     221        , allInitSize( 0 )
     222    {
     223    }
    218224    ~Variables(){
    219225        Clear();
     
    225231        }
    226232
     233        allSize = 0;
     234        allInitSize = 0;
    227235        clear();
    228236    }
     
    235243
    236244    const Variable *BackSearch( const Symbol &symbol ) const;
    237 
    238245    const Variable *Find( const Symbol &symbol )const;
     246
     247    void Add( Variable *pVar, bool isInitArea );
     248
     249    int GetAllSize() const
     250    {
     251        return allSize;
     252    }
     253    int GetAllInitSize() const
     254    {
     255        return allInitSize;
     256    }
    239257
    240258
  • trunk/abdev/BasicCompiler_Common/src/Compiler.cpp

    r270 r273  
    1313    {
    1414        // メタ情報
    15         pNowObjectModule->meta.StaticLink( pStaticLibrary->meta );
     15        pNowObjectModule->StaticLink( *pStaticLibrary );
    1616    }
    1717}
  • trunk/abdev/BasicCompiler_Common/src/DataTable.cpp

    r256 r273  
    77#include <memory.h>
    88#include <stdlib.h>
    9 
    10 void DataTable::Realloc( int size )
    11 {
    12     this->buffer = (char *)realloc( this->buffer, size + 100 );
    13     this->size = size;
    14 }
    159
    1610int DataTable::AddBinary( const void *buffer, int size ){
  • trunk/abdev/BasicCompiler_Common/src/Linker.cpp

    r263 r273  
    7878void Linker::ResolveGlobalVarSchedules( long rwSectionBaseOffset )
    7979{
     80    int allInitVarSize = compiler.GetObjectModule().meta.GetGlobalVars().GetAllInitSize();
     81
    8082    BOOST_FOREACH( const Schedule &schedule, nativeCode.GetSchedules() )
    8183    {
     
    8486            if( nativeCode.GetLong( schedule.GetOffset() ) & 0x80000000 )
    8587            {
    86                 extern int AllInitGlobalVarSize;
    8788                nativeCode.Overwrite(
    8889                    schedule.GetOffset(),
    89                     static_cast<long>( AllInitGlobalVarSize + (nativeCode.GetLong( schedule.GetOffset() ) & 0x7FFFFFFF) + imageBase + rwSectionBaseOffset )
     90                    static_cast<long>( allInitVarSize + (nativeCode.GetLong( schedule.GetOffset() ) & 0x7FFFFFFF) + imageBase + rwSectionBaseOffset )
    9091                );
    9192            }
     
    101102}
    102103
    103 void Linker::Link( vector<ObjectModule *> &objectModules )
     104void Linker::Link( ObjectModule &masterObjectModule )
    104105{
    105106    // nativeCodeは初期状態でなければならない
     
    108109        SetError();
    109110    }
    110 
    111     /*
    112     BOOST_FOREACH( ObjectModule *pObjectModule, objectModules )
    113     {
    114     }*/
    115     ObjectModule &masterObjectModule = *objectModules[0];
    116111
    117112    nativeCode.Put( masterObjectModule.globalNativeCode, false );
  • trunk/abdev/BasicCompiler_Common/src/Meta.cpp

    r272 r273  
    3636}
    3737
    38 void Meta::StaticLink( Meta &meta )
     38void Meta::StaticLink( Meta &meta, long dataSectionBaseOffset )
    3939{
    4040    // 名前空間
     
    5353        UserProc *pUserProc = meta.GetUserProcs().Iterator_GetNext();
    5454        pUserProc->isTargetObjectModule = false;
     55
     56        pUserProc->GetNativeCode().ResetDataSectionBaseOffset( dataSectionBaseOffset );
     57
    5558        this->userProcs.Put( pUserProc );
    5659    }
  • trunk/abdev/BasicCompiler_Common/src/NativeCode.cpp

    r263 r273  
    125125    sourceLines.push_back( SourceLine( (long)sourceLines.size(), size, cp, sourceLineType ) );
    126126}
     127
     128void NativeCode::ResetDataSectionBaseOffset( long dataSectionBaseOffset )
     129{
     130    BOOST_FOREACH( const Schedule &schedule, schedules )
     131    {
     132        if( schedule.GetType() == Schedule::DataTable )
     133        {
     134            Overwrite(
     135                schedule.GetOffset(),
     136                GetLong( schedule.GetOffset() ) + dataSectionBaseOffset
     137            );
     138        }
     139    }
     140}
  • trunk/abdev/BasicCompiler_Common/src/Variable.cpp

    r248 r273  
    7373    return NULL;
    7474}
     75
     76void Variables::Add( Variable *pVar, bool isInitArea )
     77{
     78    int alignment = 0;
     79    if( pVar->GetType().IsStruct() ){
     80        alignment = pVar->GetType().GetClass().GetFixedAlignment();
     81    }
     82
     83    if( isInitArea ){
     84        //初期バッファがあるとき
     85
     86        if( alignment ){
     87            if( allInitSize % alignment ){
     88                allInitSize += alignment - (allInitSize % alignment);
     89            }
     90        }
     91
     92        pVar->SetOffsetAddress( allInitSize );
     93        allInitSize += pVar->GetMemorySize();
     94    }
     95    else{
     96        //初期バッファがないとき
     97
     98        if( alignment ){
     99            if( allSize % alignment ){
     100                allSize += alignment - (allSize % alignment);
     101            }
     102        }
     103
     104        pVar->SetOffsetAddress( allSize | 0x80000000 );
     105        allSize += pVar->GetMemorySize();
     106    }
     107
     108    push_back( pVar );
     109}
Note: See TracChangeset for help on using the changeset viewer.