Closed
Description
Compiling this code with both -O
and -g
gets into an infinite loop:
#![feature(asm)]
pub fn black_box<T>(dummy: T) { unsafe { asm!("" : : "r"(&dummy)) } }
fn silent_recurse() {
let buf = [0, ..1000];
black_box(buf);
silent_recurse();
}
fn main() {
silent_recurse();
}
The problem is that enabling debugging seems to optimize silent_recurse
into a tail call. Here's the optimized-but-not-debugged function:
...
; Function Attrs: nounwind uwtable
define internal fastcc void @_ZN14silent_recurse20h29298914b0c999efraa4v0.0E() unnamed_addr #1 {
entry-block:
%arg = alloca [1000 x i64], align 8
%arg4 = bitcast [1000 x i64]* %arg to i8*
call void @llvm.memset.p0i8.i64(i8* %arg4, i8 0, i64 8000, i32 8, i1 false)
call void asm "", "r,~{dirflag},~{fpsr},~{flags}"([1000 x i64]* %arg) #0
call fastcc void @_ZN14silent_recurse20h29298914b0c999efraa4v0.0E()
ret void
}
...
Here's the optimized-and-debugged function:
...
; Function Attrs: nounwind uwtable
define internal fastcc void @_ZN14silent_recurse20h29298914b0c999efraa4v0.0E() unnamed_addr #2 {
entry-block:
%arg = alloca [1000 x i64], align 8
%arg4 = bitcast [1000 x i64]* %arg to i8*
call void @llvm.memset.p0i8.i64(i8* %arg4, i8 0, i64 8000, i32 8, i1 false)
call fastcc void @_ZN9black_box20h802b764baabf3bd5eaa4v0.0E([1000 x i64]* nocapture %arg), !dbg !27
tail call fastcc void @_ZN14silent_recurse20h29298914b0c999efraa4v0.0E(), !dbg !28
ret void, !dbg !28
}
; Function Attrs: nounwind uwtable
define internal fastcc void @_ZN9black_box20h802b764baabf3bd5eaa4v0.0E([1000 x i64]* noalias nocapture readonly) unnamed_addr #2 {
entry-block:
%dummy = alloca [1000 x i64], align 8
%1 = bitcast [1000 x i64]* %0 to i8*
%2 = bitcast [1000 x i64]* %dummy to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %2, i8* %1, i64 8000, i32 8, i1 false)
call void @llvm.dbg.declare(metadata !{[1000 x i64]* %dummy}, metadata !23), !dbg !29
call void asm "", "r,~{dirflag},~{fpsr},~{flags}"([1000 x i64]* %dummy) #0, !dbg !30
ret void, !dbg !30
}
...
Metadata
Metadata
Assignees
Labels
No labels