作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图编译这段 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)
最佳答案
您看到的是运算符的 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/
我是一名优秀的程序员,十分优秀!