在从LLVM IR反编译的C文件中重构高级构造



我在LLVM IR中自动生成了基准文件,但要使用另一个工具提取循环边界,我需要在C中使用它们。使用LLVM cbe/Julia(如本文评论中所建议的(或llvm2c转换为C相当简单。然而,就我所知,这两个工具都代表了gotos的整个控制流,这使得结果成为一个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;
}

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

答案有点晚,但您可能对Rellic感兴趣。

最新更新