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

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