Dynamic 如何在运行时使用llvm pass插装获取动态分配的堆地址和malloc大小?

Dynamic 如何在运行时使用llvm pass插装获取动态分配的堆地址和malloc大小?,dynamic,runtime,llvm,instrumentation,Dynamic,Runtime,Llvm,Instrumentation,在运行时遍历基本块以获取malloc size参数和返回地址。 我在IR中的每个调用malloc()站点插入printf()函数,希望它能在运行时打印malloc大小。 在本例中,大小为inst.getOperand(0),malloc大小从scanf()获取 IR语言: %conv = sext i32 %29 to i64, !dbg !81 %a.size = alloca i32, !dbg !82 store i32 10, i32* %a.size, !dbg !82

在运行时遍历基本块以获取malloc size参数和返回地址。 我在IR中的每个调用malloc()站点插入printf()函数,希望它能在运行时打印malloc大小。 在本例中,大小为inst.getOperand(0),malloc大小从scanf()获取

IR语言:

  %conv = sext i32 %29 to i64, !dbg !81
  %a.size = alloca i32, !dbg !82
  store i32 10, i32* %a.size, !dbg !82
  %30 = load i32, i32* %a.size, !dbg !82
  %31 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @0, i32 0, i32 0), i32 %30), !dbg !82
  %32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @1, i32 0, i32 0)), !dbg !82
  %call1 = call i8* @malloc(i64 %conv), !dbg !82
我可以在运行时获取分配的大小和堆地址吗?

malloc()本身在运行时选择其地址(一些实现保证每次程序运行时返回值都会变化),因此如果您想要获取堆地址,必须用自己的malloc实现来替换它


获取malloc大小更容易:如果callInst->是一个
ConstantInt
您就有了这个大小。如果不是,你也许可以,但那可能超出了你的兴趣范围?

嗨,我想我没有清楚地描述我的问题,也没有换帖子。我打算在编译时插入指令,并在运行时获取大小和堆地址。你能给我一些建议吗?
int a=0;
scanf("%d",&a); 
p1=(char*)malloc(a*sizeof(char));
  %conv = sext i32 %29 to i64, !dbg !81
  %a.size = alloca i32, !dbg !82
  store i32 10, i32* %a.size, !dbg !82
  %30 = load i32, i32* %a.size, !dbg !82
  %31 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @0, i32 0, i32 0), i32 %30), !dbg !82
  %32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @1, i32 0, i32 0)), !dbg !82
  %call1 = call i8* @malloc(i64 %conv), !dbg !82