At Mon, 2 Mar 2015 09:25:40 +0300, Sergey Pinaev wrote: > On Fri, 27 Feb 2015 08:00:34 -0700 > Matthew Flatt <mfl...@cs.utah.edu> wrote: > > > That's as far as I've ever gotten with memcheck. Racket manipulates the > > C stack in ways that are far outside of what is supposed to be allowed, > > and I think it confuses Valgrind. I don't know if there's a way to tell > > Valgrind to allow this behavior and/or to give up on checking > > operations related to the stack, but I didn't find one in the little > > time I spent looking before. > > this is "--vex-iropt-register-updates=allregs-at-each-insn" for. > and i'm talking here about bug in racket. scheme_handle_stack_overflow() > called before scheme_overflow_jmp is initialised.
Ah, I finally see what you mean, and I've had it backwards: Valgrind is confusing Racket about the stack, not the other way around. Thanks! I was able to make Racket run in Valgrind on Linux with the following changes: * In "eval.c", disable # ifdef LINUX_FIND_STACK_BASE bnd = adjust_stack_base(bnd); # endif That's where Valgrind confuses Racket, because it (understandably) puts the stack in a different location than the executable state says. * In "newgc.c", disable generational GC by changing the initialization newgc->generations_available = 1; to 0. Write barriers implemented by mprotect() and signal handlers don't interact well with Valgrind; I'm not sure exactly why, but it's not surprising. * Initialize some `epoll_event` structures in "thread.c" with memset(&ev, 0, sizeof(ev)) in obvious places. I don't think the lack of initialization reflects a bug; I think Valgrind just has to be conservative about memory sent to a syscall. It's a good idea to initialize, anyway. * Disable the use of libunwind by undefining MZ_USE_DWARF_LIBUNWIND in "jitstack.c". I'm not entirely certain, but I think that memcheck doesn't know that program headers should count as initialized. With those changes, memcheck effectively detects that mmu_should_compact_page(gc->mmu, work->mmu_src_block) in "newgc.c" is missing an ampersand before the second argument. The mistake won't cause any crashes, but it could reduce performance. I think there's probably more to get out of memcheck, but I'm pausing here to revisit on another day. ____________________ Racket Users list: http://lists.racket-lang.org/users