GCC 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
링크 타임에 코드가 사용되는지 여부를 확인하고 적절한 경우 제거하시겠습니까?
해결책
GCC는 교차 모듈 도달 불가능 함수 제거를 수행하지만 FEATURE_X의 상수 값이 너무 늦게 결정되므로 마지막 테스트 케이스에서 코드가 작동하지 않는지 확인할 수 없습니다.
-D 방식을 사용하거나 const int FEATURE_X=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
.
링크 시간에 그것을 최적화하는 데 어쨌든
제휴하지 않습니다 StackOverflow