Actuellement, je m'intéresse à ARM en général et plus particulièrement aux cibles iphone / android. Mais je veux juste en savoir plus sur clang, car il semble jouer un rôle important dans les années à venir.
j'ai essayé
clang -cc1 --help|grep -i list
clang -cc1 --help|grep arch|grep -v search
clang -cc1 --help|grep target
-triple <value> Specify target triple (e.g. i686-apple-darwin9)
Je sais que clang a le paramètre -triplet, mais comment puis-je lister toutes les valeurs possibles? J'ai trouvé que clang est très différent de gcc en ce qui concerne la compilation croisée, dans le monde GCC, vous devriez avoir un binaire séparé pour tout, comme PLATFORM_make ou PLATFORM_ld (i * 86-pc-cygwin i * 86 - * - linux-gnu etc. http : //git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS )
dans le monde clang, ce n'est qu'un seul binaire (comme je l'ai lu sur certains forums). Mais comment obtenir la liste des cibles prises en charge? Et si ma cible n'est pas prise en charge sur ma distribution (linux / windows / macos / peu importe), comment puis-je obtenir celle qui prend en charge plus de plate-forme?
si je SVN dernier clang comme ceci:
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
vais-je obtenir la plupart des plates-formes? Il semble que Clang n'a pas été construit avec la compilation croisée à l'esprit tout de suite, mais comme il est basé sur llvm, il devrait être très convivial en théorie? Merci!
Réponses:
Pour autant que je sache, il n'y a pas d'option de ligne de commande pour lister les architectures
clang
prises en charge par un binaire donné , et même fonctionnerstrings
dessus n'aide pas vraiment. Clang n'est essentiellement qu'un traducteur C vers LLVM, et c'est LLVM lui-même qui traite de l'essentiel de la génération de code machine réel, il n'est donc pas tout à fait surprenant que Clang ne prête pas beaucoup d'attention à l'architecture sous-jacente.Comme d'autres l'ont déjà noté, vous pouvez demander
llc
quelles architectures il prend en charge. Ce n'est pas si utile non seulement parce que ces composants LLVM peuvent ne pas être installés, mais en raison des caprices des chemins de recherche et des systèmes d'empaquetage, votrellc
et vosclang
binaires peuvent ne pas correspondre à la même version de LLVM.Cependant, pour des raisons d'argumentation, disons que vous avez compilé vous-même LLVM et Clang ou que vous êtes par ailleurs heureux d'accepter vos binaires LLVM comme assez bons:
llc --version
donnera une liste de toutes les architectures prises en charge. Par défaut, il est compilé pour prendre en charge toutes les architectures. Ce que vous pouvez considérer comme une architecture unique telle que ARM peut avoir plusieurs architectures LLVM telles que ARM standard, Thumb et AArch64. C'est principalement pour faciliter la mise en œuvre car les différents modes d'exécution ont des codages d'instructions et une sémantique très différents.llc -march=ARCH -mattr=help
listera les «CPU disponibles» et les «fonctionnalités disponibles». Les processeurs ne sont généralement qu'un moyen pratique de définir une collection de fonctionnalités par défaut.Mais maintenant pour les mauvaises nouvelles. Il n'y a pas de table pratique de triplets dans Clang ou LLVM qui peuvent être vidés, car les backends spécifiques à l'architecture ont la possibilité d'analyser la triple chaîne dans un
llvm::Triple
objet (défini dans include / llvm / ADT / Triple.h ). En d'autres termes, pour vider tous les triplets disponibles, il faut résoudre le problème d'arrêt. Voir, par exemple,llvm::ARM_MC::ParseARMTriple(...)
quels cas spéciaux analysent la chaîne"generic"
.En fin de compte, cependant, le «triple» est principalement une fonctionnalité de compatibilité ascendante pour faire de Clang un remplaçant de GCC, vous n'avez donc généralement pas besoin d'y prêter beaucoup d'attention à moins que vous ne portiez Clang ou LLVM sur une nouvelle plate-forme ou l'architecture. Au lieu de cela, vous trouverez probablement la sortie
llc -march=arm -mattr=help
et la stupéfaction de l'énorme éventail de fonctionnalités ARM différentes pour être plus utiles dans vos enquêtes.Bonne chance dans vos recherches!
la source
J'utilise Clang 3.3, je pense que la meilleure façon d'obtenir la réponse est de lire le code source. dans llvm / ADT / Triple.h ( http://llvm.org/doxygen/Triple_8h_source.html ):
et dans clang / lib / Driver / ToolChains.cpp, il y a qqch sur arm.
la source
static Triple::ArchType parseArch(StringRef ArchName)
Un conseil que vous pouvez faire: si vous essayez de trouver un triplet cible particulier, installez llvm sur ce système, puis effectuez un
Ou bien:
Ensuite, vous savez comment le cibler lors de la compilation croisée de toute façon.
Apparemment, il y a "beaucoup" de cibles là-bas, voici une liste, n'hésitez pas à y ajouter, style wiki communautaire:
Voici ce que la documentation liste de toute façon (apparemment, c'est un quadruple [ou quintuple?] Au lieu d'un triple ces jours-ci):
et vous pouvez même affiner la spécification d'un processeur cible au-delà de cela, bien qu'il utilise une valeur par défaut raisonnable pour le processeur cible basé sur le triple.
Parfois, les cibles «résolvent» la même chose, donc pour voir à quoi une cible est réellement traitée:
la source
mingw32
cela signifie que cela ne fonctionnera pas avec MinGW64? Y a-t-il quelque chose qui est compatible MSVC?Selon Jonathan Roelofs dans cette conférence, «Quels objectifs Clang soutient-il?» :
Les futures versions de Clang peuvent fournir les éléments suivants. Ils sont répertoriés comme "proposés" mais pas encore disponibles au moins à partir de la version 3.9.0:
la source
Essayez aussi
la source
-mtriple
option comme dansllc -mtriple=arm -mattr=help
.Il ne listera pas tous les triples, mais
listera au moins tous les processeurs.
la source
À partir de Clang 11 (trunk), la liste des architectures cibles prises en charge peut être imprimée à l'aide du
-print-targets
drapeau nouvellement ajouté :Références: LLVM PR , LLVM commit , documentation Clang 11 .
la source
Dans le cas où vous êtes intéressé par les cibles prises en charge pour la construction de LLVM ou Clang à partir de la source (les valeurs pour
-DLLVM_TARGETS_TO_BUILD
), recherchez la liste des sous-répertoires dans lellvm/lib/Target
dossier de la distribution source. Depuis la version 9.0.1, il y a:la source