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

时间:2014-07-01 12:44:38

标签: c++ clang compiler-optimization clang++ llvm-clang

我有一个功能

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

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

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 个答案:

答案 0 :(得分:2)

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

  

禁用帧指针消除优化。

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

我在这里解释为什么clang这样做:understand option 'omit frame pointer'

*编辑:*

经过一番检查,我发现了这个:

  • 您的对象在合并后正确传递:

示例:

#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中看到对象的副本

所以你的代码实际上似乎运行良好;)