Je vais apporter mon grain de sel à cette question et suggérer une extension légèrement plus verbeuse de la réponse d'Elias. A partir de gcc 4.6, l'exécution de gcc -march=native -v -E - < /dev/null
émet une quantité croissante de spam sous la forme de messages superflus. -mno-*
drapeaux. Ce qui suit va les supprimer :
gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'
Cependant, je n'ai vérifié l'exactitude de ceci que sur deux CPU différents (un Intel Core2 et un AMD Phenom), donc je suggère d'exécuter également le script suivant pour être sûr que tous ces -mno-*
peuvent être dépouillés en toute sécurité.
2021 EDIT : Il existe en effet des machines où -march=native
utilise un -march
valeur, mais doit désactiver certaines ISA (Instruction Set Architecture) implicites avec -mno-*
.
#!/bin/bash
gcc_cmd="gcc"
# Optionally supply path to gcc as first argument
if (($#)); then
gcc_cmd="$1"
fi
with_mno=$(
"${gcc_cmd}" -march=native -mtune=native -v -E - < /dev/null 2>&1 |
grep cc1 |
perl -pe 's/^.* - //g;'
)
without_mno=$(echo "${with_mno}" | perl -pe 's/ -mno-\S+//g;')
"${gcc_cmd}" ${with_mno} -dM -E - < /dev/null > /tmp/gcctest.a.$$
"${gcc_cmd}" ${without_mno} -dM -E - < /dev/null > /tmp/gcctest.b.$$
if diff -u /tmp/gcctest.{a,b}.$$; then
echo "Safe to strip -mno-* options."
else
echo
echo "WARNING! Some -mno-* options are needed!"
exit 1
fi
rm /tmp/gcctest.{a,b}.$$
Je n'ai pas trouvé de différence entre gcc -march=native -v -E - < /dev/null
y gcc -march=native -### -E - < /dev/null
à part certains paramètres qui sont cités - et les paramètres qui ne contiennent pas de caractères spéciaux, donc je ne suis pas sûr dans quelles circonstances cela fait une réelle différence.
Enfin, notez que --march=native
a été introduit dans gcc 4.2, avant quoi il s'agissait simplement d'un argument non reconnu.