OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 21:22

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Вторник, 05 Апрель, 2016 08:20 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Возможно, ошибка находится в оптимизаторе кода компилятора (не GCC).

ooc/ooc2/doc/from-v1-to-v2/oo2c-v2.html
Цитата:
1. Introduction

oo2c v2 is a complete rewrite of the compiler and associated tools. Some highlights are

Reduced internal complexity, at the expense of more computational overhead. This goes hand in hand with the ability to add experimental language features to the compiler.
A simplified internal SSA code representation that eliminates the need to keep track the block structure of nested statements. This reduces the complexity of most code transformations. On the other hand, producing the target code becomes more difficult.
A broader range of code transformations, including loop rewriting and partial redundancy elimination on top of the existing ones (common subexpression elimination, loop invariant code motion, constant propagation, algebraic transformations, and dead code elimination).
A large set of regression tests, increasing the reliability and stability of compiler releases.
More built-in support for building and installing third party packages.
Writing FOREIGN modules to interface with external libraries has become easier. A simple #include pulls in all the run-time type and module meta data a module needs to provide to the run-time system.

The v2 compiler implements most, but not all, of the features of its predecessor. Most programs should compile without changes, although some of the more esoteric features and library modules have been dropped. The following sections summarize the omissions and additions. For the most part, the language extensions are experimental in nature and should not be considered final.


Последний раз редактировалось Роман М. Вторник, 05 Апрель, 2016 09:28, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Вторник, 05 Апрель, 2016 08:51 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
kekc_leader писал(а):
Я нашёл ошибку в компиляторе OO2C, прошу вас помочь мне её устранить.
Какова версия сборки компилятора?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Вторник, 05 Апрель, 2016 16:38 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
Alexander Shiryaev писал(а):
Это digitspace
Интересно. А зачем он там нужен, почему не просто space используется? Что лучше использовать вместо модуля Out? (или просто поправить его?)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Вторник, 05 Апрель, 2016 16:53 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
Роман М. писал(а):
Возможно, ошибка находится в оптимизаторе кода компилятора (не GCC).
Да, я читал это. В код компилятора тоже порылся. Там, насколько я понял, оптимизация сделана не вполне отдельно от основной компиляции. То есть нельзя её «просто отключить». Но это точно из-за неё.

Роман М. писал(а):
Какова версия сборки компилятора?
Код:
$ oo2c --version
oo2c/gcc 2.1.11
Это версия, взятая с https://github.com/AlexIljin/oo2c


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Вторник, 05 Апрель, 2016 16:55 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
kekc_leader писал(а):
Alexander Shiryaev писал(а):
Это digitspace
Интересно. А зачем он там нужен, почему не просто space используется? Что лучше использовать вместо модуля Out? (или просто поправить его?)

digitspace - это управляющий знак (control code). Мне кажется, что нужно изменять поведение где-то в конвертерах при получении Ascii-представления.

Добавлено позже:
https://github.com/romiras/BlackBox-Component-Framework/blob/master/Host/Mod/TextConv.cp#L153


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Вторник, 05 Апрель, 2016 16:56 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
kekc_leader писал(а):
Alexander Shiryaev писал(а):
Это digitspace
Интересно. А зачем он там нужен, почему не просто space используется? Что лучше использовать вместо модуля Out? (или просто поправить его?)

Лучше использовать Log. Out оставлен для книги Вирта. Его не надо использовать.

Код:
This module is provided for compatibility with the book "Programming in Oberon" by Reiser/Wirth. It is useful when learning the language. It is not recommended for use in production programs.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Четверг, 07 Апрель, 2016 02:56 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
Спасибо, буду использовать Log вместо Out.

Я откомпилировал исходник ошибки и откомпилировал слегка изменённую версию (единственное изменение - внутри процедуры Line - присваивание значения переменной i глобальной переменной globalVar), всё это дело пропустил через vimdiff и заснял. Прилагаю к сообщению три снимка: разница между исходниками, разница между, получающимися в процессе компиляции, файлами Си и разница между выводами получившихся программ. Выводы в обоих случаях неверные (точнее, в исходном варианте неверная вторая часть вывода, а в изменённом - первая часть). Сам я ещё это не изучал, просто хочу сразу поделиться. Удивляет обилие изменений в получившемся коде на Си при изменении всего одной строчки в процедуре. С другой стороны, большинство изменений - это смена номера регистра. Например, раньше было «i3 = i3+i2;», а теперь «i8 = i8+i2;».


