2013-01-10 11 views
12

Tylko dla pewności: czy platforma LLVM jest wieloplatformowa? Mam na myśli, czy wygenerowany plik IR (".bc") może być rozproszony i zinterpretowany/zinterpretowany przez różne platformy?Blastowa platforma LLVM

Jeśli tak, w jaki sposób Clang przekształca C++ w kod niezależny od platformy? W samym języku C++ preprocesory do określania platformy docelowej są używane przed faktycznym kompilowaniem.

+0

Jeśli obiekt jest całkowicie samowystarczalny, może być interpretowany na innej platformie. Ale ponieważ ABI będzie inny, będzie miał trudności z wykorzystaniem reszty systemu. –

+0

Zakładam, że http://llvm.org/docs/LangRef.html byłoby całkowicie niezależne od platformy. Co masz na myśli mówiąc "czas gry z resztą systemu"? – Tim

+1

@Tim - Czy kod będzie używał wywołań systemu operacyjnego? Jak są przenośne? –

Odpowiedz

17

LLVM IR może być wieloplatformowy, z oczywistymi wyjątkami wymienionymi przez inne. Jednak nie oznacza to, że Clang generuje kod wieloplatformowy. Jak zauważyliście, preprocesor jest prawie powszechnie używany do przekazywania części kodu do kompilatora C/C++, w zależności od platformy. Nawet jeśli nie jest to zrobione w kodzie użytkownika, wiele nagłówków systemowych zawiera trochę lub dwa specyficzne dla platformy, takie jak typedef s. Na przykład, jeśli skompilujesz kod C używając size_t do LLVM IR na platformie, gdzie size_t jest 32-bitowy, LLVM IR używa teraz do tego celu i32, i nie ma sposobu, żebyś mógł to inżynier odwrócić, aby to naprawić.

Projekt Google (Portable Native Client) (dziękuję @willglynn za link), jeśli rozumiem go poprawnie, osiąga mobilność przez ustalenie ABI dla wszystkich docelowych platform. W tym sensie nie rozwiązuje to wyżej wymienionych problemów: LLVM IR nie jest przenośny dla platformy z innym ABI. Jedynym powodem, dla którego jest to bardziej przenośne, jest to, że klienci dostarczają warstwę, która pasuje do ABA PNaCl do rzeczywistego ABI. Innymi słowy, kod PNaCl nie jest przenośny dla wielu platform, "PNaCl VM" jest.

Najważniejsze: jeśli jesteś bardzo ostrożny, możesz korzystać z LLVM IR na wielu platformach, ale nie bez wykonywania dodatkowej pracy (której Clang nie robi) w celu usunięcia różnic ABI.

9

Biorąc pod uwagę plik IR, czy mogę mieć pewność, że może on skompilować się do mojego celu?

Możesz nie założyć, że arbitralny plik IR będzie zawsze wieloplatformowy, ponieważ istnieją rzeczy w danym pliku, które mogą nie być niezależne od platformy. Najbardziej godnym uwagi przykładem jest to, że IR może zawierać rzeczywiste sekwencje asemblera (przez segmenty montażowe module-level lub inline), ale są też inne przykłady - np. użycie specyficznych dla celu wewnętrznych lub konwencji wywoływania, które są obsługiwane tylko w niektórych celach.

Czy mogę wygenerować plik IR, który gwarantuje kompilację wszystkich celów?

Nie wiem, ale wierzę, że możesz, szczególnie, jeśli unikasz określania elementów, takich jak wbudowany zestaw, konwencje wywoływania, wymagane/preferowane ABI dla typów, itp. Może to wpłynąć na optymalizacje, które wykona kompilator, chociaż .