source: dev/trunk/ab5.0/abdev/ab_common/src/Lexical/NativeCode.cpp@ 639

Last change on this file since 639 was 639, checked in by dai_9181, 16 years ago

静的リンクリンカの依存関係解決モジュールを製作中

File size: 4.4 KB
Line 
1#include "stdafx.h"
2
3#define BREAK_EIP(checkEip) (obp+0x00401000>=checkEip)
4
5const ::DllProc &Schedule::GetDllProc() const
6{
7 _ASSERT( type == Schedule::DllProc );
8 return *pDllProc;
9}
10const ::UserProc &Schedule::GetUserProc() const
11{
12 _ASSERT( type == Schedule::UserProc || type == Schedule::AddressOf || type == Schedule::CatchAddress );
13 return *pUserProc;
14}
15const ::CClass &Schedule::GetClass() const
16{
17 _ASSERT( type == Schedule::ComVtbl || type == Schedule::Vtbl || type == Schedule::TypeInfo );
18 return *pClass;
19}
20
21bool Schedule::Resolve( const ObjectModule &resolver )
22{
23 switch( type )
24 {
25 case UserProc:
26 case AddressOf:
27 case CatchAddress:
28 if( pUserProc->IsNeedResolve() )
29 {
30 pUserProc = resolver.meta.GetUserProcs().FindLike( pUserProc );
31 }
32 break;
33 case DllProc:
34 if( pDllProc->IsNeedResolve() )
35 {
36 pDllProc = resolver.meta.GetDllProcs().FindLike( pDllProc );
37 }
38 break;
39 case ComVtbl:
40 case Vtbl:
41 case TypeInfo:
42 if( pClass->IsNeedResolve() )
43 {
44 pClass = resolver.meta.GetClasses().FindLike( pClass );
45 }
46 break;
47 default:
48 break;
49 }
50
51 return true;
52}
53
54void NativeCode::PutEx( const NativeCode &nativeCode )
55{
56 long baseOffset = GetSize();
57
58 // コードバッファを追加
59 Put( nativeCode.GetBuffer(), nativeCode.GetSize() );
60
61 // スケジュールを追加
62 BOOST_FOREACH( const Schedule &schedule, nativeCode.schedules )
63 {
64 this->schedules.push_back(
65 Schedule(
66 schedule.GetType(),
67 baseOffset + schedule.GetOffset(),
68 schedule.GetLongPtrValue()
69 )
70 );
71 }
72
73 // ソースコード行番号とネイティブコード位置の対応情報を追加
74 BOOST_FOREACH( const SourceLine &sourceLine, nativeCode.sourceLines )
75 {
76 this->sourceLines.push_back(
77 SourceLine(
78 baseOffset + sourceLine.GetNativeCodePos(),
79 sourceLine.GetCodeType(),
80 sourceLine.GetSourceCodePosition()
81 )
82 );
83 }
84}
85
86void NativeCode::PutEx( long l, Schedule::Type scheduleType )
87{
88 if( scheduleType != Schedule::None )
89 {
90 schedules.push_back( Schedule( scheduleType, GetSize() ) );
91 }
92
93 Put( l );
94}
95
96void NativeCode::PutUserProcSchedule( const UserProc *pUserProc, bool isCall )
97{
98 pUserProc->Using();
99
100 Schedule::Type type = isCall ? Schedule::UserProc : Schedule::AddressOf;
101
102 schedules.push_back( Schedule( type, pUserProc, GetSize() ) );
103
104 Put( (long)0 );
105}
106
107void NativeCode::PutCatchAddressSchedule( const UserProc *pUserProc, long codePos )
108{
109 pUserProc->Using();
110
111 schedules.push_back( Schedule( Schedule::CatchAddress, pUserProc, GetSize() ) );
112
113 Put( codePos );
114}
115
116void NativeCode::PutDllProcSchedule( const DllProc *pDllProc )
117{
118 pDllProc->Using();
119
120 schedules.push_back( Schedule( pDllProc, GetSize() ) );
121
122 Put( (long)0 );
123}
124
125void NativeCode::PutComVtblSchedule( const CClass *pClass )
126{
127 schedules.push_back( Schedule( Schedule::ComVtbl, pClass, GetSize() ) );
128
129 Put( (long)0 );
130}
131
132void NativeCode::PutVtblSchedule( const CClass *pClass )
133{
134 schedules.push_back( Schedule( Schedule::Vtbl, pClass, GetSize() ) );
135
136 Put( (long)0 );
137}
138
139void NativeCode::NextSourceLine( const SourceCodePosition &sourceCodePosition )
140{
141 if( sourceLines.size() )
142 {
143 if( sourceLines.back().GetNativeCodePos() == GetSize() )
144 {
145 sourceLines.back().SetSourceCodePosition( sourceCodePosition );
146 return;
147 }
148 }
149
150 extern BOOL bDebugSupportProc;
151 extern BOOL bSystemProc;
152 DWORD sourceLineType = 0;
153 if( bDebugSupportProc )
154 {
155 sourceLineType |= CODETYPE_DEBUGPROC;
156 }
157 if( bSystemProc )
158 {
159 sourceLineType |= CODETYPE_SYSTEMPROC;
160 }
161 sourceLines.push_back(
162 SourceLine(
163 GetSize(),
164 sourceLineType,
165 sourceCodePosition
166 )
167 );
168}
169
170void NativeCode::ResetDataSectionBaseOffset( long dataSectionBaseOffset )
171{
172 BOOST_FOREACH( const Schedule &schedule, schedules )
173 {
174 if( schedule.GetType() == Schedule::DataTable )
175 {
176 Overwrite(
177 schedule.GetOffset(),
178 GetLong( schedule.GetOffset() ) + dataSectionBaseOffset
179 );
180 }
181 }
182}
183void NativeCode::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
184{
185 BOOST_FOREACH( SourceLine &sourceLine, sourceLines )
186 {
187 sourceLine.GetSourceCodePosition().SetRelationalObjectModuleIndex(
188 relationTable[sourceLine.GetSourceCodePosition().GetRelationalObjectModuleIndex()]
189 );
190 }
191}
192
193void NativeCode::Resolve( const ObjectModule &resolver )
194{
195 BOOST_FOREACH( Schedule &schedule, schedules )
196 {
197 schedule.Resolve( resolver );
198 }
199}
Note: See TracBrowser for help on using the repository browser.