如何理解LLVM中hasAddressTaken的定义

问题描述

在LLVM中,基本块下的成员函数hasAddressaken定义如下:

bool hasAddresstaken() const
如果除了直接分支、开关等之外,此基本块还有任何用途,则返回 true。更多...

所以我尝试实现一个间接调用分支,并在每个基本块中插入一个调用指令。

; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @print() #0 {
entry:
  %call = call i32 (i8*,...) @printf(i8* getelementptr inbounds ([9 x i8],[9 x i8]* @.str,i32 0,i32 0))
  ret i32 0
}

declare dso_local i32 @printf(i8*,...) #1

; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
entry:
  %retval = alloca i32,align 4
  %i = alloca i32,align 4
  %a = alloca [10 x i32],align 16
  store i32 0,i32* %retval,align 4
  store i32 0,i32* %i,align 4
  %0 = bitcast [10 x i32]* %a to i8*
  call void @llvm.memset.p0i8.i64(i8* align 16 %0,i8 0,i64 40,i1 false)
  store i32 0,align 4
  %1 = call i32 @print()
  br label %for.cond

for.cond:                                         ; preds = %for.inc,%entry
  %2 = load i32,align 4
  %cmp = icmp slt i32 %2,20
  %3 = call i32 @print()
  br i1 %cmp,label %for.body,label %for.end

可以看到开头定义的print函数在每个基本块中都会调用一次。但即便如此,hasAddresstaken 也会返回 false。 谁能帮我理解这个函数的定义,或者我应该怎么做才能让它返回真?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)