2011-06-23 4 views
7

Antecedentes: He escrito un intérprete Lisp de juguete al que estoy intentando agregar la funcionalidad LLVM JIT. Por el momento, han impuesto las siguientes limitaciones:Agregar una función en LLVM (enlaces haskell) cuando no se conoce el número de parámetros en tiempo de compilación

  • Sólo se permiten valores enteros en funciones
  • Variables solamente pueden hacer referencia a parámetros formales

Dada:

compile :: [Value] -- List of Formal Parameters 
     -> [Value] -- Body of function 
     -> CodeGenModule(Function a)` 

Pregunta: ¿Cómo puedo generar una función donde el número de p arameters es igual a la longitud de la lista Formal Parameters?

+0

Un buen comienzo podría ser ayudarme a entender 'forrall f g r. FunctionArgs f g (CodeGenFunction r()) ' –

+0

¿le gustaría compartir su experiencia de usar haskell binding de LLVM? ¿Qué versión usaste? :) – Nybble

+0

@Wu: LLVM 2.9 con el enlace de llvm de [commit 729514] (https://github.com/bos/llvm/commit/72951414d7b7b377ee1a040fae2b043b7747ceff). [Ver también] (http://stackoverflow.com/questions/6406067/haskell-llvm-binding-linker-error) –

Respuesta

6

No sé si es posible hacer esto con sólo la EDSL de LLVM.Core (los tipos son de hecho bastante peluda), pero si nos fijamos en LLVM.FFI.Core, se encuentra la funcionalidad de nivel inferior para manipulating LLVM function types y creating LLVM functions . Esto nos lleva al siguiente plan de acción:

  • Crear una TypeRef para su función con functionType.
  • Agregue esta función a su módulo usando addFunction.
  • Rellenarlo con bloques básicos usando appendBasicBlock/insertBasicBlock. Use getParam para hacer referencia a los argumentos de funciones dentro de sus bloques básicos.

Debería ser posible utilizar la buena sintaxis monofónica EDSL para construir los bloques básicos. Además, mira LLVM.Core.Util, contiene algunas funciones auxiliares para trabajar con la capa FFI.

Cuestiones relacionadas