¿GCC LTO realizar cross-archivo de la eliminación de código muerto?
Pregunta
Decir que tengo una función
void do_something() {
//....
#ifdef FEATURE_X
feature_x();
#endif
//....
}
Puedo compilar y ejecutar este sin problemas;si desea que la función que me puede pasar -D FEATURE_X
y funciona.
Sin embargo, lo que si me gustaría poner do_something
en otro archivo (Y no tener que volver a compilar el archivo así cada vez que me decido a cambiar la opción).Si fue en el mismo archivo, supongo que
const int FEATURE_X=0;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
utilizará la eliminación de código muerto adecuadamente, eliminando la llamada.Si pongo esto en otro archivo, sin LTO,
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
No va a eliminar el código (Que no tiene manera de saber).Así, con enlace optimización del tiempo permitido, puede que el compilador detecte el valor de FEATURE_X
en el momento de enlazar, determinar si el código es utilizado o no, y quitarlo si es apropiado?
Solución
GCC cruza módulo inalcanzable función de eliminación, pero no será capaz de determinar el código está muerto en su última prueba, debido a que el valor de la constante de FEATURE_X será determinado demasiado tarde.
Si va a utilizar -D camino o poner su const int FEATURE_X=0;
en cada módulo, a continuación, sí, el código será eliminado.
Otros consejos
Si en lugar de la que se hace referencia código:
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
lo que si fue hecho con un vínculo de tiempo variable así:
extern const int FEATURE_X;
void do_something() {
//....
if(NULL != &FEATURE_X) {
feature_x();
}
//....
}
A continuación, en el enlace de archivo de instrucciones, definir
define exported symbol FEATURE_X = 0x0
Habrá de todos modos para optimizar en tiempo de vínculo?