Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// e32\include\win32atx.h
//
//
/**
@file
@internalComponent
*/
#ifndef __WIN32ATX_H__
#define __WIN32ATX_H__
#if defined(__VC32__)
#define MAX_ATEXIT_HANDLERS 255
#ifdef __KERNEL_MODE__
#define PANIC() Kern::Fault("ATEXIT", __LINE__)
#else
_LIT(KLitAtExitPanic,"ATEXIT");
#define PANIC() User::Panic(KLitAtExitPanic, __LINE__)
#endif
extern "C" {
typedef void (__cdecl* TAtExit)(void);
static TUint sp=0;
static TAtExit handlers[MAX_ATEXIT_HANDLERS];
int atexit(TAtExit aFunc)
{
if (sp>=MAX_ATEXIT_HANDLERS)
PANIC();
handlers[sp++]=aFunc;
return 0;
}
void __call_atexit_handlers()
{
while(sp)
(*handlers[--sp])();
}
#pragma data_seg(".CRT$XPU")
TAtExit __xp_a[] = { __call_atexit_handlers };
}
#elif defined(__CW32__)
struct SDestructorEntry
{
SDestructorEntry* iNext;
TAny* iDstrFn;
TAny* iObj;
};
SDestructorEntry* DEListHead;
extern "C" {
void* __register_global_object(void* obj, void* dfn, void* entry)
{
SDestructorEntry* e = (SDestructorEntry*)entry;
e->iNext = DEListHead;
e->iDstrFn = dfn;
e->iObj = obj;
DEListHead = e;
return obj;
}
__declspec(naked) void __destroy_global_chain(void)
{
_asm push ebp
_asm mov ebp, esp
_asm push ebx
_asm lea ebx, DEListHead
dgc1:
_asm mov ebx, [ebx]
_asm test ebx, ebx
_asm jz dgc0
_asm mov ecx, [ebx+8]
_asm call dword ptr [ebx+4]
_asm jmp dgc1
dgc0:
_asm lea ebx, DEListHead
_asm mov [ebx], 0
_asm pop ebx
_asm mov esp, ebp
_asm pop ebp
_asm ret
}
#pragma data_seg(".CRT$XPU")
void (*__xp_a[])(void) = { &__destroy_global_chain };
}
#elif defined(__GCC32__)
// todo: figure out what to do here
#else
#error Unknown X86 compiler
#endif
#endif