OberonCore
https://forum.oberoncore.ru/

Необычный вывод при компиляции
https://forum.oberoncore.ru/viewtopic.php?f=1&t=5802
Страница 1 из 1

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

Первый раз столкнулся с таким выводом компилятора. Кто подскажет, что это значит?

Цитата:
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.

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

Oleg N. Cher писал(а):
Я имею в виду вот это самое AX AX.
Похоже на пару символов перевода строки 0AX.

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

Это видимо вот отсюда 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;

Автор:  Oleg N. Cher [ Четверг, 07 Июль, 2016 01:47 ]
Заголовок сообщения:  Re: Необычный вывод при компиляции

Сделал рыбу, воспроизводящую вывод компилятора.

Код:
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.

Автор:  maliya [ Четверг, 07 Июль, 2016 10:36 ]
Заголовок сообщения:  Re: Необычный вывод при компиляции

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

Автор:  Oleg N. Cher [ Пятница, 08 Июль, 2016 01:07 ]
Заголовок сообщения:  Re: Необычный вывод при компиляции

So it was not a warning, and a bug in compiler? :shock:

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

Автор:  maliya [ Пятница, 08 Июль, 2016 05:13 ]
Заголовок сообщения:  Re: Необычный вывод при компиляции

Цитата:
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.

Автор:  Oleg N. Cher [ Пятница, 08 Июль, 2016 06:53 ]
Заголовок сообщения:  Re: Необычный вывод при компиляции

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.

Автор:  maliya [ Пятница, 08 Июль, 2016 10:09 ]
Заголовок сообщения:  Re: Необычный вывод при компиляции

Цитата:
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

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

Йозеф Темпл еще немного улучшил исправление LuoWy и опубликовал в хранилище ЦКБ.
http://redmine.blackboxframework.org/pr ... 87783e090e

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

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

Автор:  Oleg N. Cher [ Вторник, 09 Август, 2016 22:14 ]
Заголовок сообщения:  Re: Необычный вывод при компиляции

Отлично, Иван! Благодарю за новость.
maliya писал(а):
I don't know what your mean
I'm sorry, problems of machine translation.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/