source: dev/trunk/ab5.0/abdev/ab_common/include/Lexical/NativeCode.h @ 636

Last change on this file since 636 was 636, checked in by dai_9181, 15 years ago

libファイルを跨ったテンプレート展開に対応。

File size: 6.1 KB
Line 
1#pragma once
2
3class UserProc;
4class DllProc;
5class CClass;
6
7class Schedule
8{
9public:
10    enum Type
11    {
12        None = 10000,
13        GlobalVar,      // グローバル変数スケジュール
14        DataTable,      // データテーブル スケジュール
15        CatchAddress,   // Catchアドレス スケジュール
16        Relocation,     // リロケーション情報スケジュール
17        UserProc,       // ユーザ定義関数呼び出し側スケジュール
18        AddressOf,      // ユーザ定義関数位置スケジュール
19        DllProc,        // DLL関数位置スケジュール
20        ComVtbl,        // com_vtblスケジュール
21        Vtbl,           // vtblスケジュール
22        TypeInfo,       // TypeInfoスケジュール
23    };
24
25private:
26    Type type;
27    long offset;
28
29    union{
30        LONG_PTR lpValue;
31        const ::UserProc *pUserProc;
32        const ::DllProc *pDllProc;
33        const ::CClass *pClass;
34    };
35
36    // XMLシリアライズ用
37private:
38    friend class boost::serialization::access;
39    template<class Archive> void serialize(Archive& ar, const unsigned int version)
40    {
41        trace_for_serialize( "serializing - Schedule" );
42
43        ar & BOOST_SERIALIZATION_NVP( type );
44        ar & BOOST_SERIALIZATION_NVP( offset );
45
46        switch( type )
47        {
48        case UserProc:
49        case AddressOf:
50        case CatchAddress:
51            ar & boost::serialization::make_nvp("pUserProc", const_cast<::UserProc *&>(pUserProc));
52            break;
53        case DllProc:
54            ar & boost::serialization::make_nvp("pDllProc", const_cast<::DllProc *&>(pDllProc));
55            break;
56        case ComVtbl:
57        case Vtbl:
58        case TypeInfo:
59            ar & boost::serialization::make_nvp("pClass", const_cast<::CClass *&>(pClass));
60            break;
61        default:
62            ar & BOOST_SERIALIZATION_NVP( lpValue );
63            break;
64        }
65    }
66
67public:
68    Schedule()
69    {
70    }
71    Schedule( Type type, long offset, LONG_PTR lpValue = 0 )
72        : type( type )
73        , offset( offset )
74        , lpValue( lpValue )
75    {
76    }
77    Schedule( Schedule::Type type, const ::UserProc *pUserProc, long offset )
78        : type( type )
79        , offset( offset )
80        , pUserProc( pUserProc )
81    {
82    }
83    Schedule( const ::DllProc *pDllProc, long offset )
84        : type( Schedule::DllProc )
85        , offset( offset )
86        , pDllProc( pDllProc )
87    {
88    }
89    Schedule( Type type, const ::CClass *pClass, long offset )
90        : type( type )
91        , pClass( pClass )
92        , offset( offset )
93    {
94        if( !( type == Schedule::ComVtbl || type == Schedule::Vtbl || type == Schedule::TypeInfo ) )
95        {
96            DebugBreak();
97        }
98    }
99    ~Schedule()
100    {
101    }
102
103    Type GetType() const
104    {
105        return type;
106    }
107    long GetOffset() const
108    {
109        return offset;
110    }
111    LONG_PTR GetLongPtrValue() const
112    {
113        return lpValue;
114    }
115    const ::DllProc &GetDllProc() const;
116    const ::UserProc &GetUserProc() const;
117    const ::CClass &GetClass() const;
118};
119typedef std::vector<Schedule> Schedules;
120
121#define CODETYPE_SYSTEMPROC     0x0001
122#define CODETYPE_DEBUGPROC      0x0002
123class SourceLine
124{
125    int lineNum;
126    long nativeCodePos;
127    int relationalObjectModuleIndex;
128    long sourceCodePos;
129    DWORD codeType;
130
131    // XMLシリアライズ用
132private:
133    friend class boost::serialization::access;
134    template<class Archive> void serialize(Archive& ar, const unsigned int version)
135    {
136        trace_for_serialize( "serializing - SourceLine" );
137
138        ar & BOOST_SERIALIZATION_NVP( lineNum );
139        ar & BOOST_SERIALIZATION_NVP( nativeCodePos );
140        ar & BOOST_SERIALIZATION_NVP( relationalObjectModuleIndex );
141        ar & BOOST_SERIALIZATION_NVP( sourceCodePos );
142        ar & BOOST_SERIALIZATION_NVP( codeType );
143    }
144
145public:
146    SourceLine( int lineNum, int nativeCodePos, int relationalObjectModuleIndex, int sourceCodePos, DWORD codeType )
147        : lineNum( lineNum )
148        , nativeCodePos( nativeCodePos )
149        , relationalObjectModuleIndex( relationalObjectModuleIndex )
150        , sourceCodePos( sourceCodePos )
151        , codeType( codeType )
152    {
153    }
154    SourceLine()
155    {
156    }
157
158    int GetLineNum() const
159    {
160        return lineNum;
161    }
162    long GetNativeCodePos() const
163    {
164        return nativeCodePos;
165    }
166    int GetRelationalObjectModuleIndex() const
167    {
168        return relationalObjectModuleIndex;
169    }
170    void SetRelationalObjectModuleIndex( int relationalObjectModuleIndex )
171    {
172        this->relationalObjectModuleIndex = relationalObjectModuleIndex;
173    }
174    long GetSourceCodePos() const
175    {
176        return sourceCodePos;
177    }
178    void SetSourceCodePos( int sourceCodePos )
179    {
180        this->sourceCodePos = sourceCodePos;
181    }
182    DWORD GetCodeType() const
183    {
184        return codeType;
185    }
186    bool IsInSystemProc() const
187    {
188        return ( (codeType&CODETYPE_SYSTEMPROC) != 0 );
189    }
190    bool IsInDebugProc() const
191    {
192        return ( (codeType&CODETYPE_DEBUGPROC) != 0 );
193    }
194};
195typedef std::vector<SourceLine> SourceLines;
196
197class NativeCode : public Jenga::Common::Binary
198{
199    // リンカで解決しなければならないスケジュール
200    Schedules schedules;
201
202    // ソースコード行番号とネイティブコード位置の対応情報
203    SourceLines sourceLines;
204
205    // XMLシリアライズ用
206private:
207    friend class boost::serialization::access;
208    template<class Archive> void serialize(Archive& ar, const unsigned int version)
209    {
210        trace_for_serialize( "serializing(load) - NativeCode" );
211
212        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Jenga::Common::Binary );
213        ar & BOOST_SERIALIZATION_NVP( schedules );
214        ar & BOOST_SERIALIZATION_NVP( sourceLines );
215    }
216
217public:
218    NativeCode()
219        : Jenga::Common::Binary()
220    {
221    }
222    NativeCode( const NativeCode &nativeCode )
223        : Jenga::Common::Binary()
224    {
225        PutEx( nativeCode );
226    }
227    NativeCode( const char *codeBuffer, int size )
228        : Jenga::Common::Binary( codeBuffer, size )
229    {
230    }
231    ~NativeCode()
232    {
233    }
234
235    void operator =( const NativeCode &nativeCode )
236    {
237        Clear();
238        PutEx( nativeCode );
239    }
240
241    const Schedules &GetSchedules() const
242    {
243        return schedules;
244    }
245
246    void PutEx( const NativeCode &nativeCode );
247    void PutEx( long l, Schedule::Type scheduleType );
248    void PutUserProcSchedule( const UserProc *pUserProc, bool isCall );
249    void PutCatchAddressSchedule( const UserProc *pUserProc, long codePos );
250    void PutDllProcSchedule( const DllProc *pDllProc );
251    void PutComVtblSchedule( const CClass *pClass );
252    void PutVtblSchedule( const CClass *pClass );
253
254    const SourceLines &GetSourceLines() const
255    {
256        return sourceLines;
257    }
258    void NextSourceLine( int currentSourceIndex, int nowLine );
259
260    void ResetDataSectionBaseOffset( long dataSectionBaseOffset );
261    void ResetSourceIndexes( const std::vector<int> &relationTable );
262};
Note: See TracBrowser for help on using the repository browser.