powerpc64 head -r345044: WITH_LLVM_LIBUNWIND= based buildworld leads to thrown C++ exceptions segmentation faulting

Mark Millard via freebsd-ppc <[email protected]>
Newsgroups gmane.os.freebsd.devel.ppc,gmane.os.freebsd.devel.toolchain
Message-ID <[email protected]>
[I sometimes experiment with building powerpc64 (and 32-bit) via
more modern toolchains, here a amd64->powerpc64 cross build via
system-clang (so 8.0.0).]

buildworld with WITH_LLVM_LIBUNWIND= completes for powerpc64
(but not 32-bit powerpc). However, for a system installed
from such for pwoerpc64, the following program (for example)
gets a segmentation fault:

# more ~/c_tests/exception_test.cpp 
#include <exception>

int main(void)
{
    try { throw std::exception(); }
    catch (std::exception& e) {}
    return 0;
}

(Note: the same a.out works under a WITHOUT_LLVM_LIBUNWIND=
environment, that was patched for DW_CFA_remember_state and
DW_CFA_restore_state handling, with the system built via
devel/powerpc64-xtoolchain-gcc related materials. So the
failure is on the system library does of things for the
WITH_LLVM_LIBUNWIND= context.)

Unfortunately:

A) devel/gdb makes extensive use of thrown C++ exceptions
   and so does not work for a powerpc64 system based on
   WITH_LLVM_LIBUNWIND= .

B) The world built is not using dwarf-2 so /usr/libexec/gdb
   is not handy/useful.

C) CFLAGS+=-gdwarf-2 leads to system-clang having an Abort
   trap during buildworld's compile of gcrt1.s . (Reference
   material later, below.)

D) lldb crashes in llvm_unreachable in
   lldb::RegisterContextSP FreeBSDThread::GetRegisterContext()
   on powerpc64. (Reference material later, below.)

So I've not managed to check the backtrace for the
segmentation fault in the short example.



For reference . . .


For (C) ( -gdwarf-2 use ):

QUOTES
(gdb) bt
#0  thr_kill () at thr_kill.S:3
#1  0x000000000474afcf in __raise (s=6) at /usr/src/lib/libc/gen/raise.c:52
#2  0x00000000046cd386 in abort () at /usr/src/lib/libc/stdlib/abort.c:79
#3  0x00000000047394ba in __assert (func=<optimized out>, file=<optimized out>, line=<optimized out>, failedexpr=<optimized out>) at /usr/src/lib/libc/gen/assert.c:51
#4  0x000000000429aa9f in resetRootFile () at /usr/src/contrib/llvm/include/llvm/MC/MCDwarf.h:316
#5  parseDirectiveFile () at /usr/src/contrib/llvm/lib/MC/MCParser/AsmParser.cpp:3377
#6  parseStatement () at /usr/src/contrib/llvm/lib/MC/MCParser/AsmParser.cpp:2023
#7  0x000000000428cc12 in Run () at /usr/src/contrib/llvm/lib/MC/MCParser/AsmParser.cpp:884
#8  0x000000000163c649 in ExecuteAssembler () at /usr/src/contrib/llvm/tools/clang/tools/driver/cc1as_main.cpp:503
#9  cc1as_main () at /usr/src/contrib/llvm/tools/clang/tools/driver/cc1as_main.cpp:589
#10 0x0000000001643d10 in ExecuteCC1Tool () at /usr/src/contrib/llvm/tools/clang/tools/driver/driver.cpp:312
#11 main () at /usr/src/contrib/llvm/tools/clang/tools/driver/driver.cpp:382

  void resetRootFile() {
    assert(Header.MCDwarfFiles.empty());
    Header.RootFile.Name.clear();
    Header.resetMD5Usage();
    Header.HasSource = false;
  }

--- lib/csu__L ---
cc: error: unable to execute command: Abort trap (core dumped)
cc: error: clang integrated assembler command failed due to signal (use -v to see invocation)
FreeBSD clang version 8.0.0 (branches/release_80 355677) (based on LLVM 8.0.0)
Target: powerpc64-unknown-freebsd13.0
Thread model: posix
InstalledDir: /usr/bin
cc: note: diagnostic msg: PLEASE submit a bug report to https://bugs.freebsd.org/submit/ and include the crash backtrace, preprocessed source, and associated run script.
cc: note: diagnostic msg: Error generating preprocessed source(s) - no preprocessable inputs.
*** [gcrt1.o] Error code 254

