gpt4 book ai didi

llvm - 如何在 llvm ir 代码文件中找到所有内存分配?

转载 作者:行者123 更新时间:2023-12-04 12:24:59 25 4
gpt4 key购买 nike

我试图编译这段 C++ 代码:

void FuncTest() {
int* a = new int;
int* b = new int[2];
}

使用:
clang test.cpp -S -emit-llvm -o - > test.llvm

并获得了这个:
define void @_Z8FuncTestv() {
entry:
%a = alloca i32*, align 4
%b = alloca i32*, align 4
%call = call noalias i8* @_Znwj(i32 4)
%0 = bitcast i8* %call to i32*
store i32* %0, i32** %a, align 4
%call1 = call noalias i8* @_Znaj(i32 8)
%1 = bitcast i8* %call1 to i32*
store i32* %1, i32** %b, align 4
ret void
}

declare noalias i8* @_Znwj(i32)
declare noalias i8* @_Znaj(i32)

我现在想知道的是: _Znwj 在哪里?和 _Znaj符号从何而来?他们是随机分配的还是有一个系统?我希望能够说出以下几行:
%call = call noalias i8* @_Znwj(i32 4)


%call1 = call noalias i8* @_Znaj(i32 8)

执行内存分配。但它看起来并不那么有希望。

这里的一些 llvm 专家有想法吗?

最佳答案

您看到的是运算符的 C++ 混淆名称。使用 abi::__cxa_demangle 破坏符号,或建立一个重整符号表。 new/delete 运算符可能会被重载,因此符号不是常量。 Demangling 可能是最安全的选择。

这是通过 c++filt 管道传输的函数,后者又使用 abi::__cxa_demangle :

定义无效@FuncTest()() {
入口:
%a = alloca i32*,对齐 4
%b = alloca i32*,对齐 4
%call = call noalias i8* @operator new(unsigned int)(i32 4)
%0 = bitcast i8* %call 到 i32*
存储 i32* %0,i32** %a,对齐 4
%call1 = 调用 noalias i8* @operator new[](unsigned int)(i32 8)
%1 = bitcast i8* %call1 到 i32*
存储 i32* %1,i32** %b,对齐 4
返回无效
}

声明 noalias i8* @operator new(unsigned int)(i32)
声明 noalias i8* @operator new[](unsigned int)(i32)

关于llvm - 如何在 llvm ir 代码文件中找到所有内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3941666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com