使用 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_ptr
、int
和int
作为参数并且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_opaque
和dump_type
.[=29=进行检查]
这些行将为不透明结构创建所需的指针类型:
let zend_string_type = named_struct_type llvm_context "zend_string"
let zend_string_ptr_type = pointer_type zend_string_type
我正在构建一个带有 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_ptr
、int
和int
作为参数并且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_opaque
和dump_type
.[=29=进行检查]
这些行将为不透明结构创建所需的指针类型:
let zend_string_type = named_struct_type llvm_context "zend_string"
let zend_string_ptr_type = pointer_type zend_string_type