我正在构建一个带有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_ptr
,int
和int
作为参数并返回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_opaque
和dump_type
进行检查。
答案 0 :(得分:2)
这些行将为不透明的结构创建所需的指针类型:
let zend_string_type = named_struct_type llvm_context "zend_string"
let zend_string_ptr_type = pointer_type zend_string_type