LINUX.ORG.RU

LLVM 2.6

 , , ,


0

0

Шесть месяцев усердной разработки принесли свежие плоды: релиз Low-Level Virtual Machine за номером 2.6.

  • Архитектуры
    • Серьёзно и основательно доработана кодогенерция x86-64
    • Поддержка архитектуры ARM V7 (включая Thumb2 и NEON)
    • Новые кодогенераторы для MSP430, SystemZ, и BlackFin
    • SSE 4.2
  • Новые виды оптимизации
  • Многопоточная компиляция и оптимизация кода
  • Оптимизация при линковке на ELF-архитектурах (плагин 'gold linker')
  • Clang
    • Компилятор для C и Objective-C перешёл в статус «production quality» на х86
    • По сравнению с GCC у Clang улучшены сообщения об ошибках и предупреждениях
    • Компиляция проходит в 3 раза быстрее, чем у GCC
  • Новые подпроекты:
    • compiler-rt: Compiler runtime library
    • KLEE: Symbolic Analysis & Test Case Generator
    • DragonEgg: «llvm-gcc» плагин для GCC 4.5
    • llvm-mc: фреймворк, ориентированный на операции с машкодом, в том числе ассемблер, дисассемблер и проч. Проект находится в ранней стадии.

Проект LLVM находит всё более широкое применение в самых различных областях. На данный момент:

  • Компания Apple использует LLVM для оптимизаций в OpenGL
  • Проекты Rubinius и MacRuby являются реализациями виртуальных машин языка Ruby
  • LLVM D компилятор
  • Unladen Swallow (Python)
  • Roadsend PHP compiler и многие другие

>>> Подробности

Ответ на: комментарий от KRoN73

Где-то полгода назад смотрел текущий llvm-gcc. Числодробильная прога, скомпайленная llvm-gcc, проигрывала скомпайленной обычным gcc 4.3.

Reset ★★★★★
()
Ответ на: комментарий от Reset

>Где-то полгода назад смотрел текущий llvm-gcc

Так чем llvm от llvm-gcc отличается? А то я сейчас llvm простой собираю :)

KRoN73 ★★★★★
()
Ответ на: комментарий от shahid

Его толстота автоматически вызывает срач.

Pavval ★★★★★
()
Ответ на: комментарий от cruxish

> Вообще только я вижу архитектурное сходство между LLVM + clang и СLR + C#?..

Нет, я тоже это стал видеть после того, как узнал расшифровку аббревиатуры LLVM. До этого думал, что LLVM это какаято хреновина, обсуждать которую очень модно у тру лялихоидов.

xintrea
()
Ответ на: комментарий от KRoN73

Еще интересно протестировать в связке с clang.

Reset ★★★★★
()
Ответ на: комментарий от cruxish

>Вообще только я вижу архитектурное сходство между LLVM + clang и СLR + C#?..

А мой неокрепший детский мозг видит сходство с ACK дядки Таненбаума и Ко.

http://tack.sourceforge.net/about.html

Для Ъ:

The Amsterdam Compiler Kit is a venerable piece of software that dates back to the early 1980s.

vaulter
()
Ответ на: комментарий от Reset

>Когда за работу платят, то вектор развития навязывается сверху и разброда и шатания нет, делается именно то что надо и именно так как надо.

Вроде пять звёздочек, а до сих пор верит в сферических оплачиваемых программистов, которые всё делают правильно, а не как обычно --- за полдня до дедлайна после отладки методом научного тыка программа всё-таки начинает собираться, и за оставшиеся полдня даже начинает проходить большую часть тестов.

dn2010 ★★★★★
()
Ответ на: комментарий от iZEN

>>TruЪ-Unix

TruЪ-Unix - мертвый Unix. собственно freebsd таки да, уже на финише.

exception13 ★★★★★
()
Ответ на: комментарий от dn2010

Когда работа нравится и за нее платит - получается в двойне хорошо

namezys ★★★★
()
Ответ на: комментарий от anonymous

пардон, уже; mesa.git/docs/relnotes-7.6.html:

Initial version of Gallium llvmpipe driver. This is a new driver based on LLVM which makes exensive use of run-time code generation. This is an "alpha" stage driver. See the src/gallium/drivers/llvmpipe/README file for more information.

anonymous
()
Ответ на: комментарий от anonymous

не удивительно....

не отставать же совсем уж далеко от apple

да и писать свой оптимизатор было бы опрометчево

namezys ★★★★
()
Ответ на: комментарий от iZEN

А, понятно, совершенство кода в том, что кучка разрабов непомерно высоким эго, не принимает сторонний код. Гордыня - это один из смертных грехов. Из-за своей "соборности" FreeBSD увеличивает разрыв с Linux'ом.

anonymous
()
Ответ на: комментарий от Reset

