Index: trunk/abdev/BasicCompiler64/MakePeHdr.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/MakePeHdr.cpp	(revision 268)
+++ trunk/abdev/BasicCompiler64/MakePeHdr.cpp	(revision 308)
@@ -2,4 +2,6 @@
 
 #include <jenga/include/common/Environment.h>
+#include <jenga/include/common/Path.h>
+#include <jenga/include/common/Directory.h>
 
 #include <jenga/include/smoothie/Smoothie.h>
@@ -29,4 +31,5 @@
 	*pSub_System_InitStaticLocalVariables,
 	*pSub_System_Call_Destructor_of_GlobalObject,
+	*pSub_System_End,
 	*pSub_System_GetSp,
 	*pSub_pow,
@@ -88,16 +91,4 @@
 
 
-void DebugVariable(void){
-	char temporary[255];
-	sprintf(temporary,"_DebugSys_dwThreadID[255]%c%cDWord",1,ESC_AS);
-	OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
-	sprintf(temporary,"_DebugSys_ProcNum[255]%c%cDWord",1,ESC_AS);
-	OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
-	sprintf(temporary,"_DebugSys_lplpObp[255]%c%c*ULONG_PTR",1,ESC_AS);
-	OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
-	sprintf(temporary,"_DebugSys_lplpSpBase[255]%c%c*ULONG_PTR",1,ESC_AS);
-	OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
-}
-
 void Compile(void){
 	extern HWND hMainDlg;
@@ -158,5 +149,5 @@
 	// 名前空間情報を取得
 	NamespaceSupporter::CollectNamespaces(
-		compiler.source.GetBuffer(),
+		compiler.GetObjectModule().GetCurrentSource().GetBuffer(),
 		compiler.GetObjectModule().meta.GetNamespaces()
 	);
@@ -165,8 +156,8 @@
 	//   CollectProcedures関数の中で参照されるオブジェクト名を事前に取得する。
 	//     ※オブジェクトの内容までは取得しない
-	compiler.GetObjectModule().meta.GetClasses().CollectClassesForNameOnly( compiler.source );
+	compiler.GetObjectModule().meta.GetClasses().CollectClassesForNameOnly( compiler.GetObjectModule().GetCurrentSource() );
 
 	//TypeDef情報を初期化
-	compiler.GetObjectModule().meta.GetTypeDefs().Init();
+	compiler.GetObjectModule().meta.GetTypeDefs().CollectTypeDefs();
 
 	//定数情報を取得
@@ -176,5 +167,5 @@
 	compiler.pCompilingClass = NULL;
 	CollectProcedures(
-		compiler.source,
+		compiler.GetObjectModule().GetCurrentSource(),
 		compiler.GetObjectModule().meta.GetUserProcs(),
 		compiler.GetObjectModule().meta.GetDllProcs()
@@ -262,4 +253,8 @@
 	}
 
+	if(pSub_System_End=GetSubHash("_System_End",1)){
+		pSub_System_End->Using();
+	}
+
 	if(pSub_System_GetSp=GetSubHash("_System_GetSp",1)){
 		pSub_System_GetSp->Using();
@@ -298,37 +293,12 @@
 	}
 
-
-
-	//データテーブルスケジュール
-	pobj_DataTableSchedule=new CSchedule();
-	pobj_DataTableSchedule->SetFlag(SCHEDULE_FLAG_RELOC);
-
-	//インポートテーブルスケジュール
-	//※x64はRPI（実行中アドレス）からのオフセットになるため、再配置が不要
-	pobj_ImportAddrSchedule=new CImportAddrSchedule();
-
-	//プロシージャポインタスケジュール
-	pobj_SubAddrSchedule=new CSubAddrSchedule();
-
-	//グローバル変数アドレススケジュール
-	pobj_GlobalVarSchedule=new CSchedule();
-	pobj_GlobalVarSchedule->SetFlag(SCHEDULE_FLAG_RELOC);
-
-	//グローバル変数の初期バッファ
-	extern BYTE *initGlobalBuf;
-	initGlobalBuf=(BYTE *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
-
 	//リロケーション情報
 	pobj_Reloc=new CReloc();
 
-	obp_AllocSize=8192*2;
-	OpBuffer=(char *)calloc(obp_AllocSize,1);
-	obp=0;
-
 	//レジスタのブロッキングを管理するためのオブジェクトを生成
 	pobj_BlockReg=new CBlockReg;
 
 	//レキシカルスコープ情報を初期化
-	compiler.codeGenerator.lexicalScopes.Init(obp);
+	compiler.codeGenerator.lexicalScopes.Init(0);
 
 
@@ -373,7 +343,6 @@
 		compiler.codeGenerator.ClearContinueArea();
 
-		//スタックフレーム管理用クラスを初期化
-		extern CStackFrame *pobj_sf;
-		pobj_sf=new CStackFrame();
+		//スタックフレーム管理用クラスを選択
+		pobj_sf = &compiler.GetObjectModule().globalStackFrame;
 
 		// コード生成対象を選択
@@ -386,17 +355,20 @@
 		//breakpoint;
 
-		//sub rsp,スタックフレームサイズ
-		const PertialSchedule *pStackFramePertialSchedule = compiler.codeGenerator.op_sub_rsp( 0, true );
-
-		if(bDebugCompile){
-			//デバッグ用の変数を定義
-			DebugVariable();
-		}
-
-		//GC用の変数を定義
-		InitGCVariables();
-
-		//_System_StartupProgramの呼び出し
-		compiler.codeGenerator.op_call(pSub_System_StartupProgram);
+		if( compiler.IsCore() )
+		{
+			//sub rsp,スタックフレームサイズ
+			const PertialSchedule *pStackFramePertialSchedule = compiler.codeGenerator.op_sub_rsp( 0, true );
+
+			if(bDebugCompile){
+				//デバッグ用の変数を定義
+				DebugVariable();
+			}
+
+			//GC用の変数を定義
+			InitGCVariables();
+
+			//_System_StartupProgramの呼び出し
+			compiler.codeGenerator.op_call(pSub_System_StartupProgram);
+		}
 
 		//クラスに属する静的メンバを定義
@@ -419,34 +391,36 @@
 
 
-		///////////////////////////////////////
-		// グローバル文字列変数の解放処理
-		///////////////////////////////////////
-
-		//call _System_Call_Destructor_of_GlobalObject
-		extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject;
-		compiler.codeGenerator.op_call(pSub_System_Call_Destructor_of_GlobalObject);
-
-
-		//add rsp,スタックフレームサイズ
-		int stackFrameSize = pobj_sf->GetFrameSize(0);
-		compiler.codeGenerator.op_add_RV( REG_RSP, stackFrameSize );
-
-		//xor rax,rax（raxを0に初期化する）
-		compiler.codeGenerator.op_zero_reg(REG_RAX);
-
-		//ret
-		compiler.codeGenerator.op_ret();
+		if( !compiler.IsStaticLibrary() )
+		{
+			///////////////////////////////////////
+			// グローバル文字列変数の解放処理
+			///////////////////////////////////////
+
+			//call _System_End
+			extern const UserProc *pSub_System_End;
+			compiler.codeGenerator.op_call(pSub_System_End);
+
+
+			//add rsp,スタックフレームサイズ
+			int stackFrameSize = pobj_sf->GetFrameSize(0);
+			compiler.codeGenerator.op_add_RV( REG_RSP, stackFrameSize );
+
+			//xor rax,rax（raxを0に初期化する）
+			compiler.codeGenerator.op_zero_reg(REG_RAX);
+
+			//ret
+			compiler.codeGenerator.op_ret();
+
+			//スタックフレームスケジュール（subコマンドに渡す値）
+			compiler.codeGenerator.opfix( pStackFramePertialSchedule, stackFrameSize );
+
+			//スタックフレームスケジュールを実行
+			pobj_sf->RunningSchedule( stackFrameSize );
+			pobj_sf=0;
+		}
 
 		//グローバル実行領域のコードサイズ
 		extern int GlobalOpBufferSize;
-		GlobalOpBufferSize=obp;
-
-		//スタックフレームスケジュール（subコマンドに渡す値）
-		compiler.codeGenerator.opfix( pStackFramePertialSchedule, stackFrameSize );
-
-		//スタックフレームスケジュールを実行
-		pobj_sf->RunningSchedule( stackFrameSize );
-		delete pobj_sf;
-		pobj_sf=0;
+		GlobalOpBufferSize = compiler.linker.GetNativeCode().GetSize();
 
 		//With情報のメモリを解放
@@ -504,7 +478,40 @@
 	trace( "コード生成が終了しました。" );
 
-	vector<ObjectModule *> masterObjectModules;
-	masterObjectModules.push_back( &compiler.GetObjectModule() );
-	compiler.linker.Link( masterObjectModules );
+
+	if( compiler.IsStaticLibrary() )
+	{
+		// 静的リンクライブラリ
+
+		// 格納先ディレクトリを作る
+		Jenga::Common::Path path( OutputFileName );
+		Jenga::Common::Directory dir( path.GetDriveName() + path.GetDirName(), true );
+
+		// 書き込む
+		if( !compiler.GetObjectModule().Write( OutputFileName ) )
+		{
+			MessageBox(0,"XML書き込みに失敗","test",0);
+		}
+		return;
+	}
+
+	extern BOOL bError;
+	if( !bError )
+	{
+		CompileMessage( "リンク中..." );
+	}
+
+
+	compiler.linker.Link( compiler.GetObjectModule() );
+
+	extern SourceLines oldSourceLines;
+	oldSourceLines = compiler.linker.GetNativeCode().GetSourceLines();
+
+
+	/////////////////////////////////////////////////////////////////
+	// vtblの構築
+	/////////////////////////////////////////////////////////////////
+
+	compiler.GetObjectModule().meta.GetClasses().GenerateVTables();
+
 
 
@@ -525,5 +532,4 @@
 
 		if( !pDllProc->IsUsing() ){
-			pDllProc=pDllProc->pNextData;
 			continue;
 		}
@@ -619,9 +625,9 @@
 
 			if( pUserProc->GetName() == "DllMain" ){
-				DllMain_EntryPoint=pUserProc->_beginOpAddressOld;
+				DllMain_EntryPoint = pUserProc->GetBeginOpAddress();
 			}
 
 			lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
-			lpdwExportAddressTable[ExportNum]=pUserProc->_beginOpAddressOld;
+			lpdwExportAddressTable[ExportNum] = pUserProc->GetBeginOpAddress();
 
 			lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
@@ -703,5 +709,4 @@
 
 		if( !pDllProc->IsUsing() ){
-			pDllProc=pDllProc->pNextData;
 			continue;
 		}
@@ -742,5 +747,4 @@
 
 			if( !pDllProc->IsUsing() ){
-				pDllProc=pDllProc->pNextData;
 				continue;
 			}
@@ -780,5 +784,4 @@
 
 			if( !pDllProc->IsUsing() ){
-				pDllProc=pDllProc->pNextData;
 				continue;
 			}
@@ -855,6 +858,14 @@
 
 	//コードセッションのファイル上のサイズ
-	if(obp%FILE_ALIGNMENT) FileSize_CodeSection=obp+(FILE_ALIGNMENT-obp%FILE_ALIGNMENT);
-	else FileSize_CodeSection=obp;
+	if(compiler.linker.GetNativeCode().GetSize()%FILE_ALIGNMENT)
+	{
+		FileSize_CodeSection =
+			compiler.linker.GetNativeCode().GetSize()
+			+ (FILE_ALIGNMENT-compiler.linker.GetNativeCode().GetSize()%FILE_ALIGNMENT);
+	}
+	else
+	{
+		FileSize_CodeSection = compiler.linker.GetNativeCode().GetSize();
+	}
 	if(FileSize_CodeSection) bUse_CodeSection=1;
 	else bUse_CodeSection=0;
@@ -1052,5 +1063,4 @@
 
 			if( !pDllProc->IsUsing() ){
-				pDllProc=pDllProc->pNextData;
 				continue;
 			}
@@ -1070,76 +1080,8 @@
 
 
-	//////////////////////////////
-	// データテーブルスケジュール
-	for(i=0;i<pobj_DataTableSchedule->num;i++){
-		*((long *)(OpBuffer+pobj_DataTableSchedule->pObpValues[i]))+=ImageBase+MemPos_DataSection;
-	}
-	delete pobj_DataTableSchedule;
-
-
-	//////////////////////////////////
-	// インポートテーブルスケジュール（インポート アドレス テーブルを指し示させる）
-	// ※x86はRVAからのオフセット。x64はRPI（実行中アドレス）からのオフセット
-	for(i=0;i<pobj_ImportAddrSchedule->num;i++){
-		const DllProc *pDllProc = pobj_ImportAddrSchedule->ppdi[i];
-		*((long *)(OpBuffer+pobj_ImportAddrSchedule->pObpValues[i]))=
-			MemPos_ImportSection+
-			pDllProc->GetLookupAddress()
-			-(MemPos_CodeSection+pobj_ImportAddrSchedule->pObpValues[i]+sizeof(long));
-	}
-	delete pobj_ImportAddrSchedule;
-
-
-	////////////////////////////////////
-	// プロシージャポインタスケジュール
-	for(i=0;i<pobj_SubAddrSchedule->num;i++){
-		if(pobj_SubAddrSchedule->ppsi[i]->_beginOpAddressOld==0
-			&&pobj_SubAddrSchedule->ppsi[i]->_endOpAddressOld==0){
-			SetError(300,NULL,-1);
-		}
-
-		if(pobj_SubAddrSchedule->pbCall[i]){
-			*((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
-				pobj_SubAddrSchedule->ppsi[i]->_beginOpAddressOld-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
-		}
-		else{
-			*((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
-				pobj_SubAddrSchedule->ppsi[i]->_beginOpAddressOld+ImageBase+MemPos_CodeSection;
-		}
-	}
-	delete pobj_SubAddrSchedule;
-
-
 	if( compiler.IsDll() ){
 		//DLLの場合はリロケーション情報を生成
 		pobj_Reloc->ResetRelocBuffer();
 	}
-
-
-
-	//////////////////////////////////////
-	// グローバル変数アドレススケジュール
-	//////////////////////////////////////
-
-	/*
-	GlobalArea1 - 初期バッファあり
-	GlobalArea2 - 初期バッファなし
-	*/
-	for(i=0;i<pobj_GlobalVarSchedule->num;i++){
-		if(*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x80000000){
-			//初期バッファなし
-			*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))=
-				AllInitGlobalVarSize+
-				(*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x7FFFFFFF)+
-				ImageBase+MemPos_RWSection;
-		}
-		else{
-			//初期バッファあり
-			*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))+=
-				ImageBase+MemPos_RWSection;
-		}
-	}
-	delete pobj_GlobalVarSchedule;
-
 
 
@@ -1149,13 +1091,5 @@
 	compiler.linker.ResolveUserProcSchedules( MemPos_CodeSection );
 	compiler.linker.ResolveGlobalVarSchedules( MemPos_RWSection );
-
-	if( obp == compiler.linker.GetNativeCode().GetSize() )
-	{
-		memcpy( OpBuffer, compiler.linker.GetNativeCode().GetCodeBuffer(), compiler.linker.GetNativeCode().GetSize() );
-	}
-	else
-	{
-		SetError();
-	}
+	compiler.linker.ResolveVtblSchedule( MemPos_DataSection );
 
 
@@ -1349,5 +1283,5 @@
 	memset((char *)CodeSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
 	lstrcpy((char *)CodeSectionHeader.Name,".text");
-	CodeSectionHeader.Misc.VirtualSize=			obp;
+	CodeSectionHeader.Misc.VirtualSize=			MemSize_CodeSection;
 	CodeSectionHeader.VirtualAddress=			MemPos_CodeSection;	//開始アドレス
 	CodeSectionHeader.SizeOfRawData=			FileSize_CodeSection;
@@ -1546,5 +1480,11 @@
 
 	//コード
-	WriteFile(hFile,OpBuffer,obp,(DWORD *)&i2,NULL);
+	WriteFile(
+		hFile,
+		compiler.linker.GetNativeCode().GetBuffer(),
+		compiler.linker.GetNativeCode().GetSize(),
+		(DWORD *)&i2,
+		NULL
+	);
 	i+=i2;
 
@@ -1629,10 +1569,15 @@
 	if(bUse_RWSection){
 		//リライタブル データ テーブル（グローバル変数の初期バッファ）
-		initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
-			HEAP_ZERO_MEMORY,
-			initGlobalBuf,
-			FileSize_RWSection);
-		WriteFile(hFile,initGlobalBuf,FileSize_RWSection,(DWORD *)&i2,NULL);
-		i+=i2;
+		char *temp = (char *)calloc( FileSize_RWSection, 1 );
+		memcpy(
+			temp,
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetBuffer(),
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+		);
+
+		WriteFile(hFile,temp,FileSize_RWSection,(DWORD *)&i2,NULL);
+		i+=i2;
+
+		free( temp );
 	}
 
@@ -1709,11 +1654,4 @@
 	HeapDefaultFree(pHintTable);
 
-	//グローバル変数の初期バッファを解放
-	HeapDefaultFree(initGlobalBuf);
-
-	//コードバッファを解放
-	free(OpBuffer);
-	OpBuffer=0;
-
 	//リソースセクションバッファを解放
 	HeapDefaultFree(RSrcSectionBuffer);