make[5]: stopped in /usr/src/lib/csu/powerpc64
.ERROR_TARGET='gcrt1.o'
.ERROR_META_FILE='/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64/lib/csu/powerpc64/gcrt1.o.meta'
.MAKE.LEVEL='5'
MAKEFILE=''
.MAKE.MODE='meta missing-filemon=yes missing-meta=yes silent=yes verbose'
_ERROR_CMD='cc -gdwarf-2 -target powerpc64-unknown-freebsd13.0 --sysroot=/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64/tmp -B/usr/local/powerpc64-unknown-freebsd13.0/bin/ -O2 -pipe -I/usr/src/lib/csu/common -I/usr/src/lib/libc/include -mlongcall -DCRT_IRELOC_SUPPRESS -std=gnu99 -Wsystem-headers -Wall -Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls -Wold-style-definition -Wno-pointer-sign -Wthread-safety -Wno-empty-body -Wno-string-plus-int -Wno-unused-const-variable -Qunused-arguments   -c -o gcrt1.o gcrt1.s;'
.CURDIR='/usr/src/lib/csu/powerpc64'
.MAKE='make'
.OBJDIR='/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64/lib/csu/powerpc64'
.TARGETS='all'
DESTDIR='/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64/tmp'
LD_LIBRARY_PATH=''
MACHINE='powerpc'
MACHINE_ARCH='powerpc64'
MAKEOBJDIRPREFIX=''
MAKESYSPATH='/usr/src/share/mk'
MAKE_VERSION='20181221'
PATH='/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64/tmp/usr/sbin:/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64/tmp/usr/bin:/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64/tmp/legacy/usr/sbin:/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64/tmp/legacy/usr/bin:/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64/tmp/legacy/bin::/sbin:/bin:/usr/sbin:/usr/bin'
SRCTOP='/usr/src'
OBJTOP='/usr/obj/powerpc64vtsc_clang_altbinutils/powerpc.powerpc64/usr/src/powerpc.powerpc64'
.MAKE.MAKEFILES='/usr/src/share/mk/sys.mk /usr/src/share/mk/local.sys.env.mk /usr/src/share/mk/src.sys.env.mk /root/src.configs/src.conf.powerpc64-clang_altbinutils-bootstrap.amd64-host /usr/src/share/mk/bsd.mkopt.mk /usr/src/share/mk/src.sys.obj.mk /usr/src/share/mk/auto.obj.mk /usr/src/share/mk/bsd.suffixes.mk /root/src.configs/make.conf /usr/src/share/mk/local.sys.mk /usr/src/share/mk/src.sys.mk /dev/null /usr/src/lib/csu/powerpc64/Makefile /usr/src/share/mk/bsd.lib.mk /usr/src/share/mk/bsd.init.mk /usr/src/share/mk/bsd.opts.mk /usr/src/share/mk/bsd.cpu.mk /usr/src/share/mk/local.init.mk /usr/src/share/mk/src.init.mk /usr/src/lib/csu/powerpc64/../Makefile.inc /usr/src/share/mk/src.opts.mk /usr/src/share/mk/bsd.own.mk /usr/src/share/mk/bsd.compiler.mk /usr/src/share/mk/bsd.linker.mk /usr
 /src/lib/csu/powerpc64/../../Makefile.inc /usr/src/share/mk/bsd.libnames.mk /usr/src/share/mk/src.libnames.mk /usr/src/share/mk/bsd.symver.mk /usr/src/share/mk/bsd.nls.mk /usr/src/share/mk/bsd.confs
 .mk /usr/src/share/mk/bsd.files.mk /usr/src/share/mk/bsd.dirs.mk /usr/src/share/mk/bsd.incs.mk /usr/src/share/mk/bsd.links.mk /usr/src/share/mk/bsd.dep.mk /usr/src/share/mk/bsd.clang-analyze.mk /usr/src/share/mk/bsd.obj.mk /usr/src/share/mk/bsd.subdir.mk /usr/src/share/mk/bsd.sys.mk'
.PATH='. /usr/src/lib/csu/powerpc64 /usr/src/lib/csu/common'
1 error
END QUOTES


For (D) (lldb):

QUOTES
CPU not supported
UNREACHABLE executed at /usr/src/contrib/llvm/tools/lldb/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp:192!
Abort trap (core dumped)

