Actualmente estoy interesado en ARM en general y específicamente en los objetivos de iPhone / Android. Pero solo quiero saber más sobre clang, ya que parece que jugará un papel importante en los próximos años.
Lo intenté
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)
Sé que clang tiene el parámetro -triplet, pero ¿cómo puedo enumerar todos los valores posibles para él? Descubrí que clang es muy diferente a gcc con respecto a la compilación cruzada, en el mundo de GCC deberías tener binarios separados para todo, como PLATFORM_make o PLATFORM_ld (i * 86-pc-cygwin i * 86 - * - linux-gnu etc. http : //git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS )
en el mundo clang, es solo un binario (como leí en algunos foros). Pero, ¿cómo obtengo la lista de objetivos admitidos? Y si mi objetivo no es compatible con mi distribución (linux / windows / macos / lo que sea), ¿cómo puedo obtener el que admita más plataformas?
si el último sonido de SVN es como este:
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
¿Obtendré la mayoría de las plataformas? Parece que Clang no se creó con la compilación cruzada en mente de inmediato, pero dado que está basado en llvm, ¿debería ser muy compatible con las cruzas en teoría? ¡gracias!
Respuestas:
Por lo que puedo decir, no hay una opción de línea de comandos para enumerar qué arquitecturas
clang
admite un binario dado , e incluso ejecutarlostrings
no ayuda realmente. Clang es esencialmente un traductor de C a LLVM, y es LLVM en sí mismo el que se ocupa de la esencia de generar código de máquina real, por lo que no es del todo sorprendente que Clang no esté prestando mucha atención a la arquitectura subyacente.Como ya han señalado otros, puede preguntar
llc
qué arquitecturas admite. Esto no es tan útil no solo porque estos componentes de LLVM pueden no estar instalados, sino debido a los caprichos de las rutas de búsqueda y los sistemas de empaquetado, es posible que sus binariosllc
yclang
no correspondan a la misma versión de LLVM.Sin embargo, por el bien de la discusión, digamos que compiló LLVM y Clang usted mismo o que, por lo demás, está feliz de aceptar sus binarios LLVM como lo suficientemente buenos:
llc --version
le dará una lista de todas las arquitecturas que admite. De forma predeterminada, está compilado para admitir todas las arquitecturas. Lo que puede considerar como una arquitectura única, como ARM, puede tener varias arquitecturas LLVM, como ARM normal, Thumb y AArch64. Esto se debe principalmente a la conveniencia de la implementación porque los diferentes modos de ejecución tienen codificaciones de instrucción y semánticas muy diferentes.llc -march=ARCH -mattr=help
se enumerarán "CPU disponibles" y "funciones disponibles". Las CPU generalmente son solo una forma conveniente de configurar una colección predeterminada de funciones.Pero ahora las malas noticias. No hay una tabla conveniente de triples en Clang o LLVM que se pueda volcar, porque los backends específicos de la arquitectura tienen la opción de analizar la cadena triple en un
llvm::Triple
objeto (definido en include / llvm / ADT / Triple.h ). En otras palabras, deshacerse de todos los triples disponibles requiere resolver el problema de detención. Vea, por ejemplo,llvm::ARM_MC::ParseARMTriple(...)
qué casos especiales analizan la cadena"generic"
.Sin embargo, en última instancia, el "triple" es principalmente una función de compatibilidad con versiones anteriores para hacer de Clang un reemplazo directo de GCC, por lo que generalmente no necesita prestarle mucha atención a menos que esté portando Clang o LLVM a una nueva plataforma. o arquitectura. En cambio, probablemente encontrará la salida de
llc -march=arm -mattr=help
y la confusión de la enorme variedad de funciones ARM diferentes le serán más útiles en sus investigaciones.¡Buena suerte con tu investigación!
fuente
Estoy usando Clang 3.3, creo que la mejor manera de obtener la respuesta es leyendo el código fuente. en llvm / ADT / Triple.h ( http://llvm.org/doxygen/Triple_8h_source.html ):
y en clang / lib / Driver / ToolChains.cpp, hay algo sobre arm.
fuente
static Triple::ArchType parseArch(StringRef ArchName)
Una pista que puede hacer: si está tratando de encontrar un triple objetivo en particular, es instalar llvm en ese sistema y luego hacer un
o alternativamente:
Entonces sabrá cómo orientarlo al realizar la compilación cruzada de todos modos.
Aparentemente, hay "muchos" objetivos por ahí, aquí hay una lista, siéntase libre de agregarla, estilo wiki comunitario:
Esto es lo que enumeran los documentos de todos modos (aparentemente es un cuádruple [¿o quintuple?] En lugar de un triple en estos días):
e incluso puede ajustar la especificación de una cpu de destino más allá de esto, aunque utiliza un valor predeterminado sensato para la cpu de destino basado en el triple.
A veces, los objetivos "resuelven" lo mismo, por lo que para ver cómo se trata realmente a un objetivo:
fuente
mingw32
que significa que no funcionará con MinGW64? ¿Hay algo que sea compatible con MSVC?Según Jonathan Roelofs en esta charla "¿Qué objetivos admite Clang?" :
Las versiones futuras de Clang pueden proporcionar lo siguiente. Se enumeran como "propuestos", aunque aún no están disponibles al menos a partir de la versión 3.9.0:
fuente
Intenta también
fuente
-mtriple
opción como enllc -mtriple=arm -mattr=help
.A partir de Clang 11 (troncal), la lista de arquitecturas de destino admitidas podría imprimirse cómodamente utilizando la
-print-targets
bandera recién agregada :Referencias: LLVM PR , LLVM commit , documentación de Clang 11 .
fuente
No enumerará todos los triples, pero
al menos enumerará todas las CPU.
fuente
En caso de que esté interesado en qué destinos son compatibles con la creación de LLVM o Clang desde la fuente (los valores para
-DLLVM_TARGETS_TO_BUILD
), busque la lista de subdirectorios en lallvm/lib/Target
carpeta en la distribución de la fuente. A partir de la versión 9.0.1 existen:fuente