diff options
| author | Chris Apers | 2007-01-14 11:02:24 +0000 | 
|---|---|---|
| committer | Chris Apers | 2007-01-14 11:02:24 +0000 | 
| commit | b500f02e617f2f7758783ea671a5d9a83c149db4 (patch) | |
| tree | e23722a013d1196099630ad13a879e1a1727ee37 /backends/platform/PalmOS/Src | |
| parent | bc041f4b2546034f34cd656dcdd6333f61dd3734 (diff) | |
| download | scummvm-rg350-b500f02e617f2f7758783ea671a5d9a83c149db4.tar.gz scummvm-rg350-b500f02e617f2f7758783ea671a5d9a83c149db4.tar.bz2 scummvm-rg350-b500f02e617f2f7758783ea671a5d9a83c149db4.zip  | |
Added static initializers to handle global objects allocation
svn-id: r25078
Diffstat (limited to 'backends/platform/PalmOS/Src')
| -rw-r--r-- | backends/platform/PalmOS/Src/native/pnoARM.c | 24 | ||||
| -rw-r--r-- | backends/platform/PalmOS/Src/native/zodiacARM.cpp | 5 | ||||
| -rw-r--r-- | backends/platform/PalmOS/Src/native/zodiacStartup.cpp | 12 | 
3 files changed, 32 insertions, 9 deletions
diff --git a/backends/platform/PalmOS/Src/native/pnoARM.c b/backends/platform/PalmOS/Src/native/pnoARM.c index 9033a4a5d7..e072abca4d 100644 --- a/backends/platform/PalmOS/Src/native/pnoARM.c +++ b/backends/platform/PalmOS/Src/native/pnoARM.c @@ -33,19 +33,25 @@  // contrast to "PilotMain" for 68K applications.  #define PNO_Main ARMlet_Main -#ifdef COMPILE_ZODIAC -	const void*      twEmulState; -	Call68KFuncType* twCall68KFunc; -#endif +/* Prepare static initializers */ +extern long __sinit__[]; +extern void __ARMlet_Startup__(); + +/* simple function pointer	*/ +typedef void (*StaticInitializer)(void);  unsigned long PNO_Main(const void *emulStateP, void *userData68KP, Call68KFuncType *call68KFuncP) { -#ifdef COMPILE_ZODIAC -    twEmulState = emulStateP; -    twCall68KFunc = call68KFuncP; -#else  	global.emulStateP = (EmulStateType *)emulStateP;  	global.call68KFuncP = call68KFuncP; -#endif + +	// handle static initializers +	if (__sinit__) { +		long base = (long)__ARMlet_Startup__; +		long s, *p; + +		for (p = __sinit__; p && (s = *p) != 0; p++) +			((StaticInitializer)(s + base))(); +	}  	return PilotMain(sysAppLaunchCmdNormalLaunch, userData68KP, 0);  } diff --git a/backends/platform/PalmOS/Src/native/zodiacARM.cpp b/backends/platform/PalmOS/Src/native/zodiacARM.cpp index e885966fa2..6bea511258 100644 --- a/backends/platform/PalmOS/Src/native/zodiacARM.cpp +++ b/backends/platform/PalmOS/Src/native/zodiacARM.cpp @@ -48,6 +48,8 @@ GlobalsDataType g_vars;  GlobalsDataPtr gVars = &g_vars;  UInt32 g_stackSize; +extern "C" void __destroy_global_chain(void); +  static void palm_main(int argc, char **argvP)  {  #ifdef COMPILE_OS5  	if (gVars->advancedMode) @@ -143,5 +145,8 @@ extern UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) {  		free(g_newStack);  	} +	// Destroy all constructed global objects +	__destroy_global_chain(); +  	return 0;  } diff --git a/backends/platform/PalmOS/Src/native/zodiacStartup.cpp b/backends/platform/PalmOS/Src/native/zodiacStartup.cpp index 64ac89ab5b..9a898bacb0 100644 --- a/backends/platform/PalmOS/Src/native/zodiacStartup.cpp +++ b/backends/platform/PalmOS/Src/native/zodiacStartup.cpp @@ -56,6 +56,7 @@ UInt32 __ARMlet_Startup__(const void*, void*, Call68KFuncType*);   * mark the start and end of the various data sections.   */  extern long __DataStart__[]; +extern long __sinit__[];  extern long __RODataStart__[];  extern long __BSSStart__[];  extern long __BSSEnd__[]; @@ -64,6 +65,9 @@ extern long __CodeRelocEnd__[];  extern long __DataRelocStart__[];  extern long __DataRelocEnd__[]; +/*	simple function pointer	*/ +typedef void (*StaticInitializer)(void); +  /*   * This function performs relocation for Tapwave Native Application.   */ @@ -73,6 +77,14 @@ static void relocate(void)      long base = (long) __ARMlet_Startup__;      long *cur, *end; +	// handle static initializers +	if (__sinit__) { +		long s, *p; + +		for (p = __sinit__; p && (s = *p) != 0; p++) +			((StaticInitializer)(s + base))(); +	} +      // handle code-to-data relocation      cur = __CodeRelocStart__;      end = __CodeRelocEnd__;  | 
