提问者:小点点

如何在clang中禁用自动“通过指针”优化?


我有个功能

void X(Object o)
{
 ....
}

当我编译它时,我看到,叮当声将其签名更改为

void X(Object* o)

不方便,因为我直接从一些llvm编译器编译器IR代码中使用这个函数。如何禁止它做这个优化?

编辑:最小工作示例:

#include <stdio.h>

class Object
{
public:
    Object();
    ~Object();
    int* pointer;
};

void Function(Object o)
{
    o.pointer = 0;
}

int main()
{
    Object a;
    Function(a);
    return 0;
}

通过以下命令行:

clang++ tst.cpp -emit-llvm -O0 tst.cpp -S -std=c++11

Function翻译成:

define void @_Z8Function6Object(%class.Object* %o) nounwind uwtable {
  %1 = getelementptr inbounds %class.Object* %o, i32 0, i32 0
  store i32* null, i32** %1, align 8
  ret void
}

共1个答案

匿名用户

您需要添加选项-mdisable-fp-elim

禁用帧指针消除优化。

在这里我找到了这个选项:clang选项

这里我很好地解释了clang为什么这样做:理解选项'省略帧指针'

*编辑:*

经过一番检查,我发现:

  • 您的对象在编译后正确通过副本传递:

例子:

#include <stdio.h>
#include <iostream>

class Object
{
public:
    std::string test;
    Object() {
    this->test = "I'm an object";
    std::cout << "Object created" << std::endl;
    }
    Object(Object &o) {
    this->test = "I'm a object copy";
    std::cout << "Object copy created" << std::endl;    
}
    ~Object() {
}
    int* pointer;
};

void Function(Object o)
{
    o.pointer = 0;
    std::cout << o.test << std::endl;
}

int main()
{
    Object a;
    Function(a);
    std::cout << a.test << std::endl;
    return 0;
}

输出:

对象创建

创建对象副本

我是实物复制

我是一个物体

  • 第二点:

您可以在函数原型之后看到

; Function Attrs: uwtable
define void @_Z8Function6Object(%class.Object* %o) #3 {
  %1 = getelementptr inbounds %class.Object* %o, i32 0, i32 1 // Get 
  store i32* null, i32** %1, align 8

该函数获取对象的副本。您可以在main中看到对象的副本

所以你的代码实际上似乎工作得很好;)