LLVM API 为 ptr 类型生成无效 IR

问题描述 投票:0回答:1

我正在使用 LLVM 15,我正在尝试将我自己的语言(在语法方面与 Pascal 非常相似)编译为 LLVM IR,并且我正在使用 Ocaml。 当我尝试创建一个结构并将其主体设置为具有

ptr
元素时,当我获得对该结构的该字段的引用并存储到它时,它的类型为 str* ,这是无效的。 这是生成此内容的示例 ocaml 代码:

let frame = named_struct_type llvm.context "frame1" in
struct_set_body frame ([| pointer_type2 llvm.ctx |]) false;
let frame_ptr = build_alloca frame ("frame_ptr") llvm.builder in
let base = build_struct_gep2 frame frame_ptr 0 "frame_elem_ptr" llvm.builder in
ignore (build_store v base llvm.builder);

其中 v 是一个名为 auxiliery 且类型为 ptr 的函数参数。

上面的代码生成了这个 IR:

  %frame = type { ptr }
  %frame_ptr = alloca %frame, align 8
  %frame_elem_ptr = getelementptr inbounds %frame, %frame* %frame_ptr, i32 0, i32 0
  store ptr %auxiliary, ptr* %frame_elem_ptr, align 8

当我尝试编译这个时,我得到:

llc-15: error: llc-15: llvm_ir.ll:54:28: error: ptr* is invalid - use ptr instead

哪一种对我来说有意义...... 我的意思是,当然,我知道星号必须被删除,如果我手动从 IR 文件中删除它,它应该编译(实际上确实如此!)但是:

  1. 为什么这是不允许的? (在 C 中,指向指针的指针就可以)
  2. 最重要的是,有谁知道如何在我的 Ocaml 代码中修复它(甚至 C++ api 指令将非常感激!)?

一般来说,不透明的指针给我带来的麻烦多于好处……:(

pointers compilation ocaml llvm llvm-ir
1个回答
0
投票

这是不允许的,因为它是一个指向不透明指针的指针。你必须下定决心,要么你的指针不透明('

pre
),要么不透明(
x*
)。混合的意义与 32⅓ 位整数一样有意义。

解决这个问题很简单:决定你喜欢哪一个,然后使用

x*
返回到 LLVM 版本或使用
ptr

© www.soinside.com 2019 - 2024. All rights reserved.