Добавление функции в LLVM (привязки haskell), когда число параметров не известно во время компиляции - PullRequest
7 голосов
/ 23 июня 2011

Справочная информация : я написал игрушечный интерпретатор Lisp, к которому я пытаюсь добавить функциональность JL LLVM.На данный момент наложены следующие ограничения:

  • В функциях допускаются только целочисленные значения
  • Переменные могут ссылаться только на формальные параметры

Дано :

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

Вопрос : Как мне сгенерировать функцию, в которой число параметров равно длине списка формальных параметров?

1 Ответ

6 голосов
/ 24 июня 2011

Я не знаю, возможно ли это сделать только с EDSL из LLVM.Core (типы действительно довольно волосатые), но если вы посмотрите на LLVM.FFI.Core, вы найдете функциональность более низкого уровня для манипулирования типами функций LLVM и для создания функций LLVM . Это приводит к следующему плану действий:

  • Создайте TypeRef для вашей функции с помощью functionType.
  • Добавьте эту функцию в ваш модуль, используя addFunction.
  • Заполните его основными блоками, используя appendBasicBlock / insertBasicBlock. Используйте getParam для ссылки на аргументы функции внутри ваших основных блоков.

Должно быть возможно использовать хороший монадический синтаксис EDSL для построения базовых блоков. Также посмотрите на LLVM.Core.Util, он содержит некоторые вспомогательные функции для работы со слоем FFI.

...