如何将 LLVMPass long opt 命令更改为简单命令

Posted

技术标签:

【中文标题】如何将 LLVMPass long opt 命令更改为简单命令【英文标题】:How to change LLVMPass long opt command to a simple Command 【发布时间】:2015-04-29 14:26:10 【问题描述】:

我正在从事 LLVM 混淆项目。我已经编写了一个 llvm 通行证(可以说是流平通通行证),我正在使用以下命令在源代码(test.c)上运行:

clang -emit-llvm test.c -c -o test.bc 
opt -load ../../.. LLVMFlattening.so -fla <test.bc>/dev/null

但我已经看到,在 O-LLVM 项目中,他们使用以下方法实现了相同的目标:

clang -emit-llvm test.c -c -o test.bc -mllvm -fla

谁能告诉我这里的 -mllvm 是什么以及它是如何变成一个简单命令的?

【问题讨论】:

【参考方案1】:

-mllvm 表示Additional arguments to forward to LLVM's option processing。因此-mllvm -fla 会将-fla 传递给LLVM 的选项处理。

Clang 和 LLVM 可以分开运行。如果你想让 clang 运行 llvm,并且还有一些你想让 llvm 知道的选项。 -mllvm 是你需要的。

默认情况下,LLVM 不会打开所有转换通道。使用-fla,LLVM 将通过调用函数RegisterPass&lt;typename passName&gt; 打开使用命令行参数fla 注册的通行证。

在您的命令行中,opt 的-load 选项用于加载插件。如果您想按预期使用简单的命令行。您的通行证需要链接到opt 二进制文件。这可以通过以下两种方式完成:

    (不修改现有的 LLVM 源代码树):通过添加 CMakeLists.txt 在此 link 中提到的添加您唯一通行证的源代码 直接将你的pass源代码文件夹复制到&lt;LLVM root&gt;/lib/Transform目录下。并修改&lt;LLVM root&gt;/lib/Transform/CMakeLists.txt,像其他人一样添加add_subdirectory(&lt;pass name&gt;)行。

【讨论】:

但是他们如何在 -mllvm 中添加 -fla(流平通道标志)。我不想使用 opt 命令来使用我的 llvmPass llvm 加载路径在哪里? 对不起,我弄错了,您的密码可以与现有的opt 二进制文件链接在一起以完成此操作。我已经更新了我的答案。 我试过了,但不知道为什么它不起作用。即使按照建议添加了所有内容,-mllvm 也没有打开 -fla。 什么是`选项处理`?它是命令行参数解析器吗?我在哪里可以了解更多信息?可以向它传递哪些额外的参数?【参考方案2】:

我最近正在研究 O-LLVM,并且遇到了同样的问题。这是我的解决方案:

1.将static cl::opt&lt;bool&gt; YOUR_FLA("fla", cl::init(false),"info...")添加到PassManagerBuilder.cpp

2.在你的混淆传递源代码中添加函数Pass *createYOUR_FLA(bool flag)

3.在PassManagerBuilder.cpp中添加MPM.add(createYOUR_FLA(YOUR_FLA));到函数populateModulePassManager

上面的解决方案适用于我的简单通行证。

【讨论】:

嗨,你能再解释一下吗,我想在加载我的 llvm 通行证时传递参数

以上是关于如何将 LLVMPass long opt 命令更改为简单命令的主要内容,如果未能解决你的问题,请参考以下文章

将坐标 lat 和 long 更改为 andress

VC2008如何将Cstring转成long型?

如何在 Long 数据类型变量中设置 Optional<Long> 数据类型变量值? [关闭]

c语言中如何将short,int,long,float这些类型的数值转换为字符串?

c语言中如何将short,int,long,float这些类型的数值转换为字符串?

sql 通过lskin查找处置 - 按处置过滤(对于较旧的对话,将short更改为long