Page 1 of 2

SDCC Z80 = гавно

PostPosted: Thu, 22.06.2017 10:03:46
by TS-Labs
Продолжаем нашу популярную линейку тредов про компиляторы.

Сабж обладает целым набором удивительных свойств, включая но не ограничиваясь:
- медленная компиляция, сравнимая по скорости с рендерингом 3D Max на старых компах,
- полное отсутствие оптимизаций типа: удаление неиспользуемых ф-ций, инлайн редко используемых ф-ций, игнор пустых ф-ций и тд.,
- передача абсолютно всех входных аргументов в ф-цию через стек, независимо от их количества, вместо передачи через регистры,
- уебищный инлайн асм: отсутствие локальных меток, странный синтаксис и тд.,
- неумение последовательно располагать в памяти код секций, заданных по одному адресу - так и хуйнет их по тому же адресу поверх друг друга,
- просто куча багов и странностей.

Кейзы типа
Code: Select all
void foo() {}
...
foo();
...

компилятся в
Code: Select all
foo: ret
...
call foo
...


Стартап код crt0.s линкуется крайне удивительным образом, если делать это при помощи опции --no-std-crt0. В этом случае часть либных ф-ций попадает не в секцию CODE, а в некий небанкуемый HOME, который вообще находится по другому адресу, который (см.выше) нельзя расположить последовательно с CODE. Решение, которое я нашел - не использовать --no-std-crt0, а вместо этого запихнуть свой стартап вместо штатного мясом наружу в папку с компилятором. Тогда ВНЕЗАПНО все секции располагаются в памяти последовательно. Странные люди...

По поводу выкидывания dead code я аж обратился в сапорт.
Весь код, который находится в компилируемом сорце попадает в бинарь безоговорочно.
Весь код, который находится в линкуемом модуле .rel попадает в бинарь безоговорочно.
Весь код, который находится в либе .lib в одном модуле (попавшем в либу из одного .rel) попадает в бинарь безоговорочно.
И только если нафаршировать либу таким образом, чтоб каждая ф-ция лежала в отдельном модуле, повидимому искомый результат будет получен.
БОЛЬНЫЕ УБЛЮДКИ!!!

Re: SDCC Z80 = гавно

PostPosted: Thu, 22.06.2017 10:09:48
by Sergey78
Напиши лучше.

Re: SDCC Z80 = гавно

PostPosted: Thu, 22.06.2017 12:42:38
by TS-Labs
Я не писал компилер С для непроцессоров и не собираюсь в обозримом будущем. Но уж те вещи, которые я писал, я писал "лучше".

Re: SDCC Z80 = гавно

PostPosted: Fri, 23.06.2017 06:56:28
by TS-Labs
Сделал тулзу для разрезания модулей компиляции на отдельные ф-ции для укладки в либу.
Тулза получилась тупая, под стать SDCC, не ломать же стиль.

Re: SDCC Z80 = гавно

PostPosted: Fri, 23.06.2017 07:05:34
by Sergey78
TS-Labs wrote:Весь код, который находится в линкуемом модуле .rel попадает в бинарь безоговорочно.
Весь код, который находится в либе .lib в одном модуле (попавшем в либу из одного .rel) попадает в бинарь безоговорочно.

Какие то компиляторы делают иначе?

Re: SDCC Z80 = гавно

PostPosted: Fri, 23.06.2017 08:38:54
by TS-Labs
GCC делает LTO с удалением dead code, например.

Re: SDCC Z80 = гавно

PostPosted: Fri, 23.06.2017 09:12:07
by Sergey78
Ну ты сравнил. Over 90% компиляторов LTO не умеют. SDCC делает пара человек, и z80 там далеко не основной таргет.

Re: SDCC Z80 = гавно

PostPosted: Fri, 23.06.2017 11:10:04
by TS-Labs
А неужто трудно копировать из либы только те ф-ции, которые реально нужно линковать?
1. Линкер знает, какие ф-ции ему нужны.
2. В либе все ф-ции отлично разделены. Внутри модуля тоже.
3. ??????????
4. ПРОФИТ!

Re: SDCC Z80 = гавно

PostPosted: Tue, 27.06.2017 16:13:45
by TS-Labs
<Blade> и в сдцц асме есть локальные переменные


Code: Select all
void f1() __naked
{
  __asm
l1:
    jr l1
  __endasm;
}

void f2() __naked
{
  __asm
l1:
    jr l1
  __endasm;
}


Code: Select all
obj/out.asm:66: Error: <m> multiple definitions error
obj/out.asm:66: Error: <p> phase error: label location changing between passes 2 and 3
obj/out.asm:74: Error: <m> multiple definitions error
obj/out.asm:74: Error: <p> phase error: label location changing between passes 2 and 3

Re: SDCC Z80 = гавно

PostPosted: Mon, 03.07.2017 20:32:46
by thims
А еще видел чудеса, когда люди порождают ассемблер x86 нормальным компилятором (clang с++17), а потом его конвертят в нужную платформу (например, для 6502 для C64). Тогда не надо писать свой компилятор Си для z80!

Video from : youtube.com


Чисто интуитивно кажется, что если взять старый, но годный компилятор Си для 8086, а то и 8080 (типа ваткома какого-нить) и скомпилить, то код будет почти готов для использования, потребуется не такой уж сложный конвертер наваять. Хотя, в предложенном видео вся соль именно в новом компиляторе и суровых компайл-тайм оптимизациях и вычислениях.

Re: SDCC Z80 = гавно

PostPosted: Thu, 06.07.2017 13:32:03
by psb
TS-Labs wrote:БОЛЬНЫЕ УБЛЮДКИ!!!

чем тебе иар не нравился?;)
не поддерживается? а сдцц вон поддерживается, легче-то стало?:) скока можно жрать кактус?

Re: SDCC Z80 = гавно

PostPosted: Thu, 06.07.2017 18:42:18
by TS-Labs
Поддерживается --std-sdcc11, например.

Re: SDCC Z80 = гавно

PostPosted: Thu, 06.07.2017 22:02:53
by psb
а в чем большой смысл? расскажи как для ААА :))

Re: SDCC Z80 = гавно

PostPosted: Thu, 06.07.2017 22:25:31
by TS-Labs
Syntactic sugar, ну а что ещё. Какой именно - сходу не скажу, это к ДМлогу.

Re: SDCC Z80 = гавно

PostPosted: Thu, 06.07.2017 23:39:36
by psb
как бы да, но... непроцессор есть непроцессор, так и так гемора будет куча. будет при этом сахар или нет - дело уже десятое, все равно писать с оглядкой на архитектуру. зато иар - проф инструмент. -s8 или -s7 и вроде как нет проблем. и компилится мгновенно и не прям уж жирно. и асм прямой (даже слишком). и параметры в регах. и линкер нормальный.

Re: SDCC Z80 = гавно

PostPosted: Fri, 07.07.2017 14:48:30
by TS-Labs
psb wrote:и не прям уж жирно

Жирно, жирно. Давай потоньше =)

Re: SDCC Z80 = гавно

PostPosted: Fri, 07.07.2017 23:29:40
by thims
а таки чудеса с c++17 круты!

Re: SDCC Z80 = гавно

PostPosted: Tue, 25.07.2017 20:55:24
by idxi
TSL, вот написать бы нормальный IDE C-компиллер Сегодня.. да с учетом реальностей существующих zx-архитектур/наработок/разработок.. и в настоящем времени.. в историю бы n-раз вошел.. и коллеги..) думается, достаточно людей бы посодействовали/помогли разноформатно.. ) ? имхо.

Re: SDCC Z80 = гавно

PostPosted: Tue, 25.07.2017 21:01:12
by TS-Labs
Не факт, что такой компилятор возможен в принципе =)

Re: SDCC Z80 = гавно

PostPosted: Tue, 25.07.2017 22:32:05
by idxi
Возможен-возможен, если собраться/набраться.. и начать делать в итоге сделав..)
На базе исходников ssdc - там насколько сложно вникнуть/проникнувши? :)

Как завести TSL'a и Ко - кто знает, чтобы поперло.. аж.. ну вы поняли..) Как?!

Да То что уже есть - собрать воедино в хорошо проструктурированную "папку" (это я про разрозненные Инфы/Доки разных проектов.. коих тут рядом и не рядом (evo,ayx etc...)).. ну вы опять поняли.. ) да и помнится, где то даже славные коллеги помощь предлагали..)

...

Re: SDCC Z80 = гавно

PostPosted: Sun, 06.08.2017 21:08:30
by SfS
SDCC ругать можно, но.. Слишком мало у него поддержки. Так что ругай не ругай...

Локальные переменные локальны в пределах файла! Нет в ассемблере ограничения на функции.
А в пределах файла они локальные.

С остальным согласен.

В принципе именно угробищность некотороых вещей SDCC и заставила меня сделать сборочную среду и скрипты.

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

Re: SDCC Z80 = гавно

PostPosted: Sun, 06.08.2017 22:50:32
by TS-Labs
Ну, если зажать руками уши и закрыть глаза на общую картину маслом не смотреть внутрь того, что выходит из компилятора, а только оценивать результат работы софта и время на разработку - то все збс.

Re: SDCC Z80 = гавно

PostPosted: Tue, 08.08.2017 14:27:55
by SfS
Про локальные переменные. Для асма, как и линкера - "локальная" - значит не видна в других файлах. (аналог static-переменной, объявленной вне функции для С).

Я, кстати, в доке SDCC-NOINIT сегодня это немного описал.

Что касается "разрезания и удаления" - тут тоже есть проблема. Если функция обращается к статической функции, то отрезав код в линкере ты удалишь эту статическую функцию. И будет плохо. Поэтому авторы не стали заморачиваться и отдали нарезку на откуп разработчику. Не скажу, что это удобно, но что есть то есть.

В общем - с одной стороны ты прав, много чего там пилить и пилить. Но с другой - если бы у него было столько же разрабов как для GCC, мы б уже на SDCC++11 кодировали:)

Re: SDCC Z80 = гавно

PostPosted: Thu, 10.08.2017 11:50:22
by idxi
Печалька.. ноо.. где ж все Лучшие спековские умы-кодеры? никто из.. не хочет Обновить Ретро-сцену.. уауу??) Подтянуть молодежЪ то в тему Ретро???!
Писульки Хотя бы по пару часов в ночь..) с миру по биту/байту..

гладишь Ретро-Сообщество Оживет естесвенностью..

ну же.. Оживляйтесь уже, ZXТоварисчи!)

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

Re: SDCC Z80 = гавно

PostPosted: Thu, 10.08.2017 12:51:59
by VBI
а что ТЫ сделал для Репа?