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

Create an opaque struct type using the LLVM OCaml API

我正在构建一个带有 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 个参数且 returns 为双精度的函数类型,您可以编写

let f_type = function_type double_type [||]

我已经查看了 OCaml 文档 here and the C++ docs here,但我仍然不确定该怎么做。

我想要的是一个以zend_string_ptrintint作为参数并且returnszend_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将创建一个不透明类型,可以使用is_opaquedump_type.[=29=进行检查]

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

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