Вложения:
Комментарий к файлу: Разница исходных текстов. Слева исходная программа, справа - изменённая.
sources_diff.png
sources_diff.png [ 37.31 КБ | Просмотров: 8711 ]
Комментарий к файлу: Разница вывода программ. Слева вывод исходной программы, справа - изменённой.
output_diff.png
output_diff.png [ 12.6 КБ | Просмотров: 8711 ]
Комментарий к файлу: Разница промежуточных файлов на Си. Слева исходная программа, справа - изменённая.
object_diff.png
object_diff.png [ 85.26 КБ | Просмотров: 8711 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Воскресенье, 10 Апрель, 2016 18:39 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
Alexander Shiryaev писал(а):
Исполняемый файл собрать нельзя, только библиотеку .so
А тут вот лежит «минипакет для сборки линукс-приложений Блэкбокс15».
http://oberoncore.ru/projects/develflinker-distro
Он работает или устарел?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Воскресенье, 10 Апрель, 2016 19:41 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
kekc_leader писал(а):
Alexander Shiryaev писал(а):
Исполняемый файл собрать нельзя, только библиотеку .so
А тут вот лежит «минипакет для сборки линукс-приложений Блэкбокс15».
http://oberoncore.ru/projects/develflinker-distro
Он работает или устарел?

Устарел или то же самое. Исполняемый файл собрать нельзя, только динамическую библиотеку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Пятница, 06 Декабрь, 2019 15:17 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 293
Откуда: Russia
Временное решение.
В OOC/SSA/Destore.Mod процедура Transform, закомментировать строку pb .DeleteInstr (instr); в блоке, начинающемся с комментария
(* visit all "get" instructions that have no uses and eleminate them;

Проблема понятна, на ее полноценное решение нужно время


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Воскресенье, 25 Декабрь, 2022 23:32 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
временное решение не то чтобы работает… но виновник идентифицирован правильно.

что, тащемта, происходит: модуль Destore заведует во-первых, уничтожением лишних LOAD/STORE, а во-вторых, он делает интересную оптимизацию: заменяет некоторые загрузки из регистров на прямое использование выражений. в нашем случае заменяет `vert` на то самое странное `iA > iB`. это снижает нагрузку на register allocator (хотя зачем такие танцы для сишного бэкэнда — неясно).

проблема, однако, в том, что `vert` 1) находится в цикле, и 2) является для тела цикла инвариантом. после замены оптимизатор вполне логично видит, что `vert` дальше по коду нигде не используется, но не понимает, что вместо неё используются `iA` и `iB`. поэтому он не помечает их как «использованые в теле цикла», и регистровый аллокатор радостно использует их повторно для изменения индекса FOR.

правильный фикс будет, соответственно, примерно такой: если мы в цикле, и заменили переменную на выражение, то пометить регистры этого выражения как используемые (добавить в `useList`, я полагаю). но я не разбирался в SSA-части компилятора, не очень понимаю, что там куда, мне страшно, и у меня лапки. поэтому я пошёл более простым путём: просто отломал почти весь Destore, путем замены функции `SameInstr()` на заглушку, которая всегда возвращает FALSE. это оторвало замену переменной на значение, и компилятор был вынужден засунуть её в регистр, и сохранять этот регистр живым.

почему надо именно POINTER TO RECORD, чтобы триггернуть баг? потому что такой код, похоже, создаёт очень удачный паттерн нагрузки на регистровый аллокатор (который, похоже, зачем-то имеет лимит на количество регистров).

вот минимизированый тест для бага:
Код:
MODULE BugFix;
IMPORT Out;
TYPE
  Bitmap = POINTER TO BitmapDesc;
  BitmapDesc = RECORD
    h: LONGINT;
  END;
VAR B: Bitmap;

PROCEDURE Line*(bmp: Bitmap; x1, y1, y2: LONGINT);
VAR y, i, sy: LONGINT; vert: BOOLEAN;
BEGIN
  IF y2 > y1 THEN sy := 1 ELSE sy := -1 END;
  y := y1; vert := y1 < x1;
  (* either FOR, or WHILE will trigger the bug. FOR seems to be converted to this WHILE anyway. *)
  i := 0;
  WHILE i <= y2 DO
    (* Removing "bmp.h" check here makes all correct.
       It seems that the problem is in pointer dereferencing. *)
    IF (y < bmp.h) THEN
      (* no need to call anything here *)
    END;
    IF vert THEN INC(y, sy) END;
    i := i+1;
  END;
  (* should output "1", but outputs "3" *)
  Out.Int(y, 3); Out.Ln
END Line;

BEGIN
  NEW(B); B.h := 100;
  Line(B, 0, 1, 3)
END BugFix.

как написано в тексте, правильный компилятор скажет "1", а неправильный — "3" (потому что попортит один из нужных регистров).

побочный эффект оторваного Destore — исчерпание свободных регистров в аллокаторе, вследствие чего аллокатор генерирует абсолютно бесполезные сдвиги значений между регистрами (похоже, это он так делает spill). в принципе — совершенно некритично, потому что gcc это всё уберёт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Понедельник, 26 Декабрь, 2022 22:28 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
добавлю ещё, что оптимизатор у oo2c довольно-таки… в общем, качество оптимизации определённо не стоит того объёма кода, который на это потрачен. ладно, интерпроцедурной оптимизации нет даже в зачатке (он не способен увидеть вызов «пустой» процедуры и выкинуть его), но даже в коде-тесте он не справился с тем, чтобы попросту выкинуть условие, которое делает ничего.

ну да, технически можно возразить, что оно таки делает «чего»: оно заставляет программу падать, если `bmp = NIL`. но мне кажется, что это тот случай, когда не место и не время. если программист хочет от этого защититься — то ему надо ставить `ASSERT` на входе, а не полагаться на случайное падение в условии. поэтому условие можно смело аннигилировать — но oo2c не умеет. он этого не умеет даже если там будет просто запись, а не указатель на неё.

поэтому я считаю, что как тренировка ван Акена в разных «компиляторных колдунствах» он смысл имел. а вот как компилятор для практического использования — нет. слишком сложный для довольно мизерных результатов, и в итоге нечитаем и несопровождаем никем кроме автора (доказательством чему является фактическая смерть проекта после того, как автор ушёл). и это при том, что ван Акен старался по мере сил документировать внутренности: там довольно много комментариев. но понять всё это очень сложно (я сейчас про кодоген), потому что частности пояснены, но чтобы составить общую картину — надо прочитать и уложить в голове весь код SSA-бэкэнда. (кстати, я даже не уверен, что там действительно классический SSA: как-то не очень похоже: мне кажется, некоторые преобразования должны требовать починки инвариантов, а я её не увидел; но тут могу ошибаться, глубоко не вникал.)

в качестве Очень Ценного Личного Мнения скажу, что у меня пока что фаворитом является OP2 (и его наследники). просто потому что он простой как полено, и при этом генерирует не самый плохой код. я как-то пытался заглядывать в Fox от A2, но моя слабая психика не выдержала модулей на 400+ и почти 600 кб. мне почему-то кажется, что он не сильно лучше oo2c, и единственный, кто там в чём-то разбирается — это Felix Friedrich (и, может быть, Florian Negele). (автор этого абзаца, если что, с переменным успехом занимается созданием всяческих компиляторов уже лет под пятнадцать, и собаку может нет, но чижика точно на этом съел.)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Пятница, 30 Декабрь, 2022 21:21 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 293
Откуда: Russia
Эта ошибка, а также еще несколько, в свое время были исправлены, но заказчик потерял к компилятору интерес, поэтому изменения не были опубликованы. Я писал автору компилятора, но ответа не получил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Пятница, 30 Декабрь, 2022 22:17 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
остались ли у вас ещё эти патчи? если да — может быть, вы просто выложите их куда-нибудь «как есть»?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Среда, 04 Январь, 2023 20:32 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 293
Откуда: Russia
arisu писал(а):
остались ли у вас ещё эти патчи? если да — может быть, вы просто выложите их куда-нибудь «как есть»?
Увы, поиск не дал результата. Но там вообще всё просто было.
Можно вообще этот оптимизатор выпилить, но нужено учесть, что кроме Си бакенда, там есть и экспериментальный x86 asm


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в компиляторе OO2C
СообщениеДобавлено: Среда, 04 Январь, 2023 20:51 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
Sergej Durmanov писал(а):
Увы, поиск не дал результата.
ясно. жаль.
Sergej Durmanov писал(а):
Можно вообще этот оптимизатор выпилить
ну, я по сути так и сделал: с возврашением там FALSE он частично не активируется. если совсем выпилить — то кодоген пишет ещё больше бессмысленных сдвигов регистров. чтобы нормально починить — надо разбираться во внутренностях, а у меня пока нет настроения это делать.

Sergej Durmanov писал(а):
но нужено учесть, что кроме Си бакенда, там есть и экспериментальный x86 asm

насколько помню, он никогда толком не работал, и так и не вышел из фазы proof-of-concept.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB