Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

On QEMU, swift immediate mode crashes due to relative pointer relocation failure #60673

Open
sonsongithub opened this issue Aug 20, 2022 · 3 comments · May be fixed by #64720
Open

On QEMU, swift immediate mode crashes due to relative pointer relocation failure #60673

sonsongithub opened this issue Aug 20, 2022 · 3 comments · May be fixed by #64720
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. crash Bug: A crash, i.e., an abnormal termination of software JIT swift 5.6

Comments

@sonsongithub
Copy link

sonsongithub commented Aug 20, 2022

Describe the bug
When I call CommandLine.arguments.first, swift-frontend crashes.

Source code, test.swift.

if let obj = CommandLine.arguments.first {
    print(obj)
}

Steps To Reproduce
Steps to reproduce the behavior:

  1. $ echo "if let obj = CommandLine.arguments.first { print(obj) }" > test.swift
  2. $ docker run --rm -it -v $(pwd):/src --platform linux/amd64 swift:5.6.2 swift /src/test.swift
  3. It crashes.

I got following results,

# swift test.swift "ok"
Stack dump:
0.	Program arguments: /usr/bin/swift-frontend -frontend -interpret test.swift -disable-objc-interop -color-diagnostics -new-driver-path /usr/bin/swift-driver -resource-dir /usr/lib/swift -module-name test -- ok
1.	Swift version 5.6.2 (swift-5.6.2-RELEASE)
2.	Compiling with the current language version
4.	While running user code "test.swift"
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
/usr/bin/swift-frontend[0x5187de3]
/usr/bin/swift-frontend[0x5185b7e]
/usr/bin/swift-frontend[0x5188176]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x12980)[0x4000a46980]
/usr/lib/swift/linux/libswiftCore.so(swift_getTypeByMangledName+0x162)[0x40012676a2]
/usr/lib/swift/linux/libswiftCore.so(swift_getTypeByMangledNameInContext+0xa7)[0x4001267c97]
[0x4011a2b3f4]
[0x4011a2b1d2]
/usr/bin/swift-frontend[0x5cd69a]
/usr/bin/swift-frontend[0x4d4404]
/usr/bin/swift-frontend[0x499e69]
/usr/bin/swift-frontend[0x4993ed]
/usr/bin/swift-frontend[0x48dfb8]
/usr/bin/swift-frontend[0x4463af]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x4002628c87]
/usr/bin/swift-frontend[0x445dda]
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault

Expected behavior
Expected results(this results got from swiftc command.)

> swiftc test.swift
> ./test
error
Array<String>
./test

Screenshots
Nothing.

Environment (please fill out the following information)

  • Host machine: MacBook Pro (14-inch, 2021)
  • macOS 12.5.1
  • Docker.app(v4.11.1)
  • Dockerfile
  • OS: Linux 2afa64e6e5c2 5.10.104-linuxkit x86_64 x86_64 x86_64 GNU/Linux
  • Swift version 5.6.2 (swift-5.6.2-RELEASE)
  • Target: x86_64-unknown-linux-gnu

Additional context
Nothing.

@sonsongithub sonsongithub added the bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. label Aug 20, 2022
@sonsongithub sonsongithub changed the title swift command crashes when calling CommandLine.arguments.first or checking its type. On QEMU, swift command crashes when calling CommandLine.arguments.first or checking its type. Aug 20, 2022
@kateinoigakukun
Copy link
Member

kateinoigakukun commented Aug 20, 2022

This issue is reproducible on the latest nightly snapshot image.

It looks like the crash point is in the runtime relocation process of LLVM ORC:

  case ELF::R_X86_64_PC32: {
    uint64_t FinalAddress = Section.getLoadAddressWithOffset(Offset);
    int64_t RealOffset = Value + Addend - FinalAddress;
    assert(isInt<32>(RealOffset));
    int32_t TruncOffset = (RealOffset & 0xFFFFFFFF);
    support::ulittle32_t::ref(Section.getAddressWithOffset(Offset)) =
        TruncOffset;
    break;
  }

https://github.com/llvm/llvm-project/blob/2ede992c01c4e7faaa9649b56903f0551c190eda/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp#L319

R_X86_64_PC32 relocation assumes the subtraction between the target symbol address and relocating address fits in 32-bit signed integer. However, ORC on QEMU somehow loads them too far places.

Minimal reproducible snippet:

