- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 clang 解析的 C++ 源代码,生成 llvm 字节码。从这一点上我想自己处理文件......
但是我遇到了一个问题。考虑以下场景:
- 我创建了一个具有非平凡析构函数或复制构造函数的类。
- 我定义了一个函数,该类的对象作为参数按值(无引用或指针)传递。
在生成的字节码中,我得到了一个指针。对于没有析构函数的类,参数被注释为“byval”,但在这种情况下并非如此。
结果,我无法区分参数是按值传递,还是真的是按指针传递。
考虑以下示例:
输入文件 - cpass.cpp:
class C {
public:
int x;
~C() {}
};
void set(C val, int x) {val.x=x;};
void set(C *ptr, int x) {ptr->x=x;}
clang++ -c cpass.cpp -emit-llvm -o cpass.bc; llvm-dis cpass.bc
; ModuleID = 'cpass.bc'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
%class.C = type { i32 }
define void @_Z3set1Ci(%class.C* %val, i32 %x) nounwind {
%1 = alloca i32, align 4
store i32 %x, i32* %1, align 4
%2 = load i32* %1, align 4
%3 = getelementptr inbounds %class.C* %val, i32 0, i32 0
store i32 %2, i32* %3, align 4
ret void
}
define void @_Z3setP1Ci(%class.C* %ptr, i32 %x) nounwind {
%1 = alloca %class.C*, align 8
%2 = alloca i32, align 4
store %class.C* %ptr, %class.C** %1, align 8
store i32 %x, i32* %2, align 4
%3 = load i32* %2, align 4
%4 = load %class.C** %1, align 8
%5 = getelementptr inbounds %class.C* %4, i32 0, i32 0
store i32 %3, i32* %5, align 4
ret void
}
set
的参数功能看起来完全一样。那么我怎么知道第一个函数是要按值而不是指针来获取参数呢?
extern "C"
怎么办在函数之前?
clang
保留
byval
注释,还是为通过值传递的每个函数参数生成一个额外的注释?
最佳答案
不幸的是,“byval”不仅仅是“注释”,它还是参数属性,这对优化器和后端来说意义重大。基本上,如何传递带有和不带有非平凡函数的小结构/类的规则是由平台 C++ ABI 管理的,所以你不能总是在这里使用 byval。
其实这里的byval只是前端层面小幅优化的结果。当您按值传递内容时,应在堆栈上构造临时对象(通过默认复制构造函数)。当您有一个类似于 POD 的类时,clang 可以推断出复制 ctor 将是微不足道的,并将优化 ctor/dtor 对,只传递“内容”。
对于非平凡的类(如您的情况),clang 无法执行此类优化,必须同时调用 ctor 和 dtor。因此,您会看到创建了指向临时对象的指针。
尝试调用您的 set() 函数,您会看到那里发生了什么。
关于llvm - 从 clang : 'byval' attribute for passing objects with nontrivial destructor into a function 发出 llvm 字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6549623/
我是一名优秀的程序员,十分优秀!