
         TOPPERS/FI4J[l [UY}jA 
                    iC++oCfBOj

        iRelease 1.0 ΉCŏIXV: 20-Apr-2004j

------------------------------------------------------------------------
 TOPPERS/FI4 Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Fullset uItron4 Kernel

 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN
 Copyright (C) 2003-2004 by Takagi Nobuhisa

 L쌠҂́Cȉ (1)`(4) ̏CFree Software Foundation 
 ɂČ\Ă GNU General Public License  Version 2 ɋL
 qĂ𖞂ꍇɌC{\tgEFAi{\tgEFA
 ς̂܂ށDȉjgpEEρEĔzziȉC
 pƌĂԁj邱Ƃ𖳏ŋD
 (1) {\tgEFA\[XR[ȟ`ŗpꍇɂ́CL̒
     \C̗pщL̖ۏ؋K肪Ĉ܂܂̌`Ń\[
     XR[hɊ܂܂Ă邱ƁD
 (2) {\tgEFACCu`ȂǁC̃\tgEFAJɎg
     pł`ōĔzzꍇɂ́CĔzzɔhLgip
     ҃}jAȂǁjɁCL̒쌠\C̗pщL
     ̖ۏ؋Kfڂ邱ƁD
 (3) {\tgEFAC@ɑgݍނȂǁC̃\tgEFAJɎg
     płȂ`ōĔzzꍇɂ́Ĉꂩ̏𖞂
     ƁD
   (a) ĔzzɔhLgip҃}jAȂǁjɁCL̒
       쌠\C̗pщL̖ۏ؋Kfڂ邱ƁD
   (b) Ĕzž`ԂCʂɒ߂@ɂāCTOPPERSvWFNg
       񍐂邱ƁD
 (4) {\tgEFA̗pɂ蒼ړI܂͊ԐړIɐ邢Ȃ鑹
     QCL쌠҂TOPPERSvWFNgƐӂ邱ƁD

 {\tgEFÁCۏ؂Œ񋟂Ă̂łDL쌠҂
 TOPPERSvWFNǵC{\tgEFAɊւāC̓Kp\
 ܂߂āCȂۏ؂sȂD܂C{\tgEFA̗pɂ蒼
 ړI܂͊ԐړIɐȂ鑹QɊւĂC̐ӔC𕉂ȂD
------------------------------------------------------------------------

PDC++oCfBO̊Tv

1.1 ړI

TOPPERS/FI4J[ĺA{CAPI񋟂̂łÂ܂܂ł
C++pAvP[VJsŎxႪB
C++oCfBÓATOPPERS/FI4J[l񋟂T[rXR[C++
ďoƂ\ɂATOPPERS/FI4J[lŕWC++̋@\
pł悤ɂ̂łB

1.2 JƎs

C++oCfBOł́AGCCGNUJgpBȂAWindows
̃V~[ViVisual C++jC++gpۂ́AC++oCf
BŐ@\KvƂȂB

݁AC++oCfBOT|[gs́AMS7727CP01(SH3)
łB̎sŎgpɂ́A^[QbgˑMakefile.config
уJXNvg̏CKvƂȂB
܂ALinux̃V~[Vł͎gp邱ƂłȂB

1.3 C++oCfBŐ@\̊Tv

WC++̋@\̂AsɈˑ镔ɂāATOPPERS/FI4J[
lɑΉĂB̓Iɂ́A񃍁[JIuWFNg̏A
IAO[onewZqdeleteZqAOAуt[
X^fBOɂWCu֐łB

GCĈT|[g̋@\iexportAjo[Tj⊮
̂ł͂ȂB

1.4 C++oCfBO̎gp@

TOPPERS/FI4J[lC++oCfBOgpɂ́ARtBM
[Vt@Ci.cfgjAfi4/systask/cxxrt.cfgCN[h
ł悢BiÓIAPIINCLUDEł͂ȂAvvZbTw߂#include
gp邱Ɓj

TOPPERS/FI4J[lconfiguregpꍇAC++gɂ"-l c++"
IvVtKvB


QDC++oCfBŐ@\

2.1 񃍁[JIuWFNg̏

֐̊OŐ錾ꂽIuWFNgi̖OԂNX̐ÓIf[
^o܂ށj̃RXgN^ANɌďo@\񋟂B

񃍁[JIuWFNg̃RXgN^́Akernel_start֐̌ďo
OɎsAsyslog̋@\gp邱Ƃ͂łȂB
܂ARXgN^̓ł́Avsns_iniT[rXR[ďo
Ƃ͂łȂB

֐̓Ő錾ꂽIuWFNǵANł͂ȂA錾ꂽӏ
ɍŏɎspX|ƂɃRXgN^ďo邽߁A
N̏ɂ͊܂܂ȂB
RXgN^̌ďo̓}`^XNɑΉȂ߁A[U
͕KvɉĔrƎɍsKvB

2.2 I

ÓIȃIuWFNgi֐Ő錾ꂽ̂܂ށj̃fXgN^́A
std::exit֐̒ďoBIstd::exit֐ďoȂ
AS^XNIƂĂfXgN^ďo邱Ƃ͂ȂB
ȂAkernel_exit֐ďoꍇAstd::exit֐ďoꍇ
lɁAÓIȃIuWFNg̃fXgN^͌ďoB

I̓쏇́AÓIAPIVATT_TERœo^I[`ďo
ꂽAstd::atexit֐œo^I֐ďoAŌɃfXg
N^ďoB
ftHg̕WXg[istdin, stdout, stderrjT|[gꍇA
̃N[Y̓fXgN^̌ďoɍsȂ΂ȂȂB
i[U̎ŃJX^}CYKvj

2.3 O[onewZqdeleteZq

TOPPERS/FI4J[l̃}`^XNє}`^XNi
܂͏Ijœ삷newdeleteZq񋟂B
GCC̓O[onewdeleteZqstd::mallocstd:free֐
pĎĂ邽߁ANEWLIBmallocfree֐ɔr
邱ƂŎĂB

C++oCfBÓAC++̃t[X^fBOΏۂƂĂ邪A
L̗RɂA{t[X^fBOł̓T|[gȂA
std::mallocstd::free֐ʓIɃT|[gĂB
炭std::callocstd::realloc֐삷Ǝv邪A
؂͍sĂȂB

WC++̃O[onewdeleteZqɂ́AOX[邱
ȂAconst std::nothrow_t&ɂƂzu\^̂̂邪A
̂̓lɎgp邱ƂłB

2.4 O

C++̌@\łO@\itryAcatchthrowj񋟂B
O̓RpC̎ɖڂɗނ߁ARpĈɃpb`
KvɂȂB

ÓAtrycatcḧʒuƁAthrowcatch܂ł̊Ԃɑ݂
[JIuWFNg̃fXgN^ǗKvBāA
RpCɂƂĖm̕@ŃReLXg؂ւꍇɂ́A
Op̊Ǘ؂ւKvB
C++oCfBÓA}`^XNє}`^XNi
܂͏IjŁAReLXgɉĊǗ؂ւ@\
@\ĂB

GCCł́ARpC-fno-exceptionsIvVw肷邱ƂŁA
O𖳌ɂ邱Ƃł邪A̓IvVw肵|P
ɑ΂Ă̂ݒʗp邱ƂłACúAʏʂAO
gꍇƓlɐUƂɂȂBāAnewAdynamic_castA
邢typeidZqsꍇɂ́A\ʌ듮ɂȂ
邽߁AKȂB

2.5 WCu֐

t[X^fBOC++ł́AIɊւWCu֐
ƂāAstd::abortAstd::atexitAstd::exit֐T|[gB
C++oCfBOłA3ނ̊֐񋟂ĂB

(1) std::abort

std::abort֐́AÓIAPIVATT_TERœo^ꂽI[`A
std::atexit֐œo^ꂽI֐AIuWFNg̃fXgN^
oƂȂAVXeُIB
VXȅÍA}`^XN쒆̓^[QbgˑŒ`
kernel_abort֐ɏ]A}`^XN쒆i܂͏Ij
NEWLIB_exit֐ɏ]B

C++oCfBOł́A֐ւ̃|C^void (*_atabort)(void)0ȊO
ɒ`ĂꍇAۂ̏IOɂďo悤ɂȂ
B
zXgstd::abort́Aۂ̏ȊOstd::raise(SIGABRT);
ďoA_atabortK؂ɐݒ肷邱Ƃœl̋@\G~[g
ƂłB

(2) std::atexit

std::atexit֐́Astd::exit܂kernel_exit֐ďoI
֐o^Bstd::atexit֐œo^֐́Astd::abort֐ŏI
ꍇAvsns_iniTRUEԂԂstd::exit֐pꍇɂ́A
ďo邱ƂȂB

ÓIȃIuWFNg̃fXgN^́Aۂɂstd::atexit֐p邱
ƂŎĂBAfXgN^̌ďóAstd::atexit֐œo
^ꂽ̑̂ȂI֐ɌďoB

std::atexit֐œo^łI֐́AifXgN^̓o^āj
32܂łłB

(3) std::exit

std::exit֐́AC++̕WIȏIsBڍׂȓ́A2.2 I
QƂ̂ƁB

std::exit֐pďIꍇA[JIuWFNg̃fXgN^
ďo邱Ƃ͂ȂB


RDC++sƂĂTOPPERS/FI4J[l

3.1 BOOL^

WC++ɂ́A_^łbool^ƁA_lłtruefalse
BATOPPERS/FI4J[lCŎĂ邽߁A
̌݊ƂӖłBOOL^ɂint^gpKvB
J[l̃RpCC99pꍇłA_Bool^bool^̊Ԃɂ́A
Ȍ݊Ƃ͌߁A͂int^gp
B

3.2 ^XN̗O[N

^XÑGg֐Lb`ȂO[NꍇA݂
łstd::terminate֐ďoBA^XN쒆ext_tsk
ter_tskɂďIɍċNꍇAO[NƖ`
̓ɂȂBċN̗O𐳂삳ɂ́A^XN̐擪
_toppers_cxxrt_reset_specific֐𖾎IɌďoKvBڍׂ
5.3 (3)QƂ̂ƁB

L̂悤_toppers_cxxrt_reset_specific֐p邱ƂŃ^XN
O[Nꍇ̓K肷邱Ƃł邪ÅƂ̌݊
ɔẑł΁A[N͖̓`ƂĈׂłB

3.3 ATT_INIVATT_TER

ÓIAPIATT_INIVATT_TERœo^ꂽ֐O[N
͖̓`łB

3.4 ^XNReLXgƃ^XNO[`

^XNReLXgƃ^XNO[`ł́AOAnew
deleteZqgp邱ƂłȂBQƌ^ɑ΂dynamic_castA
z֐NXւ̎QƂ|C^ɑ΂typeidAO
\邽߁Agp邱ƂłȂB܂AWCu֐
ďoƂłȂB

ȂA^XNOԂŎ^XNɑ΂ras_texɂČďoꂽ^
XNO[`ɌAL͎̐󂯂ȂBA^XNO
[`O[Nꍇ͖̓`łB

3.5 T[rXR[̗Ow

TOPPERS/FI4J[l񋟂ST[rXR[͗OX[邱Ƃ
Ȃ߁AOwthrow()tB
ɂAÔ߂̃e[u邱Ƃŏɗ}
ꍇAƂċԌ̌オ҂łB


SDJ̍\z

C++J̍\źA{Iɂ́uGNUJ\z}jAv̓e
]AꕔقȂ_̂ŁA_𒆐SɉB
ȂAmFɂ́AzXgƂĂCygwin 1.3.22gpB

4.1 Kvȃ\tgEFA

C++J\zɂ́AGCC-COREł͂ȂAGCCKvƂȂB܂A
NEWLIB͕K{łB

    GNUJ
       BINUTILSimF 2.13.2.1j
       GCCimF 3.2.3j
    NEWLIBimF 1.11.0j
    PerlimF 5.8.0j
    GNU MakeimF 3.80j
    GNU sedimF 4.0.7j
    patchimF 2.5.8j

4.2 BINUTILS̃CXg[

BINUTILŚAGCC̃CXg[ɕKvȂ߁CGCCɐ悾ăCXg[
BBINUTILS̃CXg[菇͎̒ʂB

    % mkdir <BINUTILS-OBJDIR>
    % cd <BINUTILS-OBJDIR>
    % <BINUTILS-SRCDIR>/configure --target=<TARGET> --prefix=<PREFIX>\
      --disable-nls
    % make
    % make install

4.3 GCCւ̃pb`

CygwinGCC 3.2.3makeꍇɈꕔQ邽߁Ãpb`
KvƂȂB

    % cp gcc-3.2.3_fixinc_gnu-regex.patch <GCC-SRCDIR>
    % cd <GCC-SRCDIR>
    % patch -p1 < gcc-3.2.3_fixinc_gnu-regex.patch

ȉ̎菇ɏ]āAGCCTOPPERS/FI4J[lɑΉ邽߂̃pb`
ĂB

    % cp gcc-3.2.3_gthr-toppers-1.patch <GCC-SRCDIR>
    % cd <GCC-SRCDIR>
    % patch -p1 < gcc-3.2.3_gthr-toppers-1.patch

4.4 GCC̃CXg[(1)

GCC̃CXg[ɂNEWLIBKvł邪ANEWLIBCXg[
GCCKvȂ߁A኱̍HvKvɂȂB

    % mkdir <GCC-OBJDIR>
    % cd <GCC-OBJDIR>
    % <GCC-SRCDIR>/configure --target=<TARGET> --prefix=<PREFIX>\
      --enable-languages=c,c++ --enable-threads=toppers\
      --disable-nls
    % make all-gcc
    % make install

4.5 NEWLIB̃CXg[

̎菇ɏ]āANEWLIBCXg[D

    % mkdir <NEWLIB-OBJDIR>
    % cd <NEWLIB-OBJDIR>
    % <NEWLIB-SRCDIR>/configure --target=<TARGET> --prefix=<PREFIX>
    % make
    % make install

ȂACygwiño[WɂĂNEWLIB̃CXg[Ɏsꍇ
B̂悤ȏꍇ́ACygwiño[WύX邩ANEWLIBo
Ciœ肷邱ƁB

4.6 GCC̃CXg[(2)

̎菇ɏ]āAGCC̎c蕔CXg[D

    % cd <GCC-OBJDIR>
    % make
    % make install


TDC++oCfBO̎ڍ

5.1 t@C\

(1) cxxrt.cfg

cxxrt.cfgC++Ή^C̓ŎgpIuWFNg𐶐B
C++̋@\gpꍇɂ́AKRtBM[Vt@CA
cxxrt.cfgCN[hKvB

(2) cxxrt.c

cxxrt.cC++Ή^C̖{̂łAOŕKvƂȂ֐
ϐ̒`sB

(3) newlibrt.c

newlibrt.cNEWLIB̊֐TOPPERS/FI4J[lɑΉ邽߂̃^
CłAC++gpꍇɂ͕K{łB
̃^ĆAC++gpȂꍇłANEWLIBgpۂɂ͒P
Ŏgp邱ƂłB

5.2 @\

OѕWC++CuŎgp铯@\񋟂֐QB
WC++Cu̓t[X^fBOł̓T|[gȂA
炭libstdc++̑S@\gp邱ƂłƎvBiA
͊mFĂȂj

(1) int _toppers_cxxrt_lock(_toppers_cxxrt_sync_t *sync);

}`^XN쎞ł́AbN|ANeBJZNVJn
B}`^XN쎞ɂ͉ȂB
ɂ0ԂAsɂ͕̒lԂB

̊֐̓lXeBO\łB

(2) int _toppers_cxxrt_trylock(_toppers_cxxrt_sync_t *sync);

_toppers_cxxrt_lock֐Ƃقړł邪Aɑ̃^XNɂăbN
̏ꍇłҋ@Ԃɂ͈ڍsAPɌďoɎsB
݂̎ł́A_toppers_cxxrt_lock֐̓fBXpb`֎~pĎ
Ă邽߁AǂłB

(3) int _toppers_cxxrt_unlock(_toppers_cxxrt_sync_t *sync);

}`^XN쎞ł́AbNANeBJZNVI
B}`^XN쎞ɂ͉ȂB
ɂ0ԂAsɂ͕̒lԂB

(4) int _toppers_cxxrt_once(_toppers_cxxrt_once_t *once,
                          void (*func)(void));

w肵֐AVXeŜňxsBfuncsɁA
Ȃ^XNł֐s悤ƂꍇAfunc̎s
܂őҋ@ԂɈڍsB
ɂ0ԂAsɂ͕̒lԂB

5.3 ^XN[JL@\

^XNƂɗpӂAÓIȋL񋟂֐QłA
OŎgpB
^XN[JLƂĊmۂł̂́AftHgł2܂łł
A_CXXRT_KEY_MAX}N[U`邱ƂŁA3ȏɊg邱
łB

(1) int _toppers_cxxrt_key_create(struct _toppers_cxxrt_tls **key,
                                void (*dtor)(void*))

^XN[JLɊmۂϐVK쐬B
ɂ0ԂA*keyɕϐʂ邽߂̃L[i[B
dtorɂ́AL[폜ۂɁA^XNƂ̊eϐɑ΂ĎsׂI
w肷B
sɂ͕̒lԂB

(2) int _toppers_cxxrt_key_delete(struct _toppers_cxxrt_tls *key);

_toppers_cxxrt_key_create֐ō쐬L[폜B
ɂ0ԂAsɂ͕̒lԂB

(3) void _toppers_cxxrt_reset_specific(void);

s̃^XNɑ^XN[JL̕ϐBI
^XN[JLgpꍇłȂA^XNŗO
ړIEԐړIɎgpꍇɂ́AK^XNNɂ̊֐ďo
KvB

̊֐͓̃wb_Ɋ֐^錾Ă킯ł͂Ȃ߁Ag
pɂẮAIɊ֐^LqKvBC++Ŋ֐^
Lqꍇ͉L̂悤ɂ邱ƁB

extern "C" void _toppers_cxxrt_reset_specific(void) throw();

5.4 NEWLIB̃JX^}CY

(1) void __malloc_lock(struct _reent *ptr);

mallocfree̔rsB̃^XNɂăbNĂ
󋵂Ōďoꂽꍇ͑ҋ@ԂɈڍsB

(2) void __malloc_unlock(struct _reent *ptr);

__malloc_lock֐ɂ郍bNB

(3) void *_sbrk_r(struct _reent *ptr, ptrdiff_t nbytes);

vÕq[v̈nbyteg傷Bɂ́AV̈̐
ւ̃|C^ԂBs͕̒lԂAerrnoptr->_errno
ENOMEMݒ肷B

q[v̈ɂ́AOʎqendi.bssZNV̏I[jA}`^X
NJnÕX^bN|C^܂łgpB
}bvÃC[W^[Qbgł́A.bssZ
NVƃX^bN|C^̏l𓯈C[WɔzuKv
B

{ł΁A_sbrk_r֐̌n֐ɂ_sbrk֐JX^}CY
ׂł邪A^[QbgɂẮA_write֐Ɠ̖|PʂɃI
Wi_sbrk֐`ĂANɏQ錴Ƃ
邽߁A_sbrk_r֐JX^}CYĂB

5.5 ̑

(1) int main();

FI4J[lœ삷C/C++vO̓t[X^fBOł
邽߁AGg֐mainł͂Ȃkernel_startłBANEWLIB
ł̓Gg|CgƂmaingp邱Ƃ҂Ă邽߁A
main֐Ȃ΃NG[ɂȂꍇB
C++Ή^Cł́AN邱Ƃ݂̂ړIƂmain֐
`B


UDSH3ɂ

݁AC++oCfBOT|[gs́AMS7727CP01(SH3)
łB
܂AGNUJ̃^[QbgƂāAsh-hitachi-elfgpĂB

6.3 GNUJɊւ

GNUJSʂɊւvfƂāAȉ̂̂B

(1) JXNvg̑Ή

C++pꍇ̃JXNvgɂ́A.ctor.dtorAȂ킿O
[oȃRXgN^fXgN^̃|C^e[u`邽
̃ZNV`KvłB
܂A.eh_frame.gcc_except_tableȂǂ̗Op̃ZNV`
KvɂȂB

6.2 ELF`Ɋ֘A

SHɌ炸AELF`ɈˑvfƂāALȇΉKvłB

(1) crti.o, crtbegin.o, crtend.o, crtn.õN

O[oȃRXgN^уfXgN^̌ďoAO֘A
ɕKvȂ߁Ãt@C𐳂ŃNKvB
N̏́A

start.o crti.o crtbegin.o [UvO libkernel.a libstdc++.a
libm.a libc.a libgcc.a crtend.o crtn.o

łB
̎wɂ́A^[Qbgˑconfig/sh3/Makefile.configɂāA

START_OBJS = \
	start.o \
	$(shell $(CC) $(COPTS) -print-file-name=crti.o | sed -e 's/\\/\//g') \
	$(shell $(CC) $(COPTS) -print-file-name=crtbegin.o | sed -e 's/\\/\//g')
END_OBJS   = \
	$(shell $(CC) $(COPTS) -print-file-name=crtend.o | sed -e 's/\\/\//g') \
	$(shell $(CC) $(COPTS) -print-file-name=crtn.o | sed -e 's/\\/\//g')

̂悤ɒ`ĂB
ȂA'\''/'ɒuĂ̂́AMinGW + MSys̊Ŏgpł
悤ɂ邽߂łB
܂AmakeɌcrti.oȂǂ̃RpC݂悤Ƃ邱Ƃ
ړIŁASTART_OBJSEND_OBJSistart.ojmake[
ĂB

(2) JXNvg̑Ή

.init.finiELF`L̃ZNV`KvłB

6.3 SHɓL̂

^[QbgSH̏ꍇɓLȗvfƂāAȉ̂̂B

(1) _init֐_fini֐

GCC̑̃^[Qbgł́AELF`̏ꍇA֐яI֐
ƂāA_init֐_fini֐gpBASH̏ꍇɂinit֐
fini֐i擪̉ȂjgpĂB̂߁Atool_defs.h
ɂāAinitfiniɂꂼ}NuĂB


VDAvP[V쐬ɂqg

7.1 ÓIȃIuWFNg

ÓIȃIuWFNg͕ʂɒ`邱Ƃł邪Aȉ̓_ɒӂ
KvB

(1) J[l񓮍

O[oȃRXgN^fXgN^́AJ[l񓮍ԂŌďo
BāÅ֐ł́AITROÑT[rXR[ďo
Ƃ͏oȂBBďoƂoT[rXR[́AFI4J[l
̓Ǝgłvsns_iniłB

NXO[oł[Jłg悤ɂɂ́AKvɉāA
vsns_iniŃJ[l̓Ԃ𔻕ʂAԂɉď𕪂Kv
B

(2) ֐̐ÓIIuWFNg

֐Œ`ꂽÓIIuWFNg̃RXgN^́AKN
Ɍďoł͂ȂAspXŏɂ̃IuWFNg̒`ӏ
|_ŌďoB
āARXgN^J[lԂŌďo邩A񓮍
ԂŌďo邩́ÃIuWFNg`ꂽ֐ŏɌďo
^C~OɈˑB

ʓIɁA̖ɂDouble-Checked LockingƌĂ΂@
pB

class foo
{
  // NX`
};

void func()
{
  static foo* ptr = 0;
  if (ptr == 0)
  {
    wai_sem(SEMID);
    if (ptr == 0)
    {
      static foo x;
      ptr = &x;
    }
    sig_sem(SEMID);
  }
  // ֐{̂̏
}

(3) VXeO̎gp

fXgN^ł́AVXeO𐧌Ȃgp邱Ƃł邪AO
[oȃRXgN^ł́AftHgł̓VXeOgp邱
łȂB

7.2 newZqdeleteZq

(1) rɂ

newZqdeleteZq́Axシ邽߁At[XgA
tistd::malloc֐pĎj̓fBXpb`֎~Ԃōs
ĂB
AvP[V̗vɂāA̕@ŔrsKv
ɂ́Asystask/cxxrt.c̒__malloc_lock֐__malloc_unlock֐
JX^}CY΂悢B

(2) gpɊւ鐧

^XNReLXg^XNO[`ŌďoƂ͂łȂB
J[l񓮍ԁivsns_ini֐TRUEԂԁjł́Aʏʂgp
邱ƂłB

(3) I[o[[hɂ

O[onewZqdeleteZq́As͂܂܂ł邪A
Ԍ͌čƂ͂ȂB܂ÃNX̍Œᐶɂ
Ă]ɂ߁Aȓۏ؂KvƂNXɊւẮAnew
ZqdeleteZqI[o[[h邱Ƃ𐄏B

I[o[[hɍۂẮAŒ蒷v[p邱ƂoB
Ⴆ΁Aȉ̂悤ɃNX`邱ƂoB

#include <t_services.h>
#include <cstddef>
#include "kernel_id.h"

class foo
{
  static ID mpfid_;
public:
  static void* operator new(std::size_t size) throw()
  {
    VP ptr;
    get_mpf(mpfid_, &ptr);
    assert(ptr != 0);
    return ptr;
  }
  static void operator delete(void* ptr) throw()
  {
    rel_mpf(mpfid_, ptr);
  }
};

static ID foo::mpfid_ = FOO_MPF;	// Œ蒷v[IDԍ

܂AnewZq̔zu\gp邱ƂŁA^CAEgw蓙̋@\
ǉ邱Ƃ\łB

static void* operator new(std::size_t size, TMO tmout);
static void operator delete(void* ptr, TMO) throw();

ȂAnewZqI[o[[hꍇAKΉdeleteZq
킹ăI[o[[hȂ΂ȂȂB
L̏ꍇAdeleteZqTMO^̈gp邱Ƃ͂ȂAnew
NX̃RXgN^OX[ꂽꍇinewZq̂
ł͂ȂjAΉdeleteZqKvɂȂB

7.3 O

(1) O̓

GCCł́Aconfigure--enable-sjlj-exceptionsw肵ꍇAO
邽߂setjmplongjmp֐gpĂB^[Qbg
Ă͑̎@I邱Ƃł邪AmF͍sĂȂB

OT^̃IuWFNgthrowꍇAIɂ͈ȉ̏ŏ
sB

	1) std::malloc֐ɂAT^̃IuWFNgi[\ȃu
	   bNtB
	   tɎsꍇAً}p̐ÓIȃobt@ĂB

	2) T^̃Rs[RXgN^ďoAthrowꂽIuWFNg
	   Rs[A1)ŊtubNpĐB
	   Rs[RXgN^ŗOthrowꂽꍇstd::terminate
	   ֐ďoꂽAstd::abort֐ɂُIB

	3) Ot[Acatch܂ł̌oHɑ݂郍[
	   JȃIuWFNg̃fXgN^ďoB
	   ŁAfXgN^ŗOthrowꂽꍇstd::terminate
	   ֐ďoꂽAstd::abort֐ɂُIB

	4) T^i܂͂̊NXjɑΉcatchubN
	   ꍇ́ÃubNɍL敪򂷂BcatchubÑp[^
	   ln̏ꍇARs[RXgN^ɂĐV[JȃI
	   uWFNgB
	   ΉcatchubNȂꍇln̍ۂɗO
	   throwꂽꍇstd::terminate֐ďoꂽAstd::abort
	   ֐ɂُIB

	5) catchubN̏sB

	6) L2)ŐꂽIuWFNg̃fXgN^ďoB

(2) ^XNċN̏

^XNŗOgpAext_tskŃ^XNx~ԂɂA
act_tskōċN\^XN_toppers_cxxrt_reset_specific
֐pďsKvB

extern "C" void _toppers_cxxrt_reset_specific() throw();

extern "C"
void task(VP_INT exinf)
{
  _toppers_cxxrt_reset_specific();
  try
  {
    // ^XN̏
  }
  catch (...)
  {
  }
}

O𒼐ړIɂԐړIɂgpꍇΏۂƂȂB
Oŵ֐[U`ꍇAnewZqAdynamic_castZ
qAtypeidZqgpꍇAԐړIɗOgp邽߁A
ӂKvłB
C++pꍇɂ́A^XN̐擪ł͕K_toppers_cxxrt_reset_specific
֐AʂȎȂďoƂB

(3) ̌

configure--enable-sjlj-exceptionsw肵ꍇAOthrow
ꍇłA኱̎s̒ቺNB܂AԌቺ
ꍇB
łPɂ́Aȉ̕@LłB

	1) ł邾CC֐gpBOɊւI[o[w
	   bh̑́A֐̌ďoɕtĔB

	2) ėO𔭐Ȃ֐ɂ́AKOwthrow()tB
	   ɁACŎꂽ֐́AKthrow()t邱ƁB

	3) O邩Ȃ֐ɂ͗OwtȂB
	   OwtƃtB^OÖٓIɓWJB

	4) \ȌfXgN^`ȂB
	   ֐ŃfXgN^[JȃIuWFNggȂ΁A
	   Othrow邩Ȃ֐ĂłAI[o[wbhɂ
	   ȂꍇB

	5) ꎞIuWFNg̐
	   ꎞIuWFNg͂ꎩ̂I[o[wbhł邾łȂA
	   RXgN^ŗO@A܂fXgN^
	   яo@𑝂₷B

7.4 CƂ̍

C++CŒ`֐ďoꍇAextern "C"ɂ"C"P[W
ł邱Ƃ𖾎IɎw肵Ȃ΂ȂȂB

extern "C" int foo();

extern "C" {
  void hoge();
  void bar();
}

܂ACꂩďo\̂֐C++Œ`ꍇextern "C"
֐`ɕtKvB

CC++ł͌݊̂Ȃ^邽߁Agp֐ɁA
^gpׂł͂ȂBႦ΁AboolNX^ȂǂłB
ɁAkernel_cfg.cCł邽߁A^XN̊gɃNX̃|C
^w肷邱Ƃ͂łȂB

C֐C++֐̌ďóAƂčsׂł͂ȂBŗO
ꍇA삪ۏ؂łȂ̗̂RłB
ʏ̌ďȏAR[obN֐pꍇOł͂ȂB

C++֐C֐ďoꍇAC֐ɂ͗Owthrow()tׂ
B邱Ƃő啝Ɍ̌オ҂łB

ȏ
