使用LLVM OCaml API创建不透明的结构类型

时间:2015-09-05 13:03:37

标签: ocaml llvm php-internals

我正在构建一个带有LLVM后端的PHP compiler。我将使用Zend类型zend_string来表示字符串。为此,我需要一个名为zend_string_ptr的LLVM指针类型或其他类型。如何使用OCaml LLVM绑定创建此指针类型?

例如,这个PHP代码

$a = 'asd';

应对应此C代码

zend_string *a = zend_string_init("asd", 3, 1);
zend_new_interned_string(a);

要在OCaml中创建LLVM双重类型,您可以编写

let double_type = double_type llvm_context

要创建一个带0参数并返回double的函数类型,你可以编写

let f_type = function_type double_type [||]

我已经检查了OCaml文档here和C ++文档here,但我仍然不确定如何解决这个问题。

我想要的是一个函数类型,它将zend_string_ptrintint作为参数并返回zend_string_ptr

生成的LLVM字节码应该是这样的

%zend_string = type opaque
declare %zend_string* @zend_string_init(i8, i32, i32)

其中i8是指向常量字符串的元素指针;然后

%1 = alloca %zend_string_ptr

等等。

提示?

修改:使用named_struct_type会创建一个opaque类型,可以使用is_opaquedump_type进行检查。

1 个答案:

答案 0 :(得分:2)

这些行将为不透明的结构创建所需的指针类型:

let zend_string_type = named_struct_type llvm_context "zend_string"
let zend_string_ptr_type = pointer_type zend_string_type