LINUX.ORG.RU

Прошу дополнить и поправить картину мироздания

 ,


1

3

Не совсем понимаю где кончается clang, начинаются llvm и binutils

1. Clang препроцессит си-код и получает чистый си-код

2. Clang берет чистый си-код и строит AST.

[ тут магия ]

4. LLVM берет LLVM-байткод из магии и производит на свет файл ассемблера для конкретной архитектуры

[ Здесь clang и llvm больше не используются. Вступают в дело binutils, а именно as и ld ]

5. as берет файл ассемблера и производит объектный файл

6. ld превращает объектный файл в исполняемый

★★★★★

Последнее исправление: makoven (всего исправлений: 1)

Стало интересно. Нашёл это: http://www.informit.com/articles/article.aspx?p=1215438

Как я понял, clang генерирует Intermediate Representation (IR) а затем за дело берётся llvm: код оптимизируется и бекенд генерирует результирующие файлы под конкретную платформу (asm, .NOT IL, whatever).

В случае с asm процесс всегда стандартный: объектный файл, линковка/пакование, бинарник.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)

А я вот, почитав в педивикии про Clang, так и не понял, чем оно лучше gcc, кроме ненужного для меня увеличения отладочной информации!

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

Он лучше скроен и пошит чем gcc. У него разукрашенные сообщения об ошибках. А еще потому что rust использует LLVM. А на этом ресурсе кажется любят rust )

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

О, вот это — весомый плюс. А т.к. пишут, что clang полностью все опции gcc поддерживает, то можно будет, пожалуй, проверить.

Eddy_Em ☆☆☆☆☆
()

какая магия?
кланг делает байткод(ir) для LLVM
а аст относится к внутренностям кланга зачем вам это?

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

Тем, что его разработчики куда охотнее отвечают на багрепорты и фиксят баги.

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

зачем вам это?

Не знаю) Думал народ с миру по нитке накидает умных мыслей чтобы возыметь общую картину по clang/LLVM. Но, видимо все пользуются gcc

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

ну парсер кланга делает AST
кодогенератор кланга затем из этого делает IR
потом в дело вступает LLVM
вроде так

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

Да и на каком техническом ресурсе его не любят-то?

На любом? Не-не-не. Ты только не уравнивай «не любить» и «ненавидеть». Понятие «не любить» вполне можно расшифровать как «А что это такое? Не отвечай, мне насрать». Уверен, что «насрать» это самое распространённое отношение к rust.

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

Хорошо хорошо, я же несерьезно. «Насрать» вообще самое распространенное отношение ко всему)

ozkriff
()
Ответ на: комментарий от i-rinat

Проразукрашенные сообщения - это была попытка пошутить. Типа нескучные обои и тому подобное)

makoven ★★★★★
() автор топика

Кстати, погуглите, сторонники llvm, за меня: смогу ли я при помощи clang собирать под ARM (конкретно интересуют cortex m3/4 — это STM32F0xx..STM32F4xx, а также современные армы, которые в "кубибордах" и "малинках" стоят)? А может быть, он мне позволит еще и выкинуть sdcc и собирать под STM8?

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

позволит еще и выкинуть sdcc и собирать под STM8

Ну, запрещать он тебе точно не станет. Лицензия ведь пермиссивная.

Какая нафиг разница, сколько времени оно собираться будет?

Если ты компиляешь генту, разницы нет: включил и пошёл гулять. А вот если ты занимаешься разработкой, разница заметна, код с мелкими правками надобно по сотне раз на дню собирать.

i-rinat ★★★★★
()

Clang генерит LLVM IR, который потом или сразу транслируется в ассемблер или elf, или потом сшивается LTO плагином и потом только транслируется (то есть, во врем работы линкера).

anonymous
()

Открой для себя ключи --help. Емнип, там можно каждый этап самостоятельно воспроизвести.

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

кто-то там пруф хотел

flac 1.3.0

for i in {1..20};do time flac -f --best 1.wav;done |& grep ^real

llvm 3.4.2 clang -march=native -O3 -flto
real    0m5.217s
real    0m5.222s
real    0m5.222s

gcc 4.8.3 gcc -march=native -O3 (c -flto не собирается, да и libvorbis например, работает медленне, чем без него)
real    0m6.016s
real    0m6.023s
real    0m6.028s

anonymous
()

Еще спрошу пока все не разбежались)

Когда я линкую програму с so-библиотекой, как связываются функции - по адресам или по именам? Если потом заменить библиотеку на другую, в которой будут имена функций, которые я использовал - оно будет работать?

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 2)

И еще вопрос. Как я понял, c++ перед компиляцией сначала превращается в изуродованный c, а потом компилируется как c. В каком тогда виде в so-библиотеке представленны экспортируемые c++ объекты/классы? В c ведь нет такого

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от anonymous

gcc 4.8.3

Чёж протухшую ветку-то, на другой обосрался?

# for i in {1..4};do time taskset -c 6 ./src/flac/flac -f --best 600sec.wav -c &> /dev/null;done |& grep ^real
# gcc --version
gcc (Gentoo 4.10.0_pre9999) 4.10.0-pre9999 20140818 (experimental) commit e4f4f4e4debc129b999e8433075a4255722f150f

# clang --version
clang version 3.4.2 (tags/RELEASE_34/dot2-final)
Target: x86_64-pc-linux-gnu
Thread model: posix

CC=gcc CFLAGS="-O3 -march=native"

real    0m3.991s
real    0m3.911s
real    0m3.911s
real    0m3.978s

CC=clang CFLAGS="-O3 -march=native"//
real    0m4.438s
real    0m4.472s
real    0m4.516s
real    0m4.501s

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

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

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

Не работает твоё говно lto.

/tmp/main-a7a2de.o: file not recognized: Формат файла не распознан
clang: error: linker command failed with exit code 1 (use -v to see invocation)

И это ничего не изменит.

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

Как это относится к твоему обсёру?

Собственно как я и сказал - это ничего не дало:

#CC=clang CFLAGS="-O3 -march=native -flto"
real    0m4.713s
real    0m4.576s
real    0m4.511s
real    0m4.527s

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

А какой результирующий размер кода в обоих случаях?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Deleted

Никакой разницы не будет. Поставь 4.9.* - будет тоже самое. На 4.10.* наоборот регрес. Лайв 4-х месячной давности выдавал 3.6-3.7 - т.е. быстрее 4.9, а сейчас на уровне 4.9.

И ты реально не понимаешь разницу между gcc и шлангом? 3.4 - это последняя ветка шланга, а 4.8 - это говно в котором ничего нет. Вся жара у гцц идёт в 4.9/10. Т.е. только даун будет сравнивать 4.8 и 3.4 - сравнивай тогда с 2.0.

Не собирается твой шланг.

Обоссанному шлангу до гцц как до луны пешком. А всё эти «быстрее» - маркетинговая лапша для лохов.

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

Не собирается твой шланг

Не мой он, не бухти.

А всё эти «быстрее» - маркетинговая лапша для лохов

Однако ж ты решил с лохами играть по их правилам. Что же сразу не стал сравнивать результирующий размер кода?

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

А теперь то же самое для Firefox сделай. Clang на C++ с кучей темплейтов намного быстрее гнуси.

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

Не мой он, не бухти.

Ну тыж поверил в него - твой.

Однако ж ты решил с лохами играть по их правилам.

С чего?

Что же сразу не стал сравнивать результирующий размер кода?

Зачем? Он мне не интересен. Надо быть тотальным дауном, чтобы сравнивать по размеру кода.

Ладно там на гнилой, жалкой, нищебродной аврке, но это а) другие таргеты, б) совершенно другие флажки.

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

А теперь то же самое для Firefox сделай.

Ну выкатывай банч - сделаю. Что файирфокс? Обосрался и ищешь оправданий?

Clang на C++ с кучей темплейтов намного быстрее гнуси.

Как связан гнуси и С++, как связаны темплейты и «быстрота» - это очередной миф, как и быстрота шланга. Как связаны темплейты и гнуси?

Ты можешь это померить и обосраться в очередной раз.

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

Ну тыж поверил в него - твой

Такого не было, наговаривать нехорошо :)

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

gcc 4.9.1 -march=native -O3 real 0m5.881s real 0m5.906s real 0m5.916s

llvm 3.4.2 -march=native -O3 -flto real 0m5.179s real 0m5.180s real 0m5.183s

amd вместо процессора, если что

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

а теперь llvm тоже из git. кстати, gcc 4.9.1 тоже медленнее релиза clang

Это ниначто не повлияет. Твоя говно из гита не собирается, да и не прогрессирует.

Темболее ты должно собирать мне тут шланг, тыж обосрался.

gcc 4.9.1 тоже медленнее релиза clang

Чтож ты врёшь балаболка:

CC=gcc-4.9.0 CFLAGS="-O3 -march=native"
real    0m4.055s
real    0m4.020s
real    0m3.995s
real    0m3.985s

4.9.1 не мог регрессировать до того, чтобы слить шлангу.

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

amd вместо процессора, если что

Какая-нибудь нищая ссанина?

-flto

Нахрен ты суёшь сюда своё гнилое, фейковое недолто?

gcc 4.9.1 -march=native -O3 real 0m5.881s real 0m5.906s real 0m5.916s

Врёшь.

Записывай perf record для обоих и выкатывай.

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

а собранное гитовым компилером нужно гонять тестами, вспоминая недавнюю историю с Линусом и gcc 4.9

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