Locations in the codegen where we assume pointers tagged with certain values?
Ömer Sinan Ağacan
omeragacan at gmail.com
Sat Apr 27 11:12:43 UTC 2019
Hi all,
I'm trying to find all places in the code generator where we assume that a
pointer is tagged with a certain value. A generated code for this looks like
this:
mov 0x6(%rbx),%rax
This moves payload[0] of the closure in %rbx to %rax, but it assumes that %rbx
is tagged with 2 so it does 0x6(%rbx) instead of 0x8(%rbx).
Anyone know where I should be looking at?
Context: I'm implementing shorting out indirections in the concurrent collector.
The code is quite similar to the current collector, except we do a cas() when
updating the IND/BLACKHOLE pointer with the pointer to the indirectee. The
problem is this causes all kinds of problems, in our debugging mostly caused by
pointer misalignment. One concrete example of where this happens is we do
mov 0x6(%rbx),%rax
but the pointer in %rbx is actually tagged 3 instead of 2. The reason is I think
we're breaking some invariants in the generated code where we assume certain
tags from pointers (2 in the example above), but I couldn't find where in the
code generator we do this.
Thanks,
Ömer
More information about the ghc-devs
mailing list