Saat ini saya tertarik pada ARM pada umumnya dan secara khusus target iphone / android. Tapi saya hanya ingin tahu lebih banyak tentang dentang, karena dentang rasanya memainkan peran penting di tahun-tahun mendatang.
Saya mencoba
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)
Saya tahu clang memiliki parameter -triplet, tetapi bagaimana cara mencantumkan semua kemungkinan nilai untuk itu? Saya menemukan bahwa clang sangat berbeda dengan gcc dalam hal kompilasi silang, di dunia GCC Anda harus memiliki biner terpisah untuk semuanya, seperti PLATFORM_make atau PLATFORM_ld (i * 86-pc-cygwin i * 86 - * - linux-gnu dll. Http : //git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS )
di dunia dentang, itu hanya satu biner (seperti yang saya baca di beberapa forum). Tetapi bagaimana cara mendapatkan daftar target yang didukung? Dan jika target saya tidak mendukung distro saya (linux / windows / macos / apa saja) bagaimana saya bisa mendapatkan yang mendukung lebih banyak platform?
kalau saya SVN dentang terbaru seperti ini:
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
apakah saya akan mendapatkan sebagian besar platform? Sepertinya Clang tidak langsung dibuat dengan kompilasi silang, tetapi karena ini berbasis llvm, maka seharusnya sangat ramah silang secara teori? Terima kasih!
Jawaban:
Sejauh yang saya tahu, tidak ada opsi baris perintah untuk mendaftar arsitektur mana yang
clang
didukung biner tertentu , dan bahkan menjalankannyastrings
tidak terlalu membantu. Clang pada dasarnya hanyalah penerjemah C ke LLVM, dan LLVM sendirilah yang menangani seluk-beluk pembuatan kode mesin yang sebenarnya, jadi tidak mengherankan jika Clang tidak terlalu memperhatikan arsitektur yang mendasarinya.Seperti yang telah dicatat orang lain, Anda dapat menanyakan
llc
arsitektur mana yang didukungnya. Ini tidak terlalu membantu bukan hanya karena komponen LLVM ini mungkin tidak diinstal, tetapi karena berbagai jalur pencarian dan sistem pengemasan, binari Andallc
danclang
mungkin tidak sesuai dengan versi LLVM yang sama.Namun, demi argumen, katakanlah Anda mengumpulkan LLVM dan Clang sendiri atau Anda senang menerima biner LLVM Anda sebagai cukup baik:
llc --version
akan memberikan daftar semua arsitektur yang didukungnya. Secara default, ini dikompilasi untuk mendukung semua arsitektur. Apa yang Anda anggap sebagai arsitektur tunggal seperti ARM mungkin memiliki beberapa arsitektur LLVM seperti ARM biasa, Thumb, dan AArch64. Ini terutama untuk kenyamanan implementasi karena mode eksekusi yang berbeda memiliki pengkodean dan semantik instruksi yang sangat berbeda.llc -march=ARCH -mattr=help
akan mencantumkan "CPU yang tersedia" dan "fitur yang tersedia". CPU umumnya hanyalah cara mudah untuk mengatur kumpulan fitur default.Tapi sekarang untuk kabar buruknya. Tidak ada tabel tripel yang nyaman di Clang atau LLVM yang dapat dibuang, karena backend khusus arsitektur memiliki opsi untuk mengurai string tripel menjadi
llvm::Triple
objek (didefinisikan di include / llvm / ADT / Triple.h ). Dengan kata lain, untuk membuang semua tripel yang tersedia membutuhkan pemecahan Masalah Halting. Lihat, misalnya,llvm::ARM_MC::ParseARMTriple(...)
kasus khusus mana yang mengurai string"generic"
.Pada akhirnya, "triple" sebagian besar merupakan fitur kompatibilitas mundur untuk menjadikan Clang sebagai pengganti drop-in untuk GCC, jadi Anda biasanya tidak perlu terlalu memperhatikannya kecuali Anda mem-porting Clang atau LLVM ke platform baru atau arsitektur. Alih-alih, Anda mungkin akan menemukan output
llc -march=arm -mattr=help
dan kebingungan pada beragam fitur ARM yang berbeda untuk menjadi lebih berguna dalam penyelidikan Anda.Semoga berhasil dengan penelitian Anda!
sumber
Saya menggunakan Clang 3.3, saya pikir cara terbaik untuk mendapatkan jawabannya adalah dengan membaca kode sumber. di llvm / ADT / Triple.h ( http://llvm.org/doxygen/Triple_8h_source.html ):
dan di clang / lib / Driver / ToolChains.cpp, ada sth tentang arm.
sumber
static Triple::ArchType parseArch(StringRef ArchName)
Satu petunjuk yang dapat Anda lakukan: jika Anda mencoba menemukan target triple tertentu, adalah menginstal llvm pada sistem itu, lalu lakukan a
atau sebagai alternatif:
Kemudian Anda tahu cara menargetkannya saat melakukan kompilasi silang.
Rupanya ada "banyak" target di luar sana, berikut daftarnya, silakan tambahkan ke dalamnya, gaya wiki komunitas:
Inilah yang docs daftar tetap (rupanya itu quadruple [atau berlipat lima?] Bukannya tiga hari ini):
dan Anda bahkan dapat menyempurnakan menentukan cpu target di luar ini, meskipun ia menggunakan default yang masuk akal untuk cpu target berdasarkan triple.
Terkadang target "menyelesaikan" hal yang sama, jadi untuk melihat apa sebenarnya target diperlakukan sebagai:
sumber
mingw32
apakah itu berarti itu tidak akan berfungsi dengan MinGW64? Apakah ada sesuatu yang Kompatibel dengan MSVC?Menurut Jonathan Roelofs dalam pembicaraan ini, "Target mana yang didukung Clang?" :
Versi Clang yang akan datang mungkin menyediakan yang berikut ini. Mereka terdaftar sebagai "diusulkan" meskipun belum tersedia setidaknya pada v 3.9.0:
sumber
Juga coba
sumber
-mtriple
opsi seperti dillc -mtriple=arm -mattr=help
.Memulai Clang 11 (trunk), daftar arsitektur target yang didukung dapat dengan mudah dicetak menggunakan
-print-targets
flag yang baru ditambahkan :Referensi: LLVM PR , LLVM commit , dokumentasi Clang 11 .
sumber
Itu tidak akan mencantumkan semua tripel, tapi
setidaknya akan mencantumkan semua CPU.
sumber
Jika Anda tertarik pada target mana yang didukung untuk membangun LLVM atau Clang dari sumber (nilai untuk
-DLLVM_TARGETS_TO_BUILD
), cari daftar subdirektori dillvm/lib/Target
folder dalam distribusi sumber. Mulai 9.0.1 ada:sumber