微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在从 LLVM IR

如何解决在从 LLVM IR

我在 LLVM IR 中有 auto-generated 基准文件,但是要使用另一个工具提取循环边界,我需要在 C 中使用它们。使用 llvm-cbe/Julia 转换为 C 相当简单(如 {{ 3}}) 或 this post。然而,据我所知,这两个工具都用 goto 表示整个控制流,这使得结果成为一个 C 程序,但不是更有用。例如,此摘录仅代表一些 if/else 结构。

  gene_glob_input_variable = llvm_cbe_gene_arg;
  llvm_cbe_tmp__1 = gene_glob_input_variable;
  llvm_cbe_arith1 = llvm_cbe_tmp__1 ^ 253077109;
  llvm_cbe_tmp__2 = gene_glob_input_variable;
  if (((((llvm_cbe_tmp__2 & -129) == 0u)&1))) {
    goto llvm_cbe_br1_2e_then;
  } else {
    goto llvm_cbe_br1_2e_else_2e_wcp;
  }

llvm_cbe_br1_2e_then:
  llvm_cbe_tmp__3 = gene_glob_input_variable;
  *((uint32_t*) alloca(sizeof(uint32_t))) = llvm_cbe_tmp__3;
  llvm_cbe_tmp__4 = gene_glob_input_variable;
  *((uint32_t*) alloca(sizeof(uint32_t))) = llvm_cbe_tmp__4;
  goto llvm_cbe_br1_2e_end_2e_wcp;

llvm_cbe_br1_2e_else_2e_wcp:
  *(volatile uint16_t*)(&cons0) = (((uint16_t)llvm_cbe_tmp__1));
  *(volatile uint16_t*)(&cons0) = (((uint16_t)llvm_cbe_tmp__2));
  llvm_cbe_tmp__5 = gene_glob_input_variable;
  if (((((llvm_cbe_tmp__5 & -1048577) != 0u)&1))) {
    goto llvm_cbe_br2_2e_then_2e_wcp;
  } else {
    goto llvm_cbe_br2_2e_else;
  }

有没有办法用 goto 从 C 重建 if/else 和 for 循环,或者有没有办法使用这些工具直接从 .ll 文件中实现?在基准测试中选择用于生成的构造相当简单,因此具有不完整循环重建的解决方案就足够了。感谢您的任何提示

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。