From owner-freebsd-current@freebsd.org Sat Oct 7 09:54:38 2017 Return-Path: Delivered-To: freebsd-current@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B8993E340C3 for ; Sat, 7 Oct 2017 09:54:38 +0000 (UTC) (envelope-from markmi@dsl-only.net) Received: from asp.reflexion.net (outbound-mail-210-18.reflexion.net [208.70.210.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 62C5F70017 for ; Sat, 7 Oct 2017 09:54:37 +0000 (UTC) (envelope-from markmi@dsl-only.net) Received: (qmail 12347 invoked from network); 7 Oct 2017 09:54:36 -0000 Received: from unknown (HELO mail-cs-01.app.dca.reflexion.local) (10.81.19.1) by 0 (rfx-qmail) with SMTP; 7 Oct 2017 09:54:36 -0000 Received: by mail-cs-01.app.dca.reflexion.local (Reflexion email security v8.40.3) with SMTP; Sat, 07 Oct 2017 05:54:36 -0400 (EDT) Received: (qmail 17895 invoked from network); 7 Oct 2017 09:54:36 -0000 Received: from unknown (HELO iron2.pdx.net) (69.64.224.71) by 0 (rfx-qmail) with (AES256-SHA encrypted) SMTP; 7 Oct 2017 09:54:36 -0000 Received: from [192.168.1.26] (c-76-115-7-162.hsd1.or.comcast.net [76.115.7.162]) by iron2.pdx.net (Postfix) with ESMTPSA id 88223EC918F; Sat, 7 Oct 2017 02:54:35 -0700 (PDT) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 10.3 \(3273\)) Subject: Re: C++ in jemalloc From: Mark Millard In-Reply-To: Date: Sat, 7 Oct 2017 02:54:35 -0700 Cc: Justin Hibbits , Warner Losh , FreeBSD Current Content-Transfer-Encoding: quoted-printable Message-Id: References: <528ED3CD-8A4B-4F00-8728-7D231DB0811A@dsl-only.net> <20171007064249.GA73770@vlakno.cz> To: Roman Divacky X-Mailer: Apple Mail (2.3273) X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 07 Oct 2017 09:54:38 -0000 [The last part of my note has a dumb mistake, not that it messes up the other evidence. I should have dwarfdump'd not a.out but the code in the libraries, such as __cxa_begin_catch in /lib/libcxxrt.so.1 . I made the same mistake initially back when Roman and I were dealing with this long ago. Correcting it again. . .] On 2017-Oct-7, at 2:18 AM, Mark Millard wrote: > [I'm separately listing backtrace information and related > information from one of core dumps and going back through > the details to see if they seem to be as they were back > then. Read only if you care. It does look the same as I > found back then if I remember right. I reach the same > conclusion I reached back then anyway. I give evidence > in the below.] >=20 > On 2017-Oct-7, at 1:10 AM, Mark Millard = wrote: >=20 >> [I'm adding examples with output from clang -v since it explicitly = shows >> the path used for ld and such.] >>=20 >> On 2017-Oct-7, at 12:58 AM, Mark Millard = wrote: >>=20 >>> On 2017-Oct-6, at 11:42 PM, Roman Divacky = wrote: >>>=20 >>>> Just to clarify my not agreeing with Mark regarding EH on ppc64. >>>>=20 >>>> Last time I tried to fix ppc64 exceptions handling as generated by = clang >>>> it turned out that simply using gnu ld from ports fixes the issue. >>>>=20 >>>> For details see: >>>> = https://lists.freebsd.org/pipermail/freebsd-toolchain/2017-May/002961.html= >>>=20 >>> Unfortunately my experiments failed to confirm this. Repeating >>> them now under head -r324071 and ports -r450478 : >>>=20 >>> # more exception_test.cpp=20 >>> #include >>>=20 >>> int main(void) >>> { >>> try { throw std::exception(); } >>> catch (std::exception& e) {} >>> return 0; >>> } >>>=20 >>> # clang++ -B /usr/local/powerpc64-freebsd/bin -std=3Dc++14 -g -O2 = exception_test.cpp >>>=20 >>> # ./a.out >>> Segmentation fault (core dumped) >>>=20 >>> # clang++ -B /usr/local/powerpc64-freebsd/bin -std=3Dc++11 -g = exception_test.cpp >>>=20 >>> # ./a.out >>> Segmentation fault (core dumped) >>=20 >> # clang++ -v -B /usr/local/powerpc64-freebsd/bin -std=3Dc++11 -g = exception_test.cpp >> FreeBSD clang version 5.0.0 (tags/RELEASE_500/final 312559) (based on = LLVM 5.0.0svn) >> Target: powerpc64-unknown-freebsd12.0 >> Thread model: posix >> InstalledDir: /usr/bin >> "/usr/bin/clang++" -cc1 -triple powerpc64-unknown-freebsd12.0 = -emit-obj -mrelax-all -disable-free -main-file-name exception_test.cpp = -mrelocation-model pic -pic-level 2 -mthread-model posix = -mdisable-fp-elim -masm-verbose -mconstructor-aliases -target-cpu ppc64 = -mfloat-abi hard -v -dwarf-column-info -debug-info-kind=3Dstandalone = -dwarf-version=3D2 -debugger-tuning=3Dgdb -resource-dir = /usr/lib/clang/5.0.0 -internal-isystem /usr/include/c++/v1 -std=3Dc++11 = -fdeprecated-macro -fdebug-compilation-dir /root/c_tests -ferror-limit = 19 -fmessage-length 200 -fno-signed-char -fobjc-runtime=3Dgnustep = -fcxx-exceptions -fexceptions -fdiagnostics-show-option = -fcolor-diagnostics -o /tmp/exception_test-ba79a4.o -x c++ = exception_test.cpp >> clang -cc1 version 5.0.0 based upon LLVM 5.0.0svn default target = powerpc64-unknown-freebsd12.0 >> #include "..." search starts here: >> #include <...> search starts here: >> /usr/include/c++/v1 >> /usr/lib/clang/5.0.0/include >> /usr/include >> End of search list. >> "/usr/local/powerpc64-freebsd/bin/ld" --eh-frame-hdr -dynamic-linker = /libexec/ld-elf.so.1 --enable-new-dtags -o a.out /usr/lib/crt1.o = /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib = /tmp/exception_test-ba79a4.o -lc++ -lm -lgcc --as-needed -lgcc_s = --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed = /usr/lib/crtend.o /usr/lib/crtn.o >>=20 >> # ./a.out >> Segmentation fault (core dumped) >>=20 >>=20 >>> # ls -lt /usr/local/powerpc64-freebsd/bin >>> total 56704 >>> lrwxr-xr-x 1 root wheel 32 Jul 2 19:27 size -> = ../../bin/powerpc64-freebsd-size >>> -r-xr-xr-x 4 root wheel 7072791 Jul 2 19:27 ld >>> -r-xr-xr-x 4 root wheel 7072791 Jul 2 19:27 ld.bfd >>> -r-xr-xr-x 2 root wheel 6881822 Jul 2 19:27 as >>> -r-xr-xr-x 2 root wheel 6128889 Jul 2 19:27 strip >>> -r-xr-xr-x 2 root wheel 5253417 Jul 2 19:27 nm >>> -r-xr-xr-x 2 root wheel 1284139 Jul 2 19:27 readelf >>> -r-xr-xr-x 2 root wheel 6128882 Jul 2 19:27 objcopy >>> -r-xr-xr-x 2 root wheel 5384166 Jul 2 19:27 ranlib >>> -r-xr-xr-x 2 root wheel 5384159 Jul 2 19:27 ar >>> -r-xr-xr-x 2 root wheel 6914775 Jul 2 19:27 objdump >>>=20 >>> # clang++ -B /usr/local/powerpc64-portbld-freebsd12.0/bin/ = -std=3Dc++14 -g -O2 exception_test.cpp >>>=20 >>> # ./a.out >>> Segmentation fault (core dumped) >>=20 >> # clang++ -v -B /usr/local/powerpc64-portbld-freebsd12.0/bin/ = -std=3Dc++14 -g -O2 exception_test.cpp >> FreeBSD clang version 5.0.0 (tags/RELEASE_500/final 312559) (based on = LLVM 5.0.0svn) >> Target: powerpc64-unknown-freebsd12.0 >> Thread model: posix >> InstalledDir: /usr/bin >> "/usr/bin/clang++" -cc1 -triple powerpc64-unknown-freebsd12.0 = -emit-obj -disable-free -main-file-name exception_test.cpp = -mrelocation-model pic -pic-level 2 -mthread-model posix = -mdisable-fp-elim -masm-verbose -mconstructor-aliases -target-cpu ppc64 = -mfloat-abi hard -v -dwarf-column-info -debug-info-kind=3Dstandalone = -dwarf-version=3D2 -debugger-tuning=3Dgdb -resource-dir = /usr/lib/clang/5.0.0 -internal-isystem /usr/include/c++/v1 -O2 = -std=3Dc++14 -fdeprecated-macro -fdebug-compilation-dir /root/c_tests = -ferror-limit 19 -fmessage-length 200 -fno-signed-char = -fobjc-runtime=3Dgnustep -fcxx-exceptions -fexceptions = -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops = -vectorize-slp -o /tmp/exception_test-3ebf72.o -x c++ exception_test.cpp >> clang -cc1 version 5.0.0 based upon LLVM 5.0.0svn default target = powerpc64-unknown-freebsd12.0 >> #include "..." search starts here: >> #include <...> search starts here: >> /usr/include/c++/v1 >> /usr/lib/clang/5.0.0/include >> /usr/include >> End of search list. >> "/usr/local/powerpc64-portbld-freebsd12.0/bin/ld" --eh-frame-hdr = -dynamic-linker /libexec/ld-elf.so.1 --enable-new-dtags -o a.out = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib = /tmp/exception_test-3ebf72.o -lc++ -lm -lgcc --as-needed -lgcc_s = --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed = /usr/lib/crtend.o /usr/lib/crtn.o >>=20 >> # ./a.out >> Segmentation fault (core dumped) >>=20 >>> # clang++ -B /usr/local/powerpc64-portbld-freebsd12.0/bin/ = -std=3Dc++11 -g exception_test.cpp >>>=20 >>> # ./a.out >>> Segmentation fault (core dumped) >>>=20 >>>=20 >>> # ls -lt /usr/local/powerpc64-portbld-freebsd12.0/bin/ >>> total 363584 >>> -r-xr-xr-x 4 root wheel 59993201 Jul 2 23:44 ld >>> -r-xr-xr-x 4 root wheel 59993201 Jul 2 23:44 ld.bfd >>> -r-xr-xr-x 2 root wheel 29843304 Jul 2 23:44 as >>> -r-xr-xr-x 2 root wheel 29046519 Jul 2 23:44 strip >>> -r-xr-xr-x 2 root wheel 28207257 Jul 2 23:44 nm >>> -r-xr-xr-x 2 root wheel 1178483 Jul 2 23:44 readelf >>> -r-xr-xr-x 1 root wheel 28329180 Jul 2 23:44 dlltool >>> -r-xr-xr-x 2 root wheel 29046512 Jul 2 23:44 objcopy >>> -r-xr-xr-x 2 root wheel 28334599 Jul 2 23:44 ranlib >>> -r-xr-xr-x 2 root wheel 28334592 Jul 2 23:44 ar >>> -r-xr-xr-x 2 root wheel 49540244 Jul 2 23:44 objdump >=20 > [Note: I used /usr/libexec/gdb because /usr/local/bin/gdb > core dumps for this. powerpc64 is an example of the > devel/gdb port currently being worse than the system gdb > in various cases.] >=20 > # /usr/libexec/gdb a.out /var/crash/a.out.12775.core=20 > GNU gdb 6.1.1 [FreeBSD] > Copyright 2004 Free Software Foundation, Inc. > GDB is free software, covered by the GNU General Public License, and = you are > welcome to change it and/or distribute copies of it under certain = conditions. > Type "show copying" to see the conditions. > There is absolutely no warranty for GDB. Type "show warranty" for = details. > This GDB was configured as "powerpc64-marcel-freebsd"... > Core was generated by `./a.out'. > Program terminated with signal 11, Segmentation fault. > Reading symbols from /usr/lib/libc++.so.1...Reading symbols from = /usr/lib/debug//usr/lib/libc++.so.1.debug...done. > done. > . . . > Loaded symbols for /libexec/ld-elf.so.1 > #0 0x0000000050530c20 in _Unwind_SetGR (context=3D, index=3D, val=3D1342447712) at = unwind-dw2-fde.h:162 > 162 { > (gdb) bt > #0 0x0000000050530c20 in _Unwind_SetGR (context=3D, index=3D, val=3D1342447712) at = unwind-dw2-fde.h:162 > #1 0x0000000050190194 in __gxx_personality_v0 (version=3D, actions=3D, exceptionClass=3D, exceptionObject=3D0x50042060,=20 > context=3D0xffffffffffffcc70) at = /usr/src/contrib/libcxxrt/exception.cc:1203 > #2 0x0000000050531a60 in _Unwind_RaiseException_Phase2 = (exc=3D0x50042060, context=3D0xffffffffffffcc70) at unwind.inc:66 > #3 0x0000000050531548 in _Unwind_RaiseException (exc=3D) at unwind.inc:135 > #4 0x000000005018f4f4 in __cxa_throw (thrown_exception=3D, tinfo=3D, dest=3D) at /usr/src/contrib/libcxxrt/exception.cc:774 > #5 0x0000000010000d74 in main () at exception_test.cpp:5 > #6 0x0000000010000ae8 in _start (argc=3D1342447624, argv=3D0x50042060, = env=3D0xffffffffffffcc70, obj=3D, cleanup=3D, ps_strings=3D) > at /usr/src/lib/csu/powerpc64/crt1.c:94 > #7 0x0000000050017b70 in .text () at = /usr/src/libexec/rtld-elf/powerpc64/rtld_start.S:104 >=20 > . . . >=20 > __gxx_personality_v0 was trying to execute: >=20 > _Unwind_SetGR(context, __builtin_eh_return_data_regno(0), > reinterpret_cast(exceptionObject)); >=20 > That was part of the sequence: >=20 > . . . > _Unwind_SetIP(context, reinterpret_cast(action.landing_pad)); > _Unwind_SetGR(context, __builtin_eh_return_data_regno(0), > reinterpret_cast(exceptionObject)); > _Unwind_SetGR(context, __builtin_eh_return_data_regno(1), = selector); >=20 > return _URC_INSTALL_CONTEXT; >=20 >=20 > So it died trying to use the CFA information for one of > the scratch registers, the one used for the "exceptionObject". >=20 > The details are: >=20 > inline void > _Unwind_SetGR (struct _Unwind_Context *context, int index, = _Unwind_Word val) > { > int size; > void *ptr; >=20 > index =3D DWARF_REG_TO_UNWIND_COLUMN (index); > gcc_assert (index < (int) sizeof(dwarf_reg_size_table)); > size =3D dwarf_reg_size_table[index]; >=20 > if (_Unwind_IsExtendedContext (context) && context->by_value[index]) > { > context->reg[index] =3D (void *) (_Unwind_Internal_Ptr) val; > return; > } >=20 > ptr =3D context->reg[index]; >=20 > if (size =3D=3D sizeof(_Unwind_Ptr)) > * (_Unwind_Ptr *) ptr =3D val; > else > { > gcc_assert (size =3D=3D sizeof(_Unwind_Word)); > * (_Unwind_Word *) ptr =3D val; > } > } >=20 > Note: DWARF_REG_TO_UNWIND_COLUMN leaves the index value > unchanged for the value involved. I'll not provide the > evidence here. >=20 > Breakpoint 1, main () at exception_test.cpp:5 > 5 try { throw std::exception(); } > (gdb) br _Unwind_SetGR > Breakpoint 2 at 0x50530bbc > (gdb) c > Continuing. >=20 > Breakpoint 2, _Unwind_SetGR (context=3D0xffffffffffffcc30, index=3D3, = val=3D1342447712) at = /usr/src/gnu/lib/libgcc/../../../contrib/gcc/unwind-dw2.c:207 > 207 index =3D DWARF_REG_TO_UNWIND_COLUMN (index); > Current language: auto; currently minimal > (gdb) bt > #0 _Unwind_SetGR (context=3D0xffffffffffffcc30, index=3D3, = val=3D1342447712) at = /usr/src/gnu/lib/libgcc/../../../contrib/gcc/unwind-dw2.c:207 > #1 0x0000000050190194 in __gxx_personality_v0 (version=3D, actions=3D, exceptionClass=3D, exceptionObject=3D0x50042060,=20 > context=3D0xffffffffffffcc30) at = /usr/src/contrib/libcxxrt/exception.cc:1203 > #2 0x0000000050531a60 in _Unwind_RaiseException_Phase2 = (exc=3D0x50042060, context=3D0xffffffffffffcc30) at unwind.inc:66 > #3 0x0000000050531548 in _Unwind_RaiseException (exc=3D) at unwind.inc:135 > #4 0x000000005018f4f4 in __cxa_throw (thrown_exception=3D, tinfo=3D, dest=3D) at /usr/src/contrib/libcxxrt/exception.cc:774 > #5 0x0000000010000d74 in main () at exception_test.cpp:5 > #6 0x0000000010000ae8 in _start (argc=3D1342447624, argv=3D0x50042060, = env=3D0xffffffffffffcc30, obj=3D, cleanup=3D, ps_strings=3D) > at /usr/src/lib/csu/powerpc64/crt1.c:94 > #7 0x0000000050017b70 in .text () at = /usr/src/libexec/rtld-elf/powerpc64/rtld_start.S:104 > (gdb) print *context > $2 =3D {reg =3D 0xffffffffffffcc30, cfa =3D 0xffffffffffffd990, ra =3D = 0x10000d78, lsda =3D 0x10000f74, bases =3D {tbase =3D 0x0, dbase =3D = 0x0, func =3D 0x10000d30}, flags =3D 4611686018427387904, version =3D 0,=20= > args_size =3D 0, by_value =3D 0xffffffffffffd108 ""} > (gdb) print dwarf_reg_size_table[3] > $3 =3D 8 '\b' > (gdb) print context->reg[3] > $4 =3D (void *) 0x0 >=20 > And there is the problem: lack of the value > that is supposed to be available there: NULL > instead. >=20 > This traces back to. . . . . . (removed mistake) . . . Quoting an old note to Roman: The landing pad area includes the __cxa_being_catch and __cxa_end_catch and the involved code from /lib/libcxxrt.so.1 should have the scratch-register CFI entries, not the above main code. So there was no point to my listing the CFI information for main. End Quote. The below points out where there should have been CFI information for the scratch registers, including the failing r3 use. (Below is essentially my self- correction text that I sent to Roman long ago.) # ldd a.out a.out: libc++.so.1 =3D> /usr/lib/libc++.so.1 (0x5004e000) libcxxrt.so.1 =3D> /lib/libcxxrt.so.1 (0x5017b000) libm.so.5 =3D> /lib/libm.so.5 (0x501a2000) libc.so.7 =3D> /lib/libc.so.7 (0x501da000) libgcc_s.so.1 =3D> /lib/libgcc_s.so.1 (0x5052c000) The used scratch registers (of r3, r4, r5, r6) should show up in: # dwarfdump -v -v -F /lib/libcxxrt.so.1 | egrep -i "\" # but do not. In __cxa_begin_catch below note the code setting up r3-r5 before the branch to __cxa_begin_catch+164 and that __cxa_begin_catch+164 on is exit code that leaves these scratch register alone. (The path skipping __cxa_begin_catch+144 is similar for the issue.) __cxa_being_catch's CFI information should list the r3, r4, and r5 scratch register usage but does not. (Powerpc 32-bit has the same issue for the same registers for its __cxa_begin_catch .) (gdb) Dump of assembler code for function __cxa_begin_catch: 0x000000005018ecc4 <__cxa_begin_catch+0>: mflr r0 0x000000005018ecc8 <__cxa_begin_catch+4>: std r0,16(r1) 0x000000005018eccc <__cxa_begin_catch+8>: stdu r1,-144(r1) 0x000000005018ecd0 <__cxa_begin_catch+12>: std r29,120(r1) 0x000000005018ecd4 <__cxa_begin_catch+16>: std r30,128(r1) 0x000000005018ecd8 <__cxa_begin_catch+20>: mr r29,r3 0x000000005018ecdc <__cxa_begin_catch+24>: bl 0x5018e634 = <_ZL11thread_infov> 0x000000005018ece0 <__cxa_begin_catch+28>: mr r30,r3 0x000000005018ece4 <__cxa_begin_catch+32>: lwz r3,48(r30) 0x000000005018ece8 <__cxa_begin_catch+36>: addi r3,r3,-1 0x000000005018ecec <__cxa_begin_catch+40>: stw r3,48(r30) 0x000000005018ecf0 <__cxa_begin_catch+44>: ld r3,0(r29) 0x000000005018ecf4 <__cxa_begin_catch+48>: bl 0x50190210 = <_ZL14isCXXExceptionm> 0x000000005018ecf8 <__cxa_begin_catch+52>: cmpldi r3,0 0x000000005018ecfc <__cxa_begin_catch+56>: beq- 0x5018ed44 = <__cxa_begin_catch+128> 0x000000005018ed00 <__cxa_begin_catch+60>: mr r3,r29 0x000000005018ed04 <__cxa_begin_catch+64>: bl 0x5018f81c = <_ZL20exceptionFromPointerPv> 0x000000005018ed08 <__cxa_begin_catch+68>: lwz r4,48(r3) 0x000000005018ed0c <__cxa_begin_catch+72>: cmplwi r4,0 0x000000005018ed10 <__cxa_begin_catch+76>: bne- 0x5018ed20 = <__cxa_begin_catch+92> 0x000000005018ed14 <__cxa_begin_catch+80>: ld r5,40(r30) 0x000000005018ed18 <__cxa_begin_catch+84>: std r5,40(r3) 0x000000005018ed1c <__cxa_begin_catch+88>: std r3,40(r30) 0x000000005018ed20 <__cxa_begin_catch+92>: srawi r5,r4,31 0x000000005018ed24 <__cxa_begin_catch+96>: li r29,0 0x000000005018ed28 <__cxa_begin_catch+100>: add r4,r4,r5 0x000000005018ed2c <__cxa_begin_catch+104>: xor r4,r4,r5 0x000000005018ed30 <__cxa_begin_catch+108>: addi r4,r4,1 0x000000005018ed34 <__cxa_begin_catch+112>: stw r4,48(r3) 0x000000005018ed38 <__cxa_begin_catch+116>: stw r29,32(r30) 0x000000005018ed3c <__cxa_begin_catch+120>: ld r3,80(r3) 0x000000005018ed40 <__cxa_begin_catch+124>: b 0x5018ed68 = <__cxa_begin_catch+164> 0x000000005018ed44 <__cxa_begin_catch+128>: ld r3,40(r30) 0x000000005018ed48 <__cxa_begin_catch+132>: cmpldi r3,0 0x000000005018ed4c <__cxa_begin_catch+136>: beq- 0x5018ed58 = <__cxa_begin_catch+148> 0x000000005018ed50 <__cxa_begin_catch+140>: bl 0x50184480 = <00000017.plt_call._ZSt9terminatev> 0x000000005018ed54 <__cxa_begin_catch+144>: ld r2,40(r1) 0x000000005018ed58 <__cxa_begin_catch+148>: addi r3,r29,32 0x000000005018ed5c <__cxa_begin_catch+152>: li r4,1 0x000000005018ed60 <__cxa_begin_catch+156>: std r29,40(r30) 0x000000005018ed64 <__cxa_begin_catch+160>: stw r4,32(r30) 0x000000005018ed68 <__cxa_begin_catch+164>: ld r30,128(r1) 0x000000005018ed6c <__cxa_begin_catch+168>: ld r29,120(r1) 0x000000005018ed70 <__cxa_begin_catch+172>: addi r1,r1,144 0x000000005018ed74 <__cxa_begin_catch+176>: ld r0,16(r1) 0x000000005018ed78 <__cxa_begin_catch+180>: mtlr r0 0x000000005018ed7c <__cxa_begin_catch+184>: blr 0x000000005018ed80 <__cxa_begin_catch+188>: .long 0x0 0x000000005018ed84 <__cxa_begin_catch+192>: .long 0x0 0x000000005018ed88 <__cxa_begin_catch+196>: .long 0x0 End of assembler dump. Sorry for the earlier mis-direction. =3D=3D=3D Mark Millard markmi at dsl-only.net