j'ai peut-être localisé l'endroit où se trouve le bug dans le code source de llvm 3.7.0 ( je préfère rester très prudent vu les hypothèses erronées

) :
c'est dans le fichier /lib/Support/Host.cpp
c'est là dedans que se trouve la fonction qui retourne le type de CPU, la classe "sys" qui a une fonction "getHostCPUName()'
un processeur est défini par une valeur "family", puis par son model et son stepping, dans dmesg je peux lire ça :
Code : Tout sélectionner
Intel Pentium(R) Dual-Core CPU E6800 @ 3.33GHz (fam: 06, model: 17, stepping: 0a)
donc c'est la famille "6" et le modèle 17, dans cette fonction getHostCPUName() le développeur determine la valeur "family", puis la valeur "model" à l'aide de la fonction DetectX86FamilyModel(), et fait ensuite un énorme "switch/case" imbriqué ( d'abord un switch sur "family" et dedans un switch sur le model ), il retourne ensuite un string ( Penryn, core2 etc... ) selon les combinaisons family/model,
il est possible qu'il ait merdé là dedans, en comparant avec la version 3.6.2 du fichier Host.cpp je vois qu'il y a des différences subtiles,
le code source de la version 3.6.2 est dispo ici :
http://llvm.org/releases/3.6.2/llvm-3.6.2.src.tar.xz
la 3.7.0 ici :
http://llvm.org/releases/3.7.0/llvm-3.7.0.src.tar.xz
ce serait bien si on pouvait trouver ensemble ce qui cloche dans la version 3.7.0 de ce fichier, afin qu'on puisse poster le patch sur le site de llvm, je sens qu'on est sur une très bonne piste,
je vais essayer de trouver des différences entre les 2 versions de ce fichier, puis modifier une ligne,
je vais aussi créer une version debug de llvm afin d'utiliser un débogueur pour y mettre des points d'arrêt dans cette fonction getHostCPUName() afin de vérifier le contenu de certaines variables, ça m'aidera à comprendre les choses,
rapidement vu comme ça ( j'ai pas encore débogué ) son switch/case est conçu bizarrement, il n'a pas mis tous les cas de figures pour le model ( les case xx ), il manque le case "17" de la family "6", ce qui fait qu'on passe par "default:" où il fait des tests sur "HasSSE41", si oui alors il retourne "Penryn" comme valeur
Code : Tout sélectionner
default: // Unknown family 6 CPU, try to guess.
if (HasAVX512)
return "knl";
if (HasADX)
return "broadwell";
if (HasAVX2)
return "haswell";
if (HasAVX)
return "sandybridge";
if (HasSSE42)
return HasMOVBE ? "silvermont" : "nehalem";
if (HasSSE41)
return "penryn";
if (HasSSSE3)
return HasMOVBE ? "bonnell" : "core2";
if (Em64T)
return "x86-64";
if (HasSSE2)
return "pentium-m";
if (HasSSE)
return "pentium3";
if (HasMMX)
return "pentium2";
return "pentiumpro";
}
le booléen HasSSE41 est défini comme ça dans la version 3.6.2 :
dans la version 3.7.0 c'est différent :
il faudrait comprendre si ce changement est cohérent ou bien s'il conduit à une valeur erronée ( je suis pas très fort en décalage de bits )
une solution de facilité serait d'ajouter manuellement le "case 17 : return "core2";" dans le switch de la family 6, je verrai ça demain à tête reposée si mes hypothèses sont bonnes