[LLVMdev] Compile function with limited set of registers? Jump to another function?

James Williams junk at giantblob.com
Tue Jan 25 01:04:08 PST 2011


Hi,

Can anyone tell me, is it possible to express in LLVM IR:
  - that, for a specific function, register allocator can use only limited
set of registers? (specifically, cannot touch any registers that might
contain parameters)
  - that stack can't be touched? (or at least must balance on exit from
thunk)
  - jump, not call, to another function leaving any received parameters
unchanged in registers and on stack?

Thanks,
-- James Williams

Background:

I'm looking for some advice on implementing thunks required by my language's
interface call mechanism. This is a fairly conventional arrangement where
method selectors in interfaces are hashed to determine their index within a
vtable and hash collisions are disambiguated at runtime by a thunk, which
determines which method to call from a selector id passed as the first
method parameter.

I'm currently using a single thunk (written in assembly) for all collisions
that walks a table to determine what method to call. This works but it's
inefficient and requires the a hand written thunk for each supported target.

I'd like to instead generate IR for a specific thunk for each vtable
collisoin that does a binary search of possible selectors because this will
avoid some pointer dereferences and an additional indirect call.

The problem is that a thunk may need to decide between methods with
different signatures without disturbing parameters in registers and on the
stack and then jump to, rather than call, another function:

interface X:
  method A(a, b)

interface Y:
  method B(c, d, e)

class Z implements X, y:
  method A(a, b) ...
  method B(c, d, e) ...

X.A + Y.B happen to hash to same vtable index, say -3

This would require a thunk something like:

vtable[-3] =
  thunk_Z_AorB(selector_id, ...)
    // binary search for matching selector id:
    if selector_id <= selector_Z_A then
      Z.A(selector_id, ...)
    else
      Z.B(selector_id, ...)
    fi

which would ideally would compile on x64 to something like:

thunk_Z_AorB:
  cmp $selector_Z_A, %rdi
  jle Z.A
  jmp Z.B
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110125/46ac62a3/attachment.html>


More information about the llvm-dev mailing list