ollvm中SplitPass混淆后,之后又被谁优化了?

测试了llvm9,llvm12 都一样的效果。

./clang12 -S -emit-llvm test.mm -mllvm -split
生成转换后的ll 是有混淆效果的。

./llc -filetype=obj test.ll -O0
生成的obj文件,切割效果,没了。

以为是MachineFunctionPass 阶段被优化掉了,一路注释MachineFunctionPass,也没看到效果,也不是链接阶段的优化,对llvm也不是太熟,希望大佬,能给点意见。谢谢了。

./llc -view-sunit-dags test.ll

*** after createPseudoProbeInserter LLVM Code input to ISel ***

; Function Attrs: noinline norecurse nounwind optnone ssp uwtable mustprogress
define dso_local i32 @main() #1 {
entry:
%retval = alloca i32, align 4
%rs = alloca i32, align 4
%a = alloca i32, align 4
%count = alloca i32, align 4
br label %entry.split

entry.split: ; preds = %entry
store i32 0, i32* %retval, align 4
%call = call i32 @_Z3addii(i32 1, i32 2)
store i32 %call, i32* %rs, align 4
store i32 0, i32* %a, align 4
%0 = load i32, i32* %a, align 4
%tobool = icmp ne i32 %0, 0
br label %entry.split.split

entry.split.split: ; preds = %entry.split
br i1 %tobool, label %if.then, label %if.else

Split不加别的本来就会被SimplifyCFG啊

单开Split LLVM不优化IDA都会优化掉,毫无意义

测试fla,sub ,现在有效果的。只是单独测试查看,一个一个pass,查看效果。

我记得注释过,SimplifyCFG,我再测,试一试。

……自己花个半个月稍微学学编译器吧

张总,加了扁平化,也还是没看到 切割效果。
不同参数编译出来,反汇编比较。没看到剪切效果。

-mllvm -split -mllvm -split_num=2 -mllvm -sub -mllvm -fla

-mllvm -sub -mllvm -fla

SimplifyCFG,应该也有某个具体的pass 吧,优化掉,切割效果。 是否可以不加载这个pass,就达到不去混淆的效果?

目测是在生成DAG的时候被干掉的

1 Like

那就是,不是在pass 内优化掉的?
addPass(createCFGSimplificationPass
addPass(&MachineCombinerID);
addPass(BranchFolderPass());
addPass(createAArch64IndirectThunks());
几个可疑的,我全部注释掉了。

在进入MachineFunction 时,就被处理掉了,后面还有pass 处理。不同架构应该要分别处理。