source: dev/trunk/abdev/BasicCompiler_Common/PESchedule.cpp@ 220

Last change on this file since 220 was 206, checked in by dai_9181, 17 years ago

コード全体のリファクタリングを実施

File size: 6.6 KB
Line 
1#include "stdafx.h"
2
3#include "../BasicCompiler_Common/common.h"
4
5#ifdef _AMD64_
6#include "../BasicCompiler64/opcode.h"
7#else
8#include "../BasicCompiler32/opcode.h"
9#endif
10
11extern HANDLE hHeap;
12
13/////////////////////////////////////////////
14// 再配置スケジュール
15//
16// メモリの再配置は.textセクション、または.dataセクションに行われることが予想される。
17// .textセクション … セクションデータへのポインタ
18// .dataセクション … vtblの再配置
19/////////////////////////////////////////////
20
21CReloc *pobj_Reloc;
22
23CReloc::CReloc(){
24 buffer=0;
25 length=0;
26 NowPageRVAToReloc=0;
27
28 pdwData_CodeSection=(DWORD *)HeapAlloc(hHeap,0,1);
29 iNum_CodeSection=0;
30 pdwData_DataSection=(DWORD *)HeapAlloc(hHeap,0,1);
31 iNum_DataSection=0;
32}
33CReloc::~CReloc(){
34 AllFree();
35}
36void CReloc::AllFree(void){
37 if(buffer){
38 HeapDefaultFree(buffer);
39 buffer=0;
40 }
41
42 HeapDefaultFree(pdwData_CodeSection);
43 HeapDefaultFree(pdwData_DataSection);
44}
45void CReloc::copy(CReloc *por){
46 AllFree();
47
48 if(por->buffer){
49 buffer=(char *)HeapReAlloc(hHeap,0,buffer,por->length);
50 memcpy(buffer,por->buffer,por->length);
51 }
52 else buffer=0;
53
54 length=por->length;
55
56 NowPageRVAToReloc=por->NowPageRVAToReloc;
57 NowCountAddrToReloc=por->NowCountAddrToReloc;
58
59 iNum_CodeSection=por->iNum_CodeSection;
60 pdwData_CodeSection=(DWORD *)HeapAlloc(hHeap,0,iNum_CodeSection*sizeof(DWORD));
61 memcpy(pdwData_CodeSection,por->pdwData_CodeSection,iNum_CodeSection*sizeof(DWORD));
62
63 iNum_DataSection=por->iNum_DataSection;
64 pdwData_DataSection=(DWORD *)HeapAlloc(hHeap,0,iNum_DataSection*sizeof(DWORD));
65 memcpy(pdwData_DataSection,por->pdwData_DataSection,iNum_DataSection*sizeof(DWORD));
66}
67
68void CReloc::AddSchedule_CodeSection(DWORD addr){
69 extern BOOL bDll;
70 if(!bDll) return;
71
72 pdwData_CodeSection=(DWORD *)HeapReAlloc(hHeap,0,pdwData_CodeSection,(iNum_CodeSection+1)*sizeof(DWORD));
73 pdwData_CodeSection[iNum_CodeSection]=addr;
74 iNum_CodeSection++;
75}
76void CReloc::AddSchedule_DataSection(DWORD addr){
77 extern BOOL bDll;
78 if(!bDll) return;
79
80 pdwData_DataSection=(DWORD *)HeapReAlloc(hHeap,0,pdwData_DataSection,(iNum_DataSection+1)*sizeof(DWORD));
81 pdwData_DataSection[iNum_DataSection]=addr;
82 iNum_DataSection++;
83}
84
85void CReloc::__add(DWORD addr){
86 extern BOOL bDll;
87 if(!bDll) return;
88
89 BOOL sw;
90 sw=0;
91 while((addr-(addr%MEM_ALIGNMENT))>NowPageRVAToReloc){
92 NowPageRVAToReloc+=MEM_ALIGNMENT;
93 sw=1;
94 }
95
96 if(sw){
97 //ページを増やす
98 while(length%4){
99 buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+sizeof(WORD));
100 (*(WORD *)(buffer+length))=0;
101 length+=2;
102
103 (*(DWORD *)(buffer+NowCountAddrToReloc))+=sizeof(WORD);
104 }
105
106 buffer=(char *)HeapReAlloc(hHeap,0,buffer,
107 length+
108 sizeof(DWORD)+
109 sizeof(DWORD));
110
111 //Page RVA
112 *(DWORD *)(buffer+length)=NowPageRVAToReloc;
113 length+=sizeof(DWORD);
114
115 NowCountAddrToReloc=length;
116
117 //Block size
118 *(DWORD *)(buffer+length)=sizeof(DWORD)*2;
119 length+=sizeof(DWORD);
120 }
121
122 //リロケーション情報の追加
123 buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+sizeof(WORD));
124 buffer[length]=0;
125 buffer[length+1]=0x30; //=IMAGE_REL_BASED_HIGHLOW
126 (*(WORD *)(buffer+length))|=addr&0x0FFF;
127 length+=2;
128
129 (*(DWORD *)(buffer+NowCountAddrToReloc))+=sizeof(WORD);
130}
131void CReloc::ResetRelocBuffer(void){
132 if(buffer) HeapDefaultFree(buffer);
133
134 buffer=(char *)HeapAlloc(hHeap,0,1);
135 length=0;
136 NowPageRVAToReloc=0;
137
138 int i;
139 for(i=0;i<iNum_CodeSection;i++){
140 extern int MemPos_CodeSection;
141 __add(MemPos_CodeSection + pdwData_CodeSection[i]);
142 }
143
144 for(i=0;i<iNum_DataSection;i++){
145 extern int MemPos_DataSection;
146 __add(MemPos_DataSection + pdwData_DataSection[i]);
147 }
148}
149
150
151
152
153//////////////////////////
154// 一般スケジュール
155//////////////////////////
156
157CSchedule::CSchedule(){
158 pObpValues=(int *)HeapAlloc(hHeap,0,1);
159 num=0;
160
161 this->flag=0;
162}
163CSchedule::~CSchedule(){
164 HeapDefaultFree(pObpValues);
165}
166void CSchedule::SetFlag(int flag){
167 this->flag=flag;
168}
169void CSchedule::add(){
170 pObpValues=(int *)HeapReAlloc(hHeap,0,pObpValues,(num+1)*sizeof(int));
171 pObpValues[num]=obp;
172 num++;
173
174 if(flag&SCHEDULE_FLAG_RELOC){
175 //リロケーション情報を追加する
176 pobj_Reloc->AddSchedule_CodeSection(obp);
177 }
178}
179void CSchedule::move(int iStartPos,int iSize,int offset){
180 int i;
181 for(i=0;i<num;i++){
182 if(iStartPos<=pObpValues[i] && pObpValues[i]<iStartPos+iSize){
183 pObpValues[i]+=offset;
184 }
185 }
186}
187
188//データテーブルスケジュール
189CSchedule *pobj_DataTableSchedule;
190
191//グローバル変数アドレススケジュール
192CSchedule *pobj_GlobalVarSchedule;
193
194
195
196/////////////////////////////////////////
197// インポート アドレス スケジューリング
198/////////////////////////////////////////
199
200CImportAddrSchedule::CImportAddrSchedule(){
201 ppdi=(const DllProc **)HeapAlloc(hHeap,0,1);
202}
203CImportAddrSchedule::~CImportAddrSchedule(){
204 HeapDefaultFree(ppdi);
205}
206
207void CImportAddrSchedule::add(const DllProc *pDllProc){
208 ppdi=(const DllProc **)HeapReAlloc(hHeap,0,ppdi,(num+1)*sizeof(DllProc *));
209 ppdi[num]=pDllProc;
210
211 CSchedule::add();
212}
213
214CImportAddrSchedule *pobj_ImportAddrSchedule;
215
216
217
218
219/////////////////////////////////////////
220// プロシージャ アドレス スケジューリング
221/////////////////////////////////////////
222
223CSubAddrSchedule::CSubAddrSchedule(){
224 ppsi=(const UserProc **)HeapAlloc(hHeap,0,1);
225 pbCall=(BOOL *)HeapAlloc(hHeap,0,1);
226}
227CSubAddrSchedule::~CSubAddrSchedule(){
228 HeapDefaultFree(ppsi);
229 HeapDefaultFree(pbCall);
230}
231
232void CSubAddrSchedule::add(const UserProc *pUserProc,BOOL bCall){
233 if(!pUserProc) return;
234
235 ppsi=(const UserProc **)HeapReAlloc(hHeap,0,ppsi,(num+1)*sizeof(UserProc *));
236 ppsi[num]=pUserProc;
237 pbCall=(BOOL *)HeapReAlloc(hHeap,0,pbCall,(num+1)*sizeof(BOOL));
238 pbCall[num]=bCall;
239
240 CSchedule::add();
241
242 if(!bCall){
243 //リロケーション情報を追加する
244 pobj_Reloc->AddSchedule_CodeSection(obp);
245 }
246}
247
248CSubAddrSchedule *pobj_SubAddrSchedule;
249
250
251
252
253/////////////////////////////////////////
254// 一時スケジューリングポインタ
255/////////////////////////////////////////
256CTempSchedule::CTempSchedule(){
257 ppObpValues=(int **)HeapAlloc(hHeap,0,1);
258 num=0;
259}
260CTempSchedule::~CTempSchedule(){
261 HeapDefaultFree(ppObpValues);
262}
263void CTempSchedule::lock(int *pobp){
264 ppObpValues=(int **)HeapReAlloc(hHeap,0,ppObpValues,(num+1)*sizeof(int *));
265 ppObpValues[num]=pobp;
266 num++;
267}
268void CTempSchedule::unlock(){
269 if( num <= 0 ){
270 //エラー
271 SetError(300,NULL,cp);
272 }
273 num--;
274}
275void CTempSchedule::move(int iStartPos,int iSize,int offset){
276 int i;
277 for(i=0;i<num;i++){
278 if(iStartPos<=*ppObpValues[i] && *ppObpValues[i]<iStartPos+iSize){
279 (*ppObpValues[i])+=offset;
280 }
281 }
282}
283
284CTempSchedule *pobj_TempSchedule;
285
286
287
288
Note: See TracBrowser for help on using the repository browser.