SDCC Z80 = гавно

Программирование, алгоритмы

Postby TS-Labs » Thu, 22.06.2017 10:03:46

Продолжаем нашу популярную линейку тредов про компиляторы.

Сабж обладает целым набором удивительных свойств, включая но не ограничиваясь:
- медленная компиляция, сравнимая по скорости с рендерингом 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) попадает в бинарь безоговорочно.
И только если нафаршировать либу таким образом, чтоб каждая ф-ция лежала в отдельном модуле, повидимому искомый результат будет получен.
БОЛЬНЫЕ УБЛЮДКИ!!!
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby Sergey78 » Thu, 22.06.2017 10:09:48

Напиши лучше.
Sergey78
 
Posts: 422
Joined: Wed, 05.09.2012 20:04:40

Postby TS-Labs » Thu, 22.06.2017 12:42:38

Я не писал компилер С для непроцессоров и не собираюсь в обозримом будущем. Но уж те вещи, которые я писал, я писал "лучше".
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby TS-Labs » Fri, 23.06.2017 06:56:28

Сделал тулзу для разрезания модулей компиляции на отдельные ф-ции для укладки в либу.
Тулза получилась тупая, под стать SDCC, не ломать же стиль.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby Sergey78 » Fri, 23.06.2017 07:05:34

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

Какие то компиляторы делают иначе?
Sergey78
 
Posts: 422
Joined: Wed, 05.09.2012 20:04:40

Postby TS-Labs » Fri, 23.06.2017 08:38:54

GCC делает LTO с удалением dead code, например.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby Sergey78 » Fri, 23.06.2017 09:12:07

Ну ты сравнил. Over 90% компиляторов LTO не умеют. SDCC делает пара человек, и z80 там далеко не основной таргет.
Sergey78
 
Posts: 422
Joined: Wed, 05.09.2012 20:04:40

Postby TS-Labs » Fri, 23.06.2017 11:10:04

А неужто трудно копировать из либы только те ф-ции, которые реально нужно линковать?
1. Линкер знает, какие ф-ции ему нужны.
2. В либе все ф-ции отлично разделены. Внутри модуля тоже.
3. ??????????
4. ПРОФИТ!
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby TS-Labs » Tue, 27.06.2017 16:13:45

<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
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby thims » Mon, 03.07.2017 20:32:46

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

Video from : youtube.com


Чисто интуитивно кажется, что если взять старый, но годный компилятор Си для 8086, а то и 8080 (типа ваткома какого-нить) и скомпилить, то код будет почти готов для использования, потребуется не такой уж сложный конвертер наваять. Хотя, в предложенном видео вся соль именно в новом компиляторе и суровых компайл-тайм оптимизациях и вычислениях.
User avatar
thims
 
Posts: 139
Joined: Fri, 27.07.2012 17:18:35

Postby psb » Thu, 06.07.2017 13:32:03

TS-Labs wrote:БОЛЬНЫЕ УБЛЮДКИ!!!

чем тебе иар не нравился?;)
не поддерживается? а сдцц вон поддерживается, легче-то стало?:) скока можно жрать кактус?
User avatar
psb
 
Posts: 715
Joined: Tue, 30.12.2014 23:22:32

Postby TS-Labs » Thu, 06.07.2017 18:42:18

Поддерживается --std-sdcc11, например.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby psb » Thu, 06.07.2017 22:02:53

а в чем большой смысл? расскажи как для ААА :))
User avatar
psb
 
Posts: 715
Joined: Tue, 30.12.2014 23:22:32

Postby TS-Labs » Thu, 06.07.2017 22:25:31

Syntactic sugar, ну а что ещё. Какой именно - сходу не скажу, это к ДМлогу.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby psb » Thu, 06.07.2017 23:39:36

как бы да, но... непроцессор есть непроцессор, так и так гемора будет куча. будет при этом сахар или нет - дело уже десятое, все равно писать с оглядкой на архитектуру. зато иар - проф инструмент. -s8 или -s7 и вроде как нет проблем. и компилится мгновенно и не прям уж жирно. и асм прямой (даже слишком). и параметры в регах. и линкер нормальный.
User avatar
psb
 
Posts: 715
Joined: Tue, 30.12.2014 23:22:32

Postby TS-Labs » Fri, 07.07.2017 14:48:30

psb wrote:и не прям уж жирно

Жирно, жирно. Давай потоньше =)
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby thims » Fri, 07.07.2017 23:29:40

а таки чудеса с c++17 круты!
User avatar
thims
 
Posts: 139
Joined: Fri, 27.07.2012 17:18:35

Postby idxi » Tue, 25.07.2017 20:55:24

TSL, вот написать бы нормальный IDE C-компиллер Сегодня.. да с учетом реальностей существующих zx-архитектур/наработок/разработок.. и в настоящем времени.. в историю бы n-раз вошел.. и коллеги..) думается, достаточно людей бы посодействовали/помогли разноформатно.. ) ? имхо.
User avatar
idxi
 
Posts: 179
Joined: Mon, 03.07.2017 16:54:54

Postby TS-Labs » Tue, 25.07.2017 21:01:12

Не факт, что такой компилятор возможен в принципе =)
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby idxi » Tue, 25.07.2017 22:32:05

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

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

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

...
User avatar
idxi
 
Posts: 179
Joined: Mon, 03.07.2017 16:54:54

Postby SfS » Sun, 06.08.2017 21:08:30

SDCC ругать можно, но.. Слишком мало у него поддержки. Так что ругай не ругай...

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

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

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

С мертвым кодом все не так просто. Если есть встроенный асм и локальные символы в нем. Так что ребята просто забили на это и решили - пишешь бибилиотеку - бей сам ее на части)
SfS
 
Posts: 113
Joined: Thu, 23.02.2017 17:13:01

Postby TS-Labs » Sun, 06.08.2017 22:50:32

Ну, если зажать руками уши и закрыть глаза на общую картину маслом не смотреть внутрь того, что выходит из компилятора, а только оценивать результат работы софта и время на разработку - то все збс.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby SfS » Tue, 08.08.2017 14:27:55

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

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

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

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

Postby idxi » Thu, 10.08.2017 11:50:22

Печалька.. ноо.. где ж все Лучшие спековские умы-кодеры? никто из.. не хочет Обновить Ретро-сцену.. уауу??) Подтянуть молодежЪ то в тему Ретро???!
Писульки Хотя бы по пару часов в ночь..) с миру по биту/байту..

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

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

Ведь какой кайф прикрутить какую нить чип-железку к спеку и методом ума вытягивать невозможные возможности... творить.. стыковать.. управлять..
User avatar
idxi
 
Posts: 179
Joined: Mon, 03.07.2017 16:54:54

Postby VBI » Thu, 10.08.2017 12:51:59

а что ТЫ сделал для Репа?
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Next

Return to Coding

Who is online

Users browsing this forum: No registered users and 1 guest

x