> Где-то полгода назад смотрел текущий llvm-gcc. Числодробильная прога, скомпайленная llvm-gcc, проигрывала скомпайленной обычным gcc 4.3.

Ну, до 4.4, значит, тем более, как до Пекина раком.

mv ★★★★★
()
Ответ на: комментарий от anonymous

>Из-за своей "соборности" FreeBSD увеличивает разрыв с Linux'ом.


То-то я смотрю, зачем в ядро FreeBSD 7.x включили linux.ko v.2.6.
Очевидно — назло Fedora 10. :D

iZEN ★★★★★
()
Ответ на: комментарий от mv

На моих задачах 4.4 сливает 4.3, правда не сильно. Собираю всё с -O3.

Reset ★★★★★
()
Ответ на: комментарий от vaulter

> The Amsterdam Compiler Kit is a venerable piece of software that dates back to the early 1980s.

Венерический кусок мягкого ношения, на свидании который сзади. Я правильно перевёл, а то мы немецкий учили? И при чём тут Амстердам?

kot_otbelivatel
()
Ответ на: комментарий от iZEN

Инструкция по сборке там левая:
- Код генерируется под i486 (нет ключей march / mtune)
- По-умолчанию используется медленная x87 арифметика с плавающей точкой (нет ключа -mfpmath=sse)

asl
()
Ответ на: комментарий от iZEN

>FreeBSD всё больше становится TruЪ-Unix. >iZEN (*) (25.10.2009 20:43:28)

то есть, таки примет ислам. так и запишем.

anonymous
()
Ответ на: комментарий от mv
> javac ray.java
> ls
total 1
drwxr-xr-x   2 igor  igor    14B 26 окт 09:59 ./
drwx------  27 igor  igor    35B 26 окт 09:44 ../
-rw-r--r--   1 igor  igor   1,1K 26 окт 09:58 ray$Group.class
-rw-r--r--   1 igor  igor   399B 26 окт 09:58 ray$Hit.class
-rw-r--r--   1 igor  igor   397B 26 окт 09:58 ray$Ray.class
-rw-r--r--   1 igor  igor   524B 26 окт 09:58 ray$Scene.class
-rw-r--r--   1 igor  igor   1,8K 26 окт 09:58 ray$Sphere.class
-rw-r--r--   1 igor  igor   371B 26 окт 09:58 ray$Vec.class
-rw-r--r--   1 igor  igor   3,4K 26 окт 09:58 ray.class
-rw-r--r--   1 igor  igor   4,5K 26 окт 09:44 ray.cpp
-rw-r--r--   1 igor  igor   4,8K 26 окт 09:49 ray.java

> time java -server ray 9 512
3.909u 0.405s 0:04.35 98.8%	109+1450k 0+0io 8pf+0w
> g++ -O3 -ffast-math ray.cpp -o ray
> ls
total 1
drwxr-xr-x   2 igor  igor    14B 26 окт 09:59 ./
drwx------  27 igor  igor    35B 26 окт 09:44 ../
-rw-r--r--   1 igor  igor   256K 26 окт 10:00 image.pgm
-rwxr-xr-x   1 igor  igor    21K 26 окт 09:57 ray*
-rw-r--r--   1 igor  igor   1,1K 26 окт 09:58 ray$Group.class
-rw-r--r--   1 igor  igor   399B 26 окт 09:58 ray$Hit.class
-rw-r--r--   1 igor  igor   397B 26 окт 09:58 ray$Ray.class
-rw-r--r--   1 igor  igor   524B 26 окт 09:58 ray$Scene.class
-rw-r--r--   1 igor  igor   1,8K 26 окт 09:58 ray$Sphere.class
-rw-r--r--   1 igor  igor   371B 26 окт 09:58 ray$Vec.class
-rw-r--r--   1 igor  igor   3,4K 26 окт 09:58 ray.class
-rw-r--r--   1 igor  igor   4,5K 26 окт 09:44 ray.cpp
-rw-r--r--   1 igor  igor   4,8K 26 окт 09:49 ray.java

> ./ray 9 512

— вообще какую-то белиберду в консоль выдаёт.

> clang ray.cpp -o ray
clang: warning: not using the clang compiler for C++ inputs
clang: warning: not using the clang compiler for C++ inputs
/tmp/cc-n1qJ82.o(.text+0x33a): In function `std::__verify_grouping(char const*, unsigned long, std::string const&)':
: undefined reference to `std::string::size() const'
/tmp/cc-n1qJ82.o(.text+0x385): In function `std::__verify_grouping(char const*, unsigned long, std::string const&)':
: undefined reference to `std::string::operator[](unsigned long) const'
/tmp/cc-n1qJ82.o(.text+0x3c4): In function `std::__verify_grouping(char const*, unsigned long, std::string const&)':
: undefined reference to `std::string::operator[](unsigned long) const'
/tmp/cc-n1qJ82.o(.text+0x40d): In function `std::__verify_grouping(char const*, unsigned long, std::string const&)':
: undefined reference to `std::string::operator[](unsigned long) const'
/tmp/cc-n1qJ82.o(.text+0x463): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `std::ios_base::Init::Init()'
/tmp/cc-n1qJ82.o(.text+0x572): In function `__tcf_0':
: undefined reference to `std::ios_base::Init::~Init()'
/tmp/cc-n1qJ82.o(.text+0x5a2): In function `create(int, Vec, double)':
: undefined reference to `operator new(unsigned long)'
/tmp/cc-n1qJ82.o(.text+0x913): In function `create(int, Vec, double)':
: undefined reference to `operator new(unsigned long)'
/tmp/cc-n1qJ82.o(.text+0x98b): In function `create(int, Vec, double)':
: undefined reference to `operator delete(void*)'
/tmp/cc-n1qJ82.o(.text+0xb5d): In function `main':
: undefined reference to `std::cout'
/tmp/cc-n1qJ82.o(.text+0xb62): In function `main':
: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/tmp/cc-n1qJ82.o(.text+0xb6d): In function `main':
: undefined reference to `std::ostream::operator<<(int)'
/tmp/cc-n1qJ82.o(.text+0xb7a): In function `main':
: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/tmp/cc-n1qJ82.o(.text+0xb85): In function `main':
: undefined reference to `std::ostream::operator<<(int)'
/tmp/cc-n1qJ82.o(.text+0xb92): In function `main':
: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/tmp/cc-n1qJ82.o(.text+0xcf0): In function `main':
: undefined reference to `std::cout'
/tmp/cc-n1qJ82.o(.text+0xcf5): In function `main':
: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char)'
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZN9__gnu_cxx13new_allocatorIP5SceneE10deallocateEPS2_m+0x19): In function `__gnu_cxx::new_allocator<Scene*>::deallocate(Scene**, unsigned long)':
: undefined reference to `operator delete(void*)'
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZN5SceneD2Ev+0x26): In function `Scene::~Scene()':
: undefined reference to `operator delete(void*)'
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZN6SphereD0Ev+0x2f): In function `Sphere::~Sphere()':
: undefined reference to `operator delete(void*)'
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZN5SceneD0Ev+0x26): In function `Scene::~Scene()':
: undefined reference to `operator delete(void*)'
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZN5SceneD1Ev+0x26): In function `Scene::~Scene()':
: undefined reference to `operator delete(void*)'
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZN6SphereD1Ev+0x2f): more undefined references to `operator delete(void*)' follow
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZN9__gnu_cxx13new_allocatorIP5SceneE8allocateEmPKv+0x32): In function `__gnu_cxx::new_allocator<Scene*>::allocate(unsigned long, void const*)':
: undefined reference to `std::__throw_bad_alloc()'
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZN9__gnu_cxx13new_allocatorIP5SceneE8allocateEmPKv+0x43): In function `__gnu_cxx::new_allocator<Scene*>::allocate(unsigned long, void const*)':
: undefined reference to `operator new(unsigned long)'
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZNSt6vectorIP5SceneSaIS1_EE7reserveEm+0x2a): In function `std::vector<Scene*, std::allocator<Scene*> >::reserve(unsigned long)':
: undefined reference to `std::__throw_length_error(char const*)'
/tmp/cc-n1qJ82.o(.gnu.linkonce.t._ZNSt6vectorIP5SceneSaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1_+0xdd): In function `std::vector<Scene*, std::allocator<Scene*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<Scene**, std::vector<Scene*, std::allocator<Scene*> > >, Scene* const&)':
: undefined reference to `std::__throw_length_error(char const*)'
/tmp/cc-n1qJ82.o(.gnu.linkonce.r._ZTI6Sphere+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/cc-n1qJ82.o(.gnu.linkonce.r._ZTI5Scene+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
/tmp/cc-n1qJ82.o(.gnu.linkonce.r._ZTV5Scene+0x20): undefined reference to `__cxa_pure_virtual'
/tmp/cc-n1qJ82.o(.gnu.linkonce.r._ZTV5Scene+0x28): undefined reference to `__cxa_pure_virtual'
/tmp/cc-n1qJ82.o(.gnu.linkonce.r._ZTV5Scene+0x30): undefined reference to `__cxa_pure_virtual'
/tmp/cc-n1qJ82.o(.gnu.linkonce.r._ZTI5Group+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/cc-n1qJ82.o(.eh_frame+0x13): undefined reference to `__gxx_personality_v0'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

— понятно — C++ не переваривает. Нужно ставить lang/llvm-gcc4.

iZEN ★★★★★
()
Ответ на: комментарий от mv
> g++ -O3 -ffast-math ray.cpp -o ray
> time ./ray 9 512 > /dev/null 
3.097u 0.034s 0:03.37 92.5%   18+1646k 0+0io 2pf+0w

Файл с картинкой не создался.

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

llvm-gcc4 (последнее обновление порта «04 Mar 2009 21:01:10») не собирается:

% cd /usr/ports/lang/llvm-gcc4/ && make
...
...
.././../gcc/llvm-backend.cpp: In function 'void llvm_mark_decl_weak(tree_node*)':
.././../gcc/llvm-backend.cpp:1468: error: 'WeakLinkage' is not a member of 'llvm::GlobalValue'
.././../gcc/llvm-backend.cpp: In function 'void print_llvm_type(FILE*, void*)':
.././../gcc/llvm-backend.cpp:1517: error: invalid initialization of reference of type 'llvm::raw_ostream&' from expression of type 'oFILEstream'
/usr/local/include/llvm/Assembly/Writer.h:66: error: in passing argument 1 of 'void llvm::WriteTypeSymbolic(llvm::raw_ostream&, const llvm::Type*, const llvm::Module*)'
gmake[3]: *** [llvm-backend.o] Ошибка 1
gmake[2]: *** [all-stage1-gcc] Ошибка 2
gmake[1]: *** [stage1-bubble] Ошибка 2
gmake: *** [all] Ошибка 2
*** Error code 1

Stop in /usr/ports/lang/llvm-gcc4.
— нужно подождать портирования llvm-gcc4 2.6.

iZEN ★★★★★
()
Ответ на: комментарий от White_Mouse

> А как специфические команды транслируются в LLVM байткод? Например sse* всякие.

Вопрос неверно поставлен.
Компилятор генерирует LLVM байткод, а LLVM потом из него уже SSE* может нагенерировать, если нужно.

anonymous
()
Ответ на: комментарий от prishel_potrollit

>Недавно ж новость об уязвимостях была бзди 6 и 7 была. Какой совершенный код? в последних обновлениях linux kernel исправлено 6 уязвимостей. А сколько еще не найдено? Вам еще не страшно ? ;-) тогда мы идем к вам.

Als
()

Так никто и не потестил еще?

anonymous
()
Ответ на: комментарий от anonymous

>> А как специфические команды транслируются в LLVM байткод? Например sse* всякие.

>Вопрос неверно поставлен.

>Компилятор генерирует LLVM байткод, а LLVM потом из него уже SSE* может нагенерировать, если нужно.


Анонимус, LLVM каким-то образом позволяет использовать inline asm.

naryl ★★★★★
()
Ответ на: комментарий от naryl

> Анонимус, LLVM каким-то образом позволяет использовать inline asm.

Да, но думаю теряется переносимость

вместо этого стоило бы сделать inline функции, удобные и подразумевающие оптимизацию

namezys ★★★★
()
Ответ на: комментарий от namezys

>> и оптимизация виртуальных методов

>А может ли? вроде информация о типах не является задачей llvm?

>Если бы являлась, то какие возможности открывались бы для динамических языков

LLVM is a low-level object code representation that uses simple RISC-like instructions, but provides rich, language-independent, type information and dataflow (SSA) information about operands.

Не?

anonymous
()
Ответ на: комментарий от Oaks

> А можно ли сие чудо попробовать на Slackware 12.0 ?
Можно, разрешаю.
Ну а если серьезно, то незачем его еще там пробовать. Патрик не одобрил. Пусть пилят.

to all:
Где обещенные тесты?

Golovachev
()

Спецом завел на них 4 адских бага, которые вмясину кодогенератор крошат, причем на примитивных примерах, пролежали они месяц - и вот релиз, а они( и еще куча, в т.ч. баги с мемликами в статиках, которые видимо ихним Valgrind тестом не ловятся ) все еще висят багзилле. накой тогды спрашивается релизить, или начальство латтнеру зп снижает когда тот в сроки не укладывается?

*еще маленький минус - сырцы не поправлены чтоб компилится на Visual Studio 2010 beta 2 =) а в ней просто рай исследовать проект благодаря компилеру встроенному в текстовый редактор ( как gmcs внутри MonoDevelop )

anonymous
()
Ответ на: комментарий от anonymous

> а в ней просто рай исследовать проект благодаря компилеру встроенному в текстовый редактор ( как gmcs внутри MonoDevelop )

А вот с дурацкой рекламой просьба не лезть.

anonymous
()
Ответ на: комментарий от iZEN

> Дайте общедоступные тесты на чистом C — затестю.
А что-нибудь из рядового софта не пробовали им собирать?

Интересно, что у KRoN73 вышло из тестов.

Golovachev
()

Кстати, меня заинтересовало, чем именно он Low-Level, в частности, чем он низкоуровневее той же JVM, например.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

джава знает о методах вроде. этот же ничего не знает ни о ООП, ни о методах

namezys ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.