GCC LTO是否执行跨文件死代码消除?

时间:2012-10-03 19:16:14

标签: gcc dead-code lto

说我有一个功能

void do_something() {
    //....
    #ifdef FEATURE_X
        feature_x();
    #endif
    //....
}

我可以编译并运行它没有任何问题;如果我想要这个功能,我可以通过-D FEATURE_X并且它可以正常工作。

但是,如果我想将do_something放入另一个文件(并且每次我决定更改选项时也不必重新编译该文件)该怎么办?如果它在同一个文件中,我认为

const int FEATURE_X=0;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

将正确使用死代码消除,取消呼叫。如果我把它放在另一个文件中,没有LTO,

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

它不会删除代码(它无法知道)。因此,在启用链接时优化的情况下,编译器是否可以在链接时检测FEATURE_X的值,确定是否使用了代码,并在适当的情况下将其删除?

2 个答案:

答案 0 :(得分:7)

GCC会交叉模块无法访问功能删除,但它无法确定代码在最后一个测试用例中是否已死,因为FEATURE_X的常量值将被确定得太晚。

如果您将使用-D方式或将const int FEATURE_X=0;放入每个模块,那么是,代码将被删除。

答案 1 :(得分:0)

如果不是引用的代码:

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

如果使用链接时间变量如此完成该怎么做:

extern const int FEATURE_X;

void do_something() {
    //....
    if(NULL != &FEATURE_X) {
        feature_x();
    }
    //....
}

然后在链接器指令文件中定义

define exported symbol FEATURE_X = 0x0

无论如何都会在链接时优化它吗?