Closed
Description
I was having fun compiling rust-analyser for maximizing performance on my machine.
Compiling commit ec645f2 of rust-analyser with lto=fat seems to work as expected.
But this configuration on windows:
[profile.release]
lto = "thin"
#incremental = true
debug = 0 # set this to 1 or 2 to get more useful backtraces in debugger
Result in rust-analyser segfaut:
Access violation executing location 0x0000000100785A4D.
Meta
rustc 1.43.0 (4fb7144ed 2020-04-20)
binary: rustc
commit-hash: 4fb7144ed159f94491249e86d5bbd033b5d60550
commit-date: 2020-04-20
host: x86_64-pc-windows-msvc
release: 1.43.0
LLVM version: 9.0
Backtrace
> rust-analyzer.exe!_ZN7globset8pathutil9file_name17h08d0f1900ad67247E�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!_ZN7globset7GlobSet8is_match17hf1cf9a1f69ce8dd2E�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!_ZN77_$LT$rust_analyzer..vfs_glob..RustPackageFilter$u20$as$u20$ra_vfs..Filter$GT$11include_dir17ha6495721bf18fe0eE�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!_ZN6ra_vfs5roots16to_relative_path17hb9707874d497bdc4E�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!_ZN106_$LT$core..iter..adapters..chain..Chain$LT$A$C$B$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$8try_fold17hac44483bd652ee40E�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!_ZN108_$LT$walkdir..FilterEntry$LT$walkdir..IntoIter$C$P$GT$$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17ha136f9b20c380477E�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!_ZN6ra_vfs2io13handle_change17h8a81e482afc2c09bE�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!_ZN6ra_vfs2io10watch_root17h425c73dcf2ce2dd1E�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!_ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17hb0fd61dddb6f5a20E.llvm.14564221459209632736�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!_ZN4core3mem4drop17hab46961f8567a42bE.llvm.1531302937598756963�() Unknown Non-user code. Symbols loaded.
rust-analyzer.exe!alloc::boxed::{{impl}}::call_once<(),FnOnce<()>>() Line 1017 Unknown Symbols loaded.
[Inline Frame] rust-analyzer.exe!alloc::boxed::{{impl}}::call_once() Line 1017 Unknown Symbols loaded.
[Inline Frame] rust-analyzer.exe!std::sys_common::thread::start_thread() Line 13 Unknown Symbols loaded.
rust-analyzer.exe!std::sys::windows::thread::{{impl}}::new::thread_start() Line 51 Unknown Symbols loaded.
Frame 0 Assembly
_ZN7globset8pathutil9file_name17h08d0f1900ad67247E:
00007FF66A5D76B0 push rbp
00007FF66A5D76B1 push r15
00007FF66A5D76B3 push r14
00007FF66A5D76B5 push r12
00007FF66A5D76B7 push rsi
00007FF66A5D76B8 push rdi
00007FF66A5D76B9 push rbx
00007FF66A5D76BA sub rsp,60h
00007FF66A5D76BE lea rbp,[rsp+60h]
00007FF66A5D76C3 mov qword ptr [rbp-8],0FFFFFFFFFFFFFFFEh
00007FF66A5D76CB mov r12,rcx
00007FF66A5D76CE mov rsi,qword ptr [rdx]
00007FF66A5D76D1 mov rdi,qword ptr [rdx+10h]
00007FF66A5D76D5 cmp rsi,1
00007FF66A5D76D9 mov rbx,qword ptr [rdx+18h]
00007FF66A5D76DD mov r8,rdi
00007FF66A5D76E0 cmove r8,rbx
00007FF66A5D76E4 test r8,r8
00007FF66A5D76E7 je _ZN7globset8pathutil9file_name17h08d0f1900ad67247E+45h (07FF66A5D76F5h)
00007FF66A5D76E9 mov r15,qword ptr [rdx+8]
00007FF66A5D76ED cmp byte ptr [r8+r15-1],2Eh
00007FF66A5D76F3 jne _ZN7globset8pathutil9file_name17h08d0f1900ad67247E+52h (07FF66A5D7702h)
00007FF66A5D76F5 mov qword ptr [r12],2
00007FF66A5D76FD jmp _ZN7globset8pathutil9file_name17h08d0f1900ad67247E+14Fh (07FF66A5D77FFh)
00007FF66A5D7702 mov rax,qword ptr [__imp__ZN6memchr3x867memrchr2FN17h7699f2e42a7ae581E (07FF66BBC73B0h)]
00007FF66A5D7709 mov rax,qword ptr [rax]
00007FF66A5D770C mov cl,2Fh
00007FF66A5D770E mov rdx,r15
00007FF66A5D7711 call rax <<< rax is garbage
00007FF66A5D7713 mov r14,rdx
00007FF66A5D7716 add r14,1
Frame 0 Registers
RBX = 00000238EB8D2FE0
RSI = 0000000000000000
RDI = 0000000000000005
R12 = 000000C631DFE620
R13 = 000000C631DFE790
R14 = 0000000000000008
R15 = 00000238EB8D2FE0
RIP = 00007FF66A5D7713
RSP = 000000C631DFE540
RBP = 000000C631DFE5A0
So this function seams to be miss compiled:
pub fn file_name<'a>(path: &Cow<'a, [u8]>) -> Option<Cow<'a, [u8]>> {
if path.is_empty() {
return None;
} else if path.last_byte() == Some(b'.') {
return None;
}
let last_slash = path.rfind_byte(b'/').map(|i| i + 1).unwrap_or(0);
Some(match *path {
Cow::Borrowed(path) => Cow::Borrowed(&path[last_slash..]),
Cow::Owned(ref path) => {
let mut path = path.clone();
path.drain_bytes(..last_slash);
Cow::Owned(path)
}
})
}
In particular this line:
let last_slash = path.rfind_byte(b'/').map(|i| i + 1).unwrap_or(0);
00007FF66A5D7702 mov rax,qword ptr [__imp__ZN6memchr3x867memrchr2FN17h7699f2e42a7ae581E (07FF66BBC73B0h)]
00007FF66A5D7709 mov rax,qword ptr [rax]
00007FF66A5D770C mov cl,2Fh
00007FF66A5D770E mov rdx,r15
00007FF66A5D7711 call rax <<< rax is garbage
Metadata
Metadata
Assignees
Labels
Area: linking into static, shared libraries and binariesCategory: This is a bug.Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable ExampleIssue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/SoundnessHelping to "clean up" bugs with minimal examples and bisectionsBugs identified for the LLVM ICE-breaker groupHigh priorityRelevant to the compiler team, which will review and decide on the PR/issue.