LLVM OCaml绑定是否包含内在支持?

时间:2011-05-13 21:19:33

标签: ocaml llvm

我似乎无法在is_intrinsic函数之外的官方LLVM OCaml绑定中找到对内在函数的引用。

我正在构建一个后端,需要执行一些特定于目标的代码生成(对于SSE,AVX和NEON),而内在函数是C ++ API中的标准路径。

2 个答案:

答案 0 :(得分:7)

OCaml绑定支持内在函数的方式与C语言绑定完全相同:

接口中没有对它们的特殊支持(就像在完整的C ++接口中那样),但是它们可以被声明为extern并且像任何其他函数一样被调用。

e.g:

open Llvm

let () =
  let c = create_context () in

  let f32_t = float_type c in
  let f32x4_t = vector_type f32_t 4 in

  let m = create_module c "test" in

  (* declare void @printv(<4 x float>)
   * nonce extern which forces preservation of vector results *)
  let printv =
   declare_function "printv"
     (function_type (void_type c) [|f32x4_t|]) m in

  (* declare <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float>) nounwind readnone *)
  let sqrtps =
   declare_function "llvm.x86.sse.sqrt.ps"
     (function_type f32x4_t [|f32x4_t|]) m in

  (* define i32 @main() { entry: *)
  let main = define_function "main" (function_type i32_t [| |]) m in
  let at_entry = builder_at_end c (entry_block main) in

  (*%sqrtps = call <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>)*)
  let cv1234 = const_vector [| const_float f32_t 1.0; const_float f32_t 2.0;
  const_float f32_t 3.0; const_float f32_t 4.0 |] in
  let sqrt = build_call sqrtps [| cv1234 |] "sqrtps" at_entry in

  (* call void printv(sqrtps) *)
  ignore (build_call printv [| sqrt |] "" at_entry);

  (* ret void *)
  ignore (build_ret (const_null i32_t) at_entry);

  (* Print .ll to stderr *)
  dump_module m

产生

; ModuleID = 'test'

declare void @printv(<4 x float>)

declare <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float>) nounwind readnone

define i32 @main() {
entry:
  %sqrtps = call <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>)
  call void @printv(<4 x float> %sqrtps)
  ret i32 0
}

编译成x86正确调用sqrtps寄存器上的xmm

答案 1 :(得分:4)

免责声明:我从未使用过LLVM。快速查看绑定文档后,看起来答案是“不”。但是对内联汇编有支持,这可能适合您的需求,也可能不适合。

最后,LLVM开发人员似乎接受了OCaml绑定不完整:如果你愿意,你可以添加更多功能(如果你不熟悉OCaml,C绑定真的不是最简单的部分,但LLVM绑定充满了您可能成功适应其他LLVM函数的示例代码),然后在LLVMdev列表上为它提供补丁。