protocol P {}
struct X: P {}
$ docker run --rm -it -v $(pwd):/src --platform linux/amd64 swiftlang/swift:nightly-main-jammy bash
 ################################################################
 #                                                              #
 # Swift Nightly Docker Image                                   #
 # Tag: swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a                 #
 #                                                              #
 ################################################################

$ apt update && apt install llvm -y # Install llvm-symbolizer
$ swift /src/test.swift
swift-frontend: /home/build-user/llvm-project/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp:319: void llvm::RuntimeDyldELF::resolveX86_64Relocation(const llvm::SectionEntry &, uint64_t, uint64_t, uint32_t, int64_t, uint64_t): Assertion `isInt<32>(RealOffset)' failed.
Stack dump:
0.      Program arguments: /usr/bin/swift-frontend -frontend -interpret /src/test.swift -disable-objc-interop -color-diagnostics -new-driver-path /usr/bin/swift-driver -empty-abi-descriptor -resource-dir /usr/lib/swift -module-name test
1.      Swift version 5.8-dev (LLVM b2416e1165ab97c, Swift 965a54f037cfa76)
2.      Compiling with the current language version
3.      While running user code "/src/test.swift"
 #0 0x0000000006347e73 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/bin/swift-frontend+0x6347e73)
 #1 0x0000000006345a1e llvm::sys::RunSignalHandlers() (/usr/bin/swift-frontend+0x6345a1e)
 #2 0x0000000006348206 SignalHandler(int) (/usr/bin/swift-frontend+0x6348206)
 #3 0x0000004000a47980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
 #4 0x0000004002685e87 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x3ee87)
 #5 0x00000040026877f1 abort (/lib/x86_64-linux-gnu/libc.so.6+0x407f1)
 #6 0x00000040026773fa (/lib/x86_64-linux-gnu/libc.so.6+0x303fa)
 #7 0x0000004002677472 (/lib/x86_64-linux-gnu/libc.so.6+0x30472)
 #8 0x00000000018e08c8 llvm::RuntimeDyldELF::resolveX86_64Relocation(llvm::SectionEntry const&, unsigned long, unsigned long, unsigned int, long, unsigned long) (/usr/bin/swift-frontend+0x18e08c8)
 #9 0x00000000018e28a3 llvm::RuntimeDyldELF::resolveRelocation(llvm::SectionEntry const&, unsigned long, unsigned long, unsigned int, long, unsigned long, unsigned int) (/usr/bin/swift-frontend+0x18e28a3)
#10 0x00000000018e27cc llvm::RuntimeDyldELF::resolveRelocation(llvm::RelocationEntry const&, unsigned long) (/usr/bin/swift-frontend+0x18e27cc)
#11 0x00000000018cbd6c llvm::RuntimeDyldImpl::resolveLocalRelocations() (/usr/bin/swift-frontend+0x18cbd6c)
#12 0x00000000018d3e78 llvm::RuntimeDyldImpl::finalizeAsync(std::unique_ptr<llvm::RuntimeDyldImpl, std::default_delete<llvm::RuntimeDyldImpl> >, llvm::unique_function<void (llvm::object::OwningBinary<llvm::object::ObjectFile>, std::unique_ptr<llvm::RuntimeDyld::LoadedObjectInfo, std::default_delete<llvm::RuntimeDyld::LoadedObjectInfo> >, llvm::Error)>, llvm::object::OwningBinary<llvm::object::ObjectFile>, std::unique_ptr<llvm::RuntimeDyld::LoadedObjectInfo, std::default_delete<llvm::RuntimeDyld::LoadedObjectInfo> >)::$_0::operator()(llvm::Expected<std::map<llvm::StringRef, llvm::JITEvaluatedSymbol, std::less<llvm::StringRef>, std::allocator<std::pair<llvm::StringRef const, llvm::JITEvaluatedSymbol> > > >) (/usr/bin/swift-frontend+0x18d3e78)
#13 0x00000000018d73a4 void llvm::detail::UniqueFunctionBase<void, llvm::Expected<std::map<llvm::StringRef, llvm::JITEvaluatedSymbol, std::less<llvm::StringRef>, std::allocator<std::pair<llvm::StringRef const, llvm::JITEvaluatedSymbol> > > > >::CallImpl<llvm::RuntimeDyldImpl::finalizeAsync(std::unique_ptr<llvm::RuntimeDyldImpl, std::default_delete<llvm::RuntimeDyldImpl> >, llvm::unique_function<void (llvm::object::OwningBinary<llvm::object::ObjectFile>, std::unique_ptr<llvm::RuntimeDyld::LoadedObjectInfo, std::default_delete<llvm::RuntimeDyld::LoadedObjectInfo> >, llvm::Error)>, llvm::object::OwningBinary<llvm::object::ObjectFile>, std::unique_ptr<llvm::RuntimeDyld::LoadedObjectInfo, std::default_delete<llvm::RuntimeDyld::LoadedObjectInfo> >)::$_0>(void*, llvm::Expected<std::map<llvm::StringRef, llvm::JITEvaluatedSymbol, std::less<llvm::StringRef>, std::allocator<std::pair<llvm::StringRef const, llvm::JITEvaluatedSymbol> > > >&) (/usr/bin/swift-frontend+0x18d73a4)
#14 0x0000000001877b23 void llvm::detail::UniqueFunctionBase<void, llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol> > > >::CallImpl<(anonymous namespace)::JITDylibSearchOrderResolver::lookup(std::set<llvm::StringRef, std::less<llvm::StringRef>, std::allocator<llvm::StringRef> > const&, llvm::unique_function<void (llvm::Expected<std::map<llvm::StringRef, llvm::JITEvaluatedSymbol, std::less<llvm::StringRef>, std::allocator<std::pair<llvm::StringRef const, llvm::JITEvaluatedSymbol> > > >)>)::{lambda(llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol> > >)#1}>(void*, llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol> > >&) (/usr/bin/swift-frontend+0x1877b23)
#15 0x000000000183cc07 llvm::orc::AsynchronousSymbolQuery::handleComplete(llvm::orc::ExecutionSession&)::RunQueryCompleteTask::run() (/usr/bin/swift-frontend+0x183cc07)
#16 0x000000000183bca7 void llvm::detail::UniqueFunctionBase<void, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> > >::CallImpl<void (*)(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >)>(void*, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >&) (/usr/bin/swift-frontend+0x183bca7)
#17 0x0000000001815126 llvm::orc::AsynchronousSymbolQuery::handleComplete(llvm::orc::ExecutionSession&) (/usr/bin/swift-frontend+0x1815126)
#18 0x000000000181f63a llvm::orc::JITDylib::resolve(llvm::orc::MaterializationResponsibility&, llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol> > const&) (/usr/bin/swift-frontend+0x181f63a)
#19 0x0000000001833654 llvm::orc::ExecutionSession::OL_notifyResolved(llvm::orc::MaterializationResponsibility&, llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol> > const&) (/usr/bin/swift-frontend+0x1833654)
#20 0x000000000181639c llvm::orc::AbsoluteSymbolsMaterializationUnit::materialize(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >) (/usr/bin/swift-frontend+0x181639c)
#21 0x000000000182a96b llvm::orc::MaterializationTask::run() (/usr/bin/swift-frontend+0x182a96b)
#22 0x000000000183bca7 void llvm::detail::UniqueFunctionBase<void, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> > >::CallImpl<void (*)(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >)>(void*, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >&) (/usr/bin/swift-frontend+0x183bca7)
#23 0x000000000182c3a7 llvm::orc::ExecutionSession::dispatchOutstandingMUs() (/usr/bin/swift-frontend+0x182c3a7)
#24 0x00000000018314a6 llvm::orc::ExecutionSession::OL_completeLookup(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >, std::shared_ptr<llvm::orc::AsynchronousSymbolQuery>, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> >, llvm::DenseMapInfo<llvm::orc::JITDylib*>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> > > > const&)>) (/usr/bin/swift-frontend+0x18314a6)
#25 0x0000000001844fb9 llvm::orc::InProgressFullLookupState::complete(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >) (/usr/bin/swift-frontend+0x1844fb9)
#26 0x000000000181c2c8 llvm::orc::ExecutionSession::OL_applyQueryPhase1(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >, llvm::Error) (/usr/bin/swift-frontend+0x181c2c8)
#27 0x0000000001818a4a llvm::orc::ExecutionSession::lookup(llvm::orc::LookupKind, std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolLookupSet, llvm::orc::SymbolState, llvm::unique_function<void (llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol> > >)>, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> >, llvm::DenseMapInfo<llvm::orc::JITDylib*>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> > > > const&)>) (/usr/bin/swift-frontend+0x1818a4a)
#28 0x00000000018771c1 (anonymous namespace)::JITDylibSearchOrderResolver::lookup(std::set<llvm::StringRef, std::less<llvm::StringRef>, std::allocator<llvm::StringRef> > const&, llvm::unique_function<void (llvm::Expected<std::map<llvm::StringRef, llvm::JITEvaluatedSymbol, std::less<llvm::StringRef>, std::allocator<std::pair<llvm::StringRef const, llvm::JITEvaluatedSymbol> > > >)>) (/usr/bin/swift-frontend+0x18771c1)
#29 0x00000000018d398f llvm::RuntimeDyldImpl::finalizeAsync(std::unique_ptr<llvm::RuntimeDyldImpl, std::default_delete<llvm::RuntimeDyldImpl> >, llvm::unique_function<void (llvm::object::OwningBinary<llvm::object::ObjectFile>, std::unique_ptr<llvm::RuntimeDyld::LoadedObjectInfo, std::default_delete<llvm::RuntimeDyld::LoadedObjectInfo> >, llvm::Error)>, llvm::object::OwningBinary<llvm::object::ObjectFile>, std::unique_ptr<llvm::RuntimeDyld::LoadedObjectInfo, std::default_delete<llvm::RuntimeDyld::LoadedObjectInfo> >) (/usr/bin/swift-frontend+0x18d398f)
#30 0x00000000018d5137 llvm::jitLinkForORC(llvm::object::OwningBinary<llvm::object::ObjectFile>, llvm::RuntimeDyld::MemoryManager&, llvm::JITSymbolResolver&, bool, llvm::unique_function<llvm::Error (llvm::object::ObjectFile const&, llvm::RuntimeDyld::LoadedObjectInfo&, std::map<llvm::StringRef, llvm::JITEvaluatedSymbol, std::less<llvm::StringRef>, std::allocator<std::pair<llvm::StringRef const, llvm::JITEvaluatedSymbol> > >)>, llvm::unique_function<void (llvm::object::OwningBinary<llvm::object::ObjectFile>, std::unique_ptr<llvm::RuntimeDyld::LoadedObjectInfo, std::default_delete<llvm::RuntimeDyld::LoadedObjectInfo> >, llvm::Error)>) (/usr/bin/swift-frontend+0x18d5137)
#31 0x0000000001874695 llvm::orc::RTDyldObjectLinkingLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >) (/usr/bin/swift-frontend+0x1874695)
#32 0x0000000001873ad5 llvm::orc::ObjectTransformLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >) (/usr/bin/swift-frontend+0x1873ad5)
#33 0x0000000001896a9a llvm::orc::IRCompileLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >, llvm::orc::ThreadSafeModule) (/usr/bin/swift-frontend+0x1896a9a)
#34 0x0000000001897200 llvm::orc::IRTransformLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >, llvm::orc::ThreadSafeModule) (/usr/bin/swift-frontend+0x1897200)
#35 0x0000000001897200 llvm::orc::IRTransformLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >, llvm::orc::ThreadSafeModule) (/usr/bin/swift-frontend+0x1897200)
#36 0x000000000189e4a7 llvm::orc::BasicIRLayerMaterializationUnit::materialize(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility> >) (/usr/bin/swift-frontend+0x189e4a7)
#37 0x000000000182a96b llvm::orc::MaterializationTask::run() (/usr/bin/swift-frontend+0x182a96b)
#38 0x000000000183bca7 void llvm::detail::UniqueFunctionBase<void, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> > >::CallImpl<void (*)(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >)>(void*, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task> >&) (/usr/bin/swift-frontend+0x183bca7)
#39 0x000000000182c3a7 llvm::orc::ExecutionSession::dispatchOutstandingMUs() (/usr/bin/swift-frontend+0x182c3a7)
#40 0x00000000018314a6 llvm::orc::ExecutionSession::OL_completeLookup(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >, std::shared_ptr<llvm::orc::AsynchronousSymbolQuery>, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> >, llvm::DenseMapInfo<llvm::orc::JITDylib*>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> > > > const&)>) (/usr/bin/swift-frontend+0x18314a6)
#41 0x0000000001844fb9 llvm::orc::InProgressFullLookupState::complete(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >) (/usr/bin/swift-frontend+0x1844fb9)
#42 0x000000000181c2c8 llvm::orc::ExecutionSession::OL_applyQueryPhase1(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState> >, llvm::Error) (/usr/bin/swift-frontend+0x181c2c8)
#43 0x0000000001818a4a llvm::orc::ExecutionSession::lookup(llvm::orc::LookupKind, std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolLookupSet, llvm::orc::SymbolState, llvm::unique_function<void (llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::JITEvaluatedSymbol> > >)>, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> >, llvm::DenseMapInfo<llvm::orc::JITDylib*>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> > > > const&)>) (/usr/bin/swift-frontend+0x1818a4a)
#44 0x000000000182c95b llvm::orc::ExecutionSession::lookup(std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolLookupSet const&, llvm::orc::LookupKind, llvm::orc::SymbolState, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> >, llvm::DenseMapInfo<llvm::orc::JITDylib*>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr> > > > const&)>) (/usr/bin/swift-frontend+0x182c95b)
#45 0x000000000182ceea llvm::orc::ExecutionSession::lookup(std::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags> > > const&, llvm::orc::SymbolStringPtr, llvm::orc::SymbolState) (/usr/bin/swift-frontend+0x182ceea)
#46 0x0000000001852da3 llvm::orc::LLJIT::lookupLinkerMangled(llvm::orc::JITDylib&, llvm::orc::SymbolStringPtr) (/usr/bin/swift-frontend+0x1852da3)
#47 0x00000000008ccd26 swift::RunImmediately(swift::CompilerInstance&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, swift::IRGenOptions const&, swift::SILOptions const&, std::unique_ptr<swift::SILModule, std::default_delete<swift::SILModule> >&&) (/usr/bin/swift-frontend+0x8ccd26)
#48 0x00000000006036b2 performCompileStepsPostSILGen(swift::CompilerInstance&, std::unique_ptr<swift::SILModule, std::default_delete<swift::SILModule> >, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) (/usr/bin/swift-frontend+0x6036b2)
#49 0x0000000000602bb0 swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) (/usr/bin/swift-frontend+0x602bb0)
#50 0x00000000006054aa swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) (/usr/bin/swift-frontend+0x6054aa)
#51 0x00000000004be5b7 swift::mainEntry(int, char const**) (/usr/bin/swift-frontend+0x4be5b7)
#52 0x0000004002668c87 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c87)
#53 0x00000000004bcf5a _start (/usr/bin/swift-frontend+0x4bcf5a)
qemu: uncaught target signal 6 (Aborted) - core dumped
Aborted

@kateinoigakukun kateinoigakukun changed the title On QEMU, swift command crashes when calling CommandLine.arguments.first or checking its type. On QEMU, swift immediate mode crashes due to relative pointer relocation failure Aug 20, 2022
c0d1f1ed added a commit to c0d1f1ed/swift that referenced this issue Mar 29, 2023
The default 'small' code model assumes that code and data sections are
allocated less than 2 GiB apart so that RIP-relative displacements can be
32-bit. On UNIX this produces ELF object code with R_X86_64_PC32
relocations. However, the default SectionMemoryManager for LLJIT simply
makes mmap() allocations which, depending on the platform's implementation,
may end up far apart.

While LLVM provides an alternate JITLinkMemoryManager which aims to provide
support for the small code model, it is still a work in progress:
https://llvm.org/docs/JITLink.html#jitlink-availability-and-feature-status

This change instead ensures the large code model is used instead, which
makes no assumptions about memory offset sizes and produces R_X86_64_64
relocations. Additional information about x64 code models can be found at:
https://eli.thegreenplace.net/2012/01/03/understanding-the-x64-code-models

Fixes swiftlang#60673
@c0d1f1ed c0d1f1ed linked a pull request Mar 29, 2023 that will close this issue
@c0d1f1ed
Copy link

@sonsongithub @kateinoigakukun Please take a look at #64720

@AnthonyLatsis AnthonyLatsis added JIT crash Bug: A crash, i.e., an abnormal termination of software swift 5.6 labels Apr 5, 2023
@lhames
Copy link
Contributor

lhames commented Apr 14, 2023

I've made some comments on #64720. I think the right solution here is to move to JITLink (which should handle small code model just fine) for ELF/x86-64.

I'll aim to post a small patch tomorrow that will switch to JITLink, but could use a hand testing it as I don't have access to a Linux dev machine.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. crash Bug: A crash, i.e., an abnormal termination of software JIT swift 5.6
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants