避免在某些基本块上进行LLVM IR优化

避免在某些基本块上进行LLVM IR优化,llvm,llvm-ir,Llvm,Llvm Ir,我正在实现一个与安全相关的过程,因此,我正在注入一个自定义基本块作为LLVM IR函数过程的一部分 有没有一种方法可以标记这个基本块,以便以后的过程不会优化这个基本块?我恐怕没有一个非常直接的建议。但是这里有一些需要考虑的事情。 在应用了与所需/所需优化级别(例如,opt-O3)相关的所有优化之后,您是否可以应用基本块注入?(我想不会,因为你在问。) 我也不确定要避免哪些优化(取决于您在基本块上所做的)。例如,你介意-simplifycfg的效果吗?换句话说,将注入的基本块与前置/后继块合并 如

我正在实现一个与安全相关的过程,因此,我正在注入一个自定义基本块作为LLVM IR函数过程的一部分


有没有一种方法可以标记这个基本块,以便以后的过程不会优化这个基本块?

我恐怕没有一个非常直接的建议。但是这里有一些需要考虑的事情。 在应用了与所需/所需优化级别(例如,
opt-O3
)相关的所有优化之后,您是否可以应用基本块注入?(我想不会,因为你在问。)

我也不确定要避免哪些优化(取决于您在基本块上所做的)。例如,你介意
-simplifycfg
的效果吗?换句话说,将注入的基本块与前置/后继块合并

如果基本块代码相当通用,也许您可以考虑将该块保持在一个单独的函数中,并将其作为参数提供任何需要的输入,并用<代码>π属性表((NONLILN))< /代码>标记以避免。 话虽如此,您可以将该基本块中的所有内存访问声明为

volatile
,这会抑制优化。看一看

编辑:还有
属性::OptimizeNone
,您可以使用该属性修饰函数,并在优化过程中通过
opt
和相关过程跳过该函数。您可以在
LLVM
的源代码中遵循(aka
grep
)该属性

如果这还不够,而且由于我不知道有任何通用的黑名单/白名单功能,
我只能想到一个繁重的替代方案,但我还不敢发布。

是否可以将块移动到一个单独的函数,将函数设置为optnone,但仍然确保内联?@Nuoji您将哪个函数称为内联候选函数,哪个被标记为optnone?标记为optnone的函数不会内联任何内容,以防它包含调用(除非在最新的LLVM版本中发生了更改,我对此表示怀疑)。不太确定当optnone修饰函数被认为是在其调用站点内联时会发生什么。稍后我会看一看,但它可能很容易测试。