OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 22 Июль, 2017 11:42

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Необычный вывод при компиляции
СообщениеДобавлено: Среда, 06 Июль, 2016 05:44 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 159
Откуда: Украина, Днепропетровская обл.
Первый раз столкнулся с таким выводом компилятора. Кто подскажет, что это значит?

Цитата:
compiling "OfrontOPM" 12152 3176
compiling "OfrontOPT" AX AX 14128 25116
compiling "OfrontOPS" 4744 324
compiling "OfrontOPB" 28492 12
compiling "OfrontOPP" 24484 272
compiling "OfrontOPC" 18016 452
compiling "OfrontOPV" 15052 16

Я имею в виду вот это самое AX AX.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Среда, 06 Июль, 2016 09:32 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2281
Откуда: Россия, Санкт-Петербург
Oleg N. Cher писал(а):
Я имею в виду вот это самое AX AX.
Похоже на пару символов перевода строки 0AX.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Среда, 06 Июль, 2016 11:25 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1833
Откуда: Красноярск
Это видимо вот отсюда DevCPC486
Код:
PROCEDURE CheckReg*;
      VAR reg: SET;
   BEGIN
      reg := AllReg - WReg;
      IF reg # {} THEN
         DevCPM.err(-777); (* register not released *)
         IF AX IN reg THEN DevCPM.LogWStr(" AX") END;
         IF BX IN reg THEN DevCPM.LogWStr(" BX") END;
         IF CX IN reg THEN DevCPM.LogWStr(" CX") END;
         IF DX IN reg THEN DevCPM.LogWStr(" DX") END;
         IF SI IN reg THEN DevCPM.LogWStr(" SI") END;
         IF DI IN reg THEN DevCPM.LogWStr(" DI") END;
         WReg := AllReg; BReg := AllReg * {0..3} + SYSTEM.LSH(AllReg * {0..3}, 4)
      END;
      IF FReg < 8 THEN DevCPM.err(-778); FReg := 8    (* float register not released *)
      ELSIF FReg > 8 THEN DevCPM.err(-779); FReg := 8
      END
   END CheckReg;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Четверг, 07 Июль, 2016 01:47 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 159
Откуда: Украина, Днепропетровская обл.
Сделал рыбу, воспроизводящую вывод компилятора.

Код:
MODULE OfrontAXAX;

   PROCEDURE SymRInt (): LONGINT; BEGIN RETURN 0 END SymRInt;

   PROCEDURE InSign;
      VAR b: BYTE;
   BEGIN
      b := SHORT(SHORT(SHORT(SymRInt())));
      b := SHORT(SHORT(SHORT(SymRInt())));
   END InSign;

END OfrontAXAX.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Четверг, 07 Июль, 2016 10:36 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 35
a fixup,not fully tested

Код:

    PROCEDURE DevCPC486.ConvMove
    ....
    ....
               ELSE
                  IF y.mode # Reg THEN LoadW(y, hint, stop)
                  ELSE IF xform IN {Bool..Int8} THEN FreeHi(y);END; <<add this line
                  END;
                  Free(y);
                  DevCPL486.GenMove(y, x)
               END
            END
         END
      END   
   END ConvMove;

luowy


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Пятница, 08 Июль, 2016 01:07 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 159
Откуда: Украина, Днепропетровская обл.
So it was not a warning, and a bug in compiler? :shock:

Иван Денисов, а что на эту тему скажет Центр?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Пятница, 08 Июль, 2016 05:13 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 35
Цитата:
So it was not a warning, and a bug in compiler? :shock:
it's a warning I think.

Цитата:
compiling "OfrontOPT" AX AX 14128 25116

I made this fixup base on your OfrontAXAX,
I cant find the OfrontOPT module which you compiled.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Пятница, 08 Июль, 2016 06:53 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 159
Откуда: Украина, Днепропетровская обл.
But in OfrontOPT is the same code, the same situation.

If it's only warning - what OMinc wanted to say by it? For what a register output has been done in this case? And another question: why remove this output?

Wening Luo, thanks for your answers.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Пятница, 08 Июль, 2016 10:09 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 35
Цитата:
what OMinc wanted to say by it?
the compiler use a simple register allocation,
it treats each statment as a allocate and release unit.

add CheckReg at end of each statement to warning some release work not done well.
and reset all workable registers used by next statement.
It used for checking the work of releasing regsiters ,warning for the compiler writer only.

Цитата:
For what a register output has been done in this case?
b := SHORT(SHORT(SHORT(SymRInt)))
it convert a longint to a byte at a Reg Mode:
longint y occupy EDX:EAX,AH,AL,we should release EDX:EAX,AH,AL at the end of statment,

it had released EDX by first part of DevCPC486.ConvMove
Код:
 

   | Int64:
               IF xform IN {Bool..Int32, Char16} THEN
                  (* make range checks !!! *)
                  FreeHi(y) <<< EDX releasesd
               END
            END


but the second part has a bug:
Код:
      ELSE (* x.form # real,    y.form # real  *)
            y.form := xform;  <<< this has a side effects,
            IF mode = Stk THEN
               IF ((xform < Int32) OR (xform = Char16)) & (y.mode # Reg) THEN LoadW(y, hint, stop) END;
               Push(y);
            ELSIF mode # Undef THEN
               IF xform = Int64 THEN
                  IF y.mode # Reg THEN LoadLong(y, hint, stop); END;
                  Free(y); y.form := Int32;
                  z := x; z.form := Int32; DevCPL486.GenMove(y, z);
                  IF z.mode = Reg THEN ASSERT(z.reg # y.index); z.reg := z.index
                  ELSE INC(z.offset, 4)
                  END;
                  y.reg := y.index; DevCPL486.GenMove(y, z);
               ELSE
                  IF y.mode # Reg THEN LoadW(y, hint, stop) END;
                  Free(y);<<<<the y.form is Int8,it  only free  AL
 DevCPL486.GenMove(y, x)
               END
            END
         END
      END   
   END ConvMove;


the code y.form := xform; it had a side effects:y.form==Int64 ==> Int8
it make the code Free(y) does only free AL,but AH no relesed,so EAX no released.

the fixup make sure release AH register before release AL to release EAX;


Цитата:
And another question: why remove this output?
I don't know what your mean

luowy


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Вторник, 09 Август, 2016 19:35 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1833
Откуда: Красноярск
Йозеф Темпл еще немного улучшил исправление LuoWy и опубликовал в хранилище ЦКБ.
http://redmine.blackboxframework.org/pr ... 87783e090e

Вот тестовая сборка соответствующая этой фиксации кода:
http://blackboxframework.org/unstable/i ... c1.611.zip

В ней нет этой ошибки. После голосования исправление успеет войти в финальный выпуск 1.7.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Необычный вывод при компиляции
СообщениеДобавлено: Вторник, 09 Август, 2016 22:14 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 159
Откуда: Украина, Днепропетровская обл.
Отлично, Иван! Благодарю за новость.
maliya писал(а):
I don't know what your mean
I'm sorry, problems of machine translation.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

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


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

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


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

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