在LLVM传递中识别带注释的变量
问题描述:
如何在LLVM传递中识别带注释的变量?在LLVM传递中识别带注释的变量
#include <stdio.h>
int main(){
int x __attribute__((annotate("my_var")))= 0;
int a,b;
x = x + 1;
a = 5;
b = 6;
x = x + a;
return x;
}
例如,我想鉴定具有注释的变量(x在这种情况下)的指令并打印出来(X = X + 1;以及x = X + A) 我怎样才能实现这个?
这是使用LLVM
; ModuleID = 'test.c'
source_filename = "test.c"
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64"
@.str = private unnamed_addr constant [7 x i8] c"my_var\00", section "llvm.metadata"
@.str.1 = private unnamed_addr constant [7 x i8] c"test.c\00", section "llvm.metadata"
; Function Attrs: noinline nounwind optnone
define i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i32, align 4
%4 = alloca i32, align 4
store i32 0, i32* %1, align 4
%5 = bitcast i32* %2 to i8*
call void @llvm.var.annotation(i8* %5, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.s$
store i32 0, i32* %2, align 4
%6 = load i32, i32* %2, align 4
%7 = add nsw i32 %6, 1
store i32 %7, i32* %2, align 4
store i32 5, i32* %3, align 4
store i32 6, i32* %4, align 4
%8 = load i32, i32* %2, align 4
%9 = load i32, i32* %3, align 4
%10 = add nsw i32 %8, %9
store i32 %10, i32* %2, align 4
%11 = load i32, i32* %2, align 4
ret i32 %11
}
; Function Attrs: nounwind
declare void @llvm.var.annotation(i8*, i8*, i8*, i32) #1
attributes #0 = { noinline nounwind optnone "correctly-rounded-divide-sqrt-fp-math"="false" $
attributes #1 = { nounwind }
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"wchar_size", i32 4}
答
你必须在指令循环,并确定调用llvm.var.annotation
第一个参数生成的.ll文件的指针批注的变量(8-18 *)。
要获得实际的带注释的变量,您需要找到这个指针指向的内容。
就你而言,这是bitcast指令的源操作数。
+0
如何识别对llvm.var.annotation的调用?无法弄清楚如何做到这一点。 – Dragonight
首先将此代码编译为IR并查看生成的内容。 – arrowd
我做到了。我可以将生成的元数据看作全局字符串。但是,我不清楚如何使用这些信息来识别特定的变量。 – Dragonight
向我们展示生成的代码,也许我们会得到一条线索。 – arrowd