Obecnie interesuje mnie ogólnie ARM, a konkretnie cele dla iPhone / Android. Ale chcę tylko dowiedzieć się więcej o clang, ponieważ wydaje mi się, że będzie odgrywał ważną rolę w nadchodzących latach.
próbowałem
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)
Wiem, że clang ma parametr -triplet, ale jak mogę wymienić wszystkie możliwe jego wartości? Odkryłem, że clang bardzo różni się od gcc pod względem kompilacji krzyżowej, w świecie GCC powinieneś mieć osobny plik binarny dla wszystkiego, taki jak PLATFORM_make lub PLATFORM_ld (i * 86-pc-cygwin i * 86 - * - linux-gnu itp. Http : //git.savannah.gnu.org/cgit/libtool.git/tree/doc/PLATFORMS )
w świecie clang jest to tylko jeden plik binarny (jak czytałem na niektórych forach). Ale jak uzyskać listę obsługiwanych celów? A jeśli mój cel nie jest obsługiwany w mojej dystrybucji (linux / windows / macos / cokolwiek), jak mogę uzyskać taką, która obsługuje więcej platform?
jeśli ostatnio SVN brzmi tak:
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
czy dostanę większość platform? Wygląda na to, że Clang nie został od razu zbudowany z myślą o kompilacji krzyżowej, ale skoro jest oparty na llvm, w teorii powinien być bardzo przyjazny dla krzyżowych? Dziękuję Ci!
Odpowiedzi:
O ile wiem, nie ma opcji wiersza poleceń, aby wyświetlić listę architektur
clang
obsługiwanych przez dany plik binarny, a nawet uruchomieniestrings
na nim nie pomaga. Clang jest w zasadzie tylko tłumaczem z C na LLVM, a sam LLVM zajmuje się podstawami generowania rzeczywistego kodu maszynowego, więc nie jest całkowicie zaskakujące, że Clang nie zwraca zbytniej uwagi na podstawową architekturę.Jak inni już zauważyli, możesz zapytać,
llc
które architektury obsługuje. Nie jest to wcale takie pomocne, nie tylko dlatego, że te komponenty LLVM mogą nie być zainstalowane, ale z powodu kaprysów ścieżek wyszukiwania i systemów pakowania, twojellc
iclang
pliki binarne mogą nie odpowiadać tej samej wersji LLVM.Jednak ze względu na argumentację, powiedzmy, że skompilowałeś zarówno LLVM, jak i Clang, lub że w inny sposób z przyjemnością akceptujesz swoje pliki binarne LLVM jako wystarczająco dobre:
llc --version
wyświetli listę wszystkich obsługiwanych architektur. Domyślnie jest kompilowany do obsługi wszystkich architektur. To, co możesz pomyśleć jako pojedyncza architektura, taka jak ARM, może mieć kilka architektur LLVM, takich jak zwykłe ARM, Thumb i AArch64. Dzieje się tak głównie dla wygody implementacji, ponieważ różne tryby wykonywania mają bardzo różne kodowanie instrukcji i semantykę.llc -march=ARCH -mattr=help
listę „dostępne procesory” i „dostępne funkcje”. Procesory są ogólnie po prostu wygodnym sposobem ustawiania domyślnego zbioru funkcji.Ale teraz zła wiadomość. Nie ma wygodnej tabeli trójek w Clang lub LLVM, którą można zrzucić, ponieważ backendy specyficzne dla architektury mają opcję parsowania potrójnego ciągu do
llvm::Triple
obiektu (zdefiniowanego w include / llvm / ADT / Triple.h ). Innymi słowy, zrzucenie wszystkich dostępnych trójek wymaga rozwiązania problemu zatrzymania. Zobacz na przykład,llvm::ARM_MC::ParseARMTriple(...)
które przypadki specjalne analizują ciąg"generic"
.Ostatecznie jednak „potrójna” jest głównie funkcją zgodności wstecznej, dzięki której Clang jest bezpośrednim zamiennikiem GCC, więc generalnie nie musisz zwracać na to większej uwagi, chyba że przenosisz Clang lub LLVM na nową platformę lub architektura. Zamiast tego prawdopodobnie okaże się, że wyniki
llc -march=arm -mattr=help
wielu różnych funkcji ARM będą bardziej przydatne w twoich badaniach.Powodzenia w twoich badaniach!
źródło
Używam Clang 3.3, myślę, że najlepszym sposobem uzyskania odpowiedzi jest przeczytanie kodu źródłowego. w llvm / ADT / Triple.h ( http://llvm.org/doxygen/Triple_8h_source.html ):
aw clang / lib / Driver / ToolChains.cpp jest coś o arm.
źródło
static Triple::ArchType parseArch(StringRef ArchName)
Jedna wskazówka, którą możesz zrobić: jeśli próbujesz znaleźć konkretną trójkę docelową, zainstaluj llvm w tym systemie, a następnie wykonaj
lub alternatywnie:
W takim razie wiesz, jak skierować na niego cel podczas kompilacji krzyżowej.
Najwyraźniej istnieje "wiele" celów, oto lista, którą możesz dodać, w stylu wiki społeczności:
Oto lista dokumentów (najwyraźniej jest to czterokrotna [lub pięciokrotna?] Zamiast potrójnej w dzisiejszych czasach):
i możesz nawet precyzyjnie dostroić, określając docelowy procesor poza tym, chociaż używa rozsądnej wartości domyślnej dla docelowego procesora opartego na potrójnym.
Czasami cele „rozwiązują” to samo, więc aby zobaczyć, jaki cel jest faktycznie traktowany:
źródło
mingw32
czy oznacza to, że nie będzie działać z MinGW64? Czy jest coś, co jest kompatybilne z MSVC?Według Jonathana Roelofsa w przemówieniu „Które cele obsługuje Clang?” :
Przyszłe wersje Clang mogą zawierać następujące elementy. Są one wymienione jako „proponowane”, chociaż nie są jeszcze dostępne co najmniej od wersji 3.9.0:
źródło
Spróbuj też
źródło
-mtriple
opcji jak wllc -mtriple=arm -mattr=help
.Począwszy od Clang 11 (trunk), lista obsługiwanych architektur docelowych mogła być łatwo wydrukowana przy użyciu nowo dodanej
-print-targets
flagi:Źródła : LLVM PR , LLVM commit , dokumentacja Clang 11 .
źródło
Nie wymienia wszystkich trójek, ale
przynajmniej wyświetli listę wszystkich procesorów.
źródło
Jeśli interesuje Cię, które cele są obsługiwane przy tworzeniu LLVM lub Clang ze źródła (wartości dla
-DLLVM_TARGETS_TO_BUILD
), poszukaj listy podkatalogów wllvm/lib/Target
folderze w dystrybucji źródłowej. Od 9.0.1 są:źródło