-
Notifications
You must be signed in to change notification settings - Fork 10.3k
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
Comments
swift
command crashes when calling CommandLine.arguments.first
or checking its type.swift
command crashes when calling CommandLine.arguments.first
or checking its type.
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;
}
Minimal reproducible snippet: protocol P {}
struct X: P {}
|
swift
command crashes when calling CommandLine.arguments.first
or checking its type.swift
immediate mode crashes due to relative pointer relocation failure
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
@sonsongithub @kateinoigakukun Please take a look at #64720 |
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. |
Describe the bug
When I call
CommandLine.arguments.first
, swift-frontend crashes.Source code, test.swift.
Steps To Reproduce
Steps to reproduce the behavior:
$ echo "if let obj = CommandLine.arguments.first { print(obj) }" > test.swift
$ docker run --rm -it -v $(pwd):/src --platform linux/amd64 swift:5.6.2 swift /src/test.swift
I got following results,
Expected behavior
Expected results(this results got from
swiftc
command.)Screenshots
Nothing.
Environment (please fill out the following information)
Additional context
Nothing.
The text was updated successfully, but these errors were encountered: