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

        iRelease 1.4.1 ΉCŏIXV: 16-Sep-2004j

------------------------------------------------------------------------
 TOPPERS/JSP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Just Standard Profile 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/JSPJ[ĺA{CAPI񋟂̂łÂ܂܂ł
C++pAvP[VJsŎxႪB
C++oCfBÓATOPPERS/JSPJ[l񋟂T[rXR[C++
ďoƂ\ɂATOPPERS/JSPJ[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)
AKI-H8/3069FłB̎sŎgpɂ́A^[Qbgˑ
Makefile.configуJXNvg̏CKvƂȂB
܂ALinux̃V~[Vł͎gp邱ƂłȂB

1.3 C++oCfBŐ@\̊Tv

WC++̋@\̂AsɈˑ镔ɂāATOPPERS/JSPJ[
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/JSPJ[lC++oCfBOgpɂ́ARtBM
[Vt@Ci.cfgjAjsp/systask/cxxrt.cfgCN[h
ł悢BiÓIAPIINCLUDEł͂ȂAvvZbTw߂#include
gp邱Ɓj

TOPPERS/JSPJ[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/JSPJ[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/JSPJ[l

3.1 BOOL^

WC++ɂ́A_^łbool^ƁA_lłtruefalse
BATOPPERS/JSPJ[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ꍇ̓
`ł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/JSPJ[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-COREG++A܂GCCKvɂȂB
܂ANEWLIB͕K{łB

    GNUJ
       BINUTILSiAZuCJȂǁj
       GCCiC/C++RpCj
       GDBifobKj
    NEWLIBiWCCuj
    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ƂȂBiSHł̂݁BGCC 3.3.xȍ~ł͕svj

    % 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/JSPJ[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-host

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/JSPJ[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

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
q[v̈ƋÑX^bN̈悪AĂȂꍇAsys_config.h
HEAP_TOP}Nq[v̏I[AhXɒ`KvB

{ł΁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();

JSPJ[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


UD^[Qbgˑ̎

݁AC++oCfBOT|[gs́AMS7727CP01(SH3)
AKI-H8/3069FłB
܂AGNUJ̃^[QbgƂāASHpɂsh-hitachi-elfAH8pɂ
h8300-hmsgpĂB

6.1 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[́AJSPJ[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̏

JSP 1.4ł͍ċN̏Ƃ_toppers_cxxrt_reset_specific
ĂяoKvAJSP 1.4.1ł_toppers_cxxrt_reset_specific
֐̌Ăяo͕KvƂȂB
̑A^XÑGg֐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

ȏ

