微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何理解LLVM中hasAddressTaken的定义

如何解决如何理解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 举报,一经查实,本站将立刻删除。