(gdb) bt
#0  0x0000000813715208 in .__sys_thr_kill () at thr_kill.S:3
#1  0x00000008137147cc in __raise (s=<optimized out>) at /usr/src/lib/libc/gen/raise.c:52
#2  0x000000081366b5d8 in abort () at /usr/src/lib/libc/stdlib/abort.c:79
#3  0x0000000011df6fb8 in llvm::llvm_unreachable_internal () at /usr/src/contrib/llvm/lib/Support/ErrorHandling.cpp:222
#4  0x00000000103aaaf8 in FreeBSDThread::GetRegisterContext () at /usr/src/contrib/llvm/tools/lldb/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp:192
#5  0x00000000105807d4 in lldb_private::Thread::SetupForResume () at /usr/src/contrib/llvm/tools/lldb/source/Target/Thread.cpp:613
#6  0x0000000010571bc8 in lldb_private::ThreadList::WillResume () at /usr/src/contrib/llvm/tools/lldb/source/Target/ThreadList.cpp:541
#7  0x00000000105da23c in lldb_private::Process::PrivateResume () at /usr/src/contrib/llvm/tools/lldb/source/Target/Process.cpp:3281
#8  0x00000000105a00c8 in lldb_private::Target::Launch () at /usr/src/contrib/llvm/tools/lldb/source/Target/Target.cpp:2922
#9  0x000000001073f550 in CommandObjectProcessLaunch::DoExecute () at /usr/src/contrib/llvm/tools/lldb/source/Commands/CommandObjectProcess.cpp:221
#10 0x00000000106c36c4 in lldb_private::CommandObjectParsed::Execute () at /usr/src/contrib/llvm/tools/lldb/source/Interpreter/CommandObject.cpp:975
#11 0x00000000106d8b44 in lldb_private::CommandInterpreter::HandleCommand () at /usr/src/contrib/llvm/tools/lldb/source/Interpreter/CommandInterpreter.cpp:1761
#12 0x00000000106da0a0 in lldb_private::CommandInterpreter::IOHandlerInputComplete () at /usr/src/contrib/llvm/tools/lldb/source/Interpreter/CommandInterpreter.cpp:2801
#13 0x00000000107c0a08 in lldb_private::IOHandlerEditline::Run () at /usr/src/contrib/llvm/tools/lldb/source/Core/IOHandler.cpp:558
#14 0x0000000010346e5c in lldb_private::Debugger::ExecuteIOHandlers () at /usr/src/contrib/llvm/tools/lldb/source/Core/Debugger.cpp:988
#15 0x00000000106c8ddc in lldb_private::CommandInterpreter::RunCommandInterpreter () at /usr/src/contrib/llvm/tools/lldb/source/Interpreter/CommandInterpreter.cpp:3003
#16 0x000000001034feb4 in lldb::SBDebugger::RunCommandInterpreter () at /usr/src/contrib/llvm/tools/lldb/source/API/SBDebugger.cpp:935
#17 0x00000000101de878 in Driver::MainLoop () at /usr/src/contrib/llvm/tools/lldb/tools/driver/Driver.cpp:756
#18 0x00000000101a0088 in main () at /usr/src/contrib/llvm/tools/lldb/tools/driver/Driver.cpp:936

lldb::RegisterContextSP FreeBSDThread::GetRegisterContext() {
  if (!m_reg_context_sp) {
    m_posix_thread = nullptr;

    RegisterInfoInterface *reg_interface = nullptr;
    const ArchSpec &target_arch = GetProcess()->GetTarget().GetArchitecture();

    switch (target_arch.GetMachine()) {
    case llvm::Triple::aarch64:
      reg_interface = new RegisterInfoPOSIX_arm64(target_arch);
      break;
    case llvm::Triple::arm:
      reg_interface = new RegisterInfoPOSIX_arm(target_arch);
      break;
    case llvm::Triple::ppc:
#ifndef __powerpc64__
      reg_interface = new RegisterContextFreeBSD_powerpc32(target_arch);
      break;
#endif
    case llvm::Triple::ppc64:
      reg_interface = new RegisterContextFreeBSD_powerpc64(target_arch);
      break;
    case llvm::Triple::mips64:
      reg_interface = new RegisterContextFreeBSD_mips64(target_arch);
      break;
    case llvm::Triple::x86:
      reg_interface = new RegisterContextFreeBSD_i386(target_arch);
      break;
    case llvm::Triple::x86_64:
      reg_interface = new RegisterContextFreeBSD_x86_64(target_arch);
      break;
    default:
      llvm_unreachable("CPU not supported");
    }
END QUOTES.




===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ppc
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.