GCC LTO effectue-t-il l'élimination du code mort entre fichiers ?
Question
Dis que j'ai une fonction
void do_something() {
//....
#ifdef FEATURE_X
feature_x();
#endif
//....
}
Je peux compiler et exécuter ceci sans problème ;si je veux la fonctionnalité, je peux passer -D FEATURE_X
et il fonctionne.
Cependant, que se passe-t-il si je souhaite mettre do_something
dans un autre fichier (et je n'ai pas besoin de recompiler ce fichier également à chaque fois que je décide de modifier l'option).Si c'était dans le même fichier, je suppose que
const int FEATURE_X=0;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
utilisera correctement l'élimination du code mort, éliminant ainsi l'appel.Si je mets ça dans un autre fichier, sans LTO,
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
Il ne supprimera pas le code (il n’a aucun moyen de le savoir).Ainsi, avec l'optimisation du temps de liaison activée, le compilateur peut-il détecter la valeur de FEATURE_X
au moment de la liaison, déterminer si le code est utilisé ou non et le supprimer le cas échéant ?
La solution
GCC supprime les fonctions inaccessibles des modules croisés, mais il ne sera pas en mesure de déterminer que le code est mort dans votre dernier scénario de test, car la valeur constante de FEATURE_X sera déterminée trop tard.
Si vous utilisez la méthode -D ou mettez votre const int FEATURE_X=0;
dans chaque module alors oui, le code sera éliminé.
Autres conseils
Si au lieu du code référencé :
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
et si cela était fait avec une variable de temps de lien comme ceci :
extern const int FEATURE_X;
void do_something() {
//....
if(NULL != &FEATURE_X) {
feature_x();
}
//....
}
Ensuite, dans le fichier d'instructions de l'éditeur de liens, définissez
define exported symbol FEATURE_X = 0x0
Y aurait-il un moyen de l'optimiser au moment de la liaison ?