Чиним Win64
Чиним Win64
Случилось самое страшное - повреждение кучи. К счастью, оно происходит сразу. Ищем место, где оно возникло.
===============
4b50c976ac Пересобрал Win32-iz-Win32 (пПиши можно вызывать рекурсивно) - 03.01.2025 - падает
===============
Ревизия: 82869ef0a702a4a2f8a4705c36df3f41e4dd2c01
Автор: Денис Будяк <budden73@mail.ru>
Дата: 29.12.2024 20:05:01
Сообщение:
Пересобрал Win32-iz-Win32 - надо удалить из сборки ТестМетаПечати, а также править где не соответствует цел32 и размерМЗ - падает
===============
Ревизия: f1a15d0b48d4d7e57f195d8015f36bedf77718a4
Автор: Денис Будяк <budden73@mail.ru>
Дата: 25.12.2024 14:31:24
Сообщение:
Дважды пересобрал Win32-iz-Win32 - падает
===============
Ревизия: 917f0e20ba4fc001fe4048adfce99231fe8878d5
Автор: Денис Будяк <budden73@mail.ru>
Дата: 24.12.2024 14:56:14
Сообщение:
Пересобрал Win32-iz-Win32
===============
Ревизия: 5a07b0aa02b34af3a1492fab733c3e8d1b9958c1
Автор: Денис Будяк <budden73@mail.ru>
Дата: 24.12.2024 12:27:06
Сообщение:
Починил сборку и пересобрал Win32-iz-Win32
работает
===============
Ревизия: e1e5b3d6ed2ad363f2f20a1438d3d1dad4e192a8
Дата: 23.12.2024 19:15:24
Пересобрал Win32-iz-Win32 - работает
===============
9a22fa5c5e4b46d65797762d6fbe38143d32bae8 * Пересобрал Win32-iz-Win32, вроде работает * 28.11.2024 - запускается
===============
11ce6a4821a75c8e9667a5a0c778ce405ee86072 - win32-iz-linux64 - 27.11.2024 - неудачная версия с кучей трассировок
===============
SHA-1: 8521564fb7d42b0b37e4e - 25.03.2024 - пересобрал win64-iz-win64, запускается
===============
4b50c976ac Пересобрал Win32-iz-Win32 (пПиши можно вызывать рекурсивно) - 03.01.2025 - падает
===============
Ревизия: 82869ef0a702a4a2f8a4705c36df3f41e4dd2c01
Автор: Денис Будяк <budden73@mail.ru>
Дата: 29.12.2024 20:05:01
Сообщение:
Пересобрал Win32-iz-Win32 - надо удалить из сборки ТестМетаПечати, а также править где не соответствует цел32 и размерМЗ - падает
===============
Ревизия: f1a15d0b48d4d7e57f195d8015f36bedf77718a4
Автор: Денис Будяк <budden73@mail.ru>
Дата: 25.12.2024 14:31:24
Сообщение:
Дважды пересобрал Win32-iz-Win32 - падает
===============
Ревизия: 917f0e20ba4fc001fe4048adfce99231fe8878d5
Автор: Денис Будяк <budden73@mail.ru>
Дата: 24.12.2024 14:56:14
Сообщение:
Пересобрал Win32-iz-Win32
===============
Ревизия: 5a07b0aa02b34af3a1492fab733c3e8d1b9958c1
Автор: Денис Будяк <budden73@mail.ru>
Дата: 24.12.2024 12:27:06
Сообщение:
Починил сборку и пересобрал Win32-iz-Win32
работает
===============
Ревизия: e1e5b3d6ed2ad363f2f20a1438d3d1dad4e192a8
Дата: 23.12.2024 19:15:24
Пересобрал Win32-iz-Win32 - работает
===============
9a22fa5c5e4b46d65797762d6fbe38143d32bae8 * Пересобрал Win32-iz-Win32, вроде работает * 28.11.2024 - запускается
===============
11ce6a4821a75c8e9667a5a0c778ce405ee86072 - win32-iz-linux64 - 27.11.2024 - неудачная версия с кучей трассировок
===============
SHA-1: 8521564fb7d42b0b37e4e - 25.03.2024 - пересобрал win64-iz-win64, запускается
Re: Чиним Win64
Ревизия: f1a15d0b48d4d7e57f195d8015f36bedf77718a4
Автор: Денис Будяк <budden73@mail.ru>
Дата: 25.12.2024 14:31:24
Сообщение:
Дважды пересобрал Win32-iz-Win32 - падает
===============
Ревизия: 917f0e20ba4fc001fe4048adfce99231fe8878d5
Автор: Денис Будяк <budden73@mail.ru>
Дата: 24.12.2024 14:56:14
Сообщение:
Пересобрал Win32-iz-Win32 - работает
===============
Ревизия: 5a07b0aa02b34af3a1492fab733c3e8d1b9958c1
Автор: Денис Будяк <budden73@mail.ru>
Дата: 24.12.2024 12:27:06
Сообщение:
Починил сборку и пересобрал Win32-iz-Win32
работает
Автор: Денис Будяк <budden73@mail.ru>
Дата: 25.12.2024 14:31:24
Сообщение:
Дважды пересобрал Win32-iz-Win32 - падает
===============
Ревизия: 917f0e20ba4fc001fe4048adfce99231fe8878d5
Автор: Денис Будяк <budden73@mail.ru>
Дата: 24.12.2024 14:56:14
Сообщение:
Пересобрал Win32-iz-Win32 - работает
===============
Ревизия: 5a07b0aa02b34af3a1492fab733c3e8d1b9958c1
Автор: Денис Будяк <budden73@mail.ru>
Дата: 24.12.2024 12:27:06
Сообщение:
Починил сборку и пересобрал Win32-iz-Win32
работает
Re: Чиним Win64
Дело в починенной конвертации. Притом, если убрать "починку" и пересобрать сначала систему на Win32, а потом ей пересобрать систему на Win64, то на запускается. Есть две возможности - либо изменённые файлы из директории work не видятся (это можно устранить, скопировав видоизменнные символьлные файлы прямо в директорию bin), либо конвертация используется в самом коде компилятора и поэтому пересборка комилятора с "исправлением" самим собой приводит к дефектному кросс-компилятору win32->win64.
Сейчас я проверяю эту версию, а именно:
* взял компилятор, собранный самим собой до починки
* внёс изменения в LisAMDBackend.Mod
* скопировал файлы в win32/bin, чтобы исключить проблемы конфигурирования (хотя на вид их нет)
* теперь этим компилятором пересобираю Win64.
Если win64 запустится, значит, вторая версия верна.
Сейчас я проверяю эту версию, а именно:
* взял компилятор, собранный самим собой до починки
* внёс изменения в LisAMDBackend.Mod
* скопировал файлы в win32/bin, чтобы исключить проблемы конфигурирования (хотя на вид их нет)
* теперь этим компилятором пересобираю Win64.
Если win64 запустится, значит, вторая версия верна.
Re: Чиним Win64
Запустился. Теперь надо понять, как дальше искать место проблемы. Например, можно сравнивать два набора объектных файлов для Win32 (и сам Oberon.exe) и смотреть хотя бы, в каких файлах разница (думаю, она будет во всех).
Re: Чиним Win64
Или начать с тестов, чтобы понять, правильно ли починено.
Re: Чиним Win64
Тесты уже были и они проходят. Как и ожидалось, разошлось много файлов. Попробую сделать старый вариант и выдать предупреждение там, где поведение может измениться. Посмотрим, где оно изменится.
Re: Чиним Win64
Дошёл до одного места в Linker:
Видимо, следующем действием будет положить рядом две директории - одну с поправленной ЯОС win32, другую - с непоправленной. И смотреть, как себя поведёт данное вычисление - не будет ли разницы. Если поведёт идентично, то нужно искать следующее вхождение LONG 1 в файле
j\предупреждения.txt
Код: Выделить всё
(*
GenericLinker.Address = адресВПамяти;
Bitsets.Bits = размерМЗ;
ObjectFile.Bits = размерМЗ;
*)
(*
unit
проц Linker.Arrangement.Patch (pos, value: GenericLinker.Address; offset, bits1, unit: ObjectFile.Bits);
нач сам.bits.SetBits ((pos - displacement) * unit + offset, bits1, value);
кон Patch; *)
(* проц SetBits* ; *)
(*
проц BitSets.BitSet.SetBits (startPos, bits: Bitsets.Bits ; value: цел64)
1й арг: (адресВПамяти-адресВПамяти)*размерМЗ -> размерМЗ
2й арг: размерМЗ -> размерМЗ
3й арг: адресВПамяти -> цел64
И где здесь изменение?
*)
j\предупреждения.txt
Re: Чиним Win64
Ещё одна идея - собрать Win64 так и сяк и сравнить побайтно. Может быть, сразу станет очевидно, где проблема.
Re: Чиним Win64
Собрал нормальный Win64 - его копирую в Win64.ok. Заодно и нормальный Win32 положил в Win32.ok - ведь его тоже можно сравнить. Теперь надо собрать ненормальные.
Re: Чиним Win64
Как минимум, различие в метаданных, его видно по Beep.GofWw. Видимо, его надо убрать и потом сравнить ещё раз.
Так работает:
А так (после "исправления") - нет:
Так работает:
Код: Выделить всё
рBeeper.OffиBeeper.BeepаBeeper.Beep.@AwaitProcedure0Ш!Beeper.@Body€## #ияяяяяяяШ#Beep€%% %ряяяяяяяияяяяяяяа%TestШ'TestOnР)TestOffИ+@BodyЗ
Код: Выделить всё
рBeeper.OffиBeeper.BeepаBeeper.Beep.@AwaitProcedure0Ш!Beeper.@Body€## #ияяяШ#Beep€%% %ряяяЁ%ияяяа%TestШ'TestOnР)TestOffИ+@BodyЗ
Re: Чиним Win64
Налицо различие в размерах данных.
Re: Чиним Win64
retBOOL : Kernel32.BOOL = целМЗ , сс ТипЦелМЗ = 0AX
ссПроцедура = F2
ссПеременная = F3
ссПроцедура = F2
ссПеременная = F3
Код: Выделить всё
ОбластьВидимости =
ссНачалоВнутрОбластиВидимости = F0
{variable:Переменная} {procedure:Процедура}
{typeDecl:ОбъявлениеТипа}
ссКонецВнутрОбластиВидимости.
Код: Выделить всё
Переменная = ссПеременная = F3
prevSymbolOffset:размерМЗ
name:String (ccОтносительн offset: размерМЗ | ccКосвенн offset: размерМЗ | ccАбсолютн address:адресВПамяти)
type:Тип.
Re: Чиним Win64
Похоже, проблема где-то тут:
Код: Выделить всё
проц чЦел32_7б*( перем x: цел32 );
перем ch: симв8; n, y: цел32;
нач
n := 0; y := 0; ch := чИДайСимв8();
нцПока ch >= 80X делай увел( y, логСдвиг( цел32( кодСимв8( ch ) ) - 128, n ) ); увел( n, 7 ); ch := чИДайСимв8() кц;
x := арифмСдвиг( логСдвиг( цел32( кодСимв8( ch ) ), 25 ), n - 25 ) + y
кон чЦел32_7б;
(** Read a huge number in a compressed format. *)
проц чЦел64_7б*( перем x: цел64 );
перем ch: симв8; n, y: цел64;
нач
n := 0; y := 0; ch := чИДайСимв8();
нцПока ch >= 80X делай увел( y, логСдвиг( цел64( кодСимв8( ch ) ) - 128, n ) ); увел( n, 7 ); ch := чИДайСимв8() кц;
x := арифмСдвиг( логСдвиг( цел64( кодСимв8( ch ) ), 57 ), n - 57 ) + y
кон чЦел64_7б;
Re: Чиним Win64
План на сегодня:
* внимательно посмотреть на код и ещё раз попробовать поймать случай, когда результаты могут расходиться, а именно скорее всего (32битное) размерМЗ := размерМЗ + цел64 или адресВПамяти := адресВПамяти + цел64 или ещё что-то такое.
* откатить изменение. Убедиться с жизнеспособности win64 и её способности собрать себя.
* сделать две отдельные версии - в одной оба компилятора правильные, в другой оба неправильные. Иначе не получается массированно трассировать компилятор
* дальше сравнивать
* внимательно посмотреть на код и ещё раз попробовать поймать случай, когда результаты могут расходиться, а именно скорее всего (32битное) размерМЗ := размерМЗ + цел64 или адресВПамяти := адресВПамяти + цел64 или ещё что-то такое.
* откатить изменение. Убедиться с жизнеспособности win64 и её способности собрать себя.
* сделать две отдельные версии - в одной оба компилятора правильные, в другой оба неправильные. Иначе не получается массированно трассировать компилятор
* дальше сравнивать
Re: Чиним Win64
Было:
Стало:
Код: Выделить всё
аесли destType.sizeInBits > srcType.sizeInBits то (* (implicit) LONG *)
если part = High то
если destType.form = IntermediateCode.SignedInteger то
Код: Выделить всё
если srcLowType.form = IntermediateCode.SignedInteger то
Re: Чиним Win64
Выяснилось, что преобразование цел32 к бцел64 меняется. Об этом компилятор у меня обучен выдавать предупреждения. Попробовал быстро поправить, но не сработало почему-то. Видимо, где-то в другом месте проблема. Переходим к п.2.
Re: Чиним Win64
С линкером не прокатило, второе место:
Проблема может быть при преобразовании из мнвоНаБитахМЗ в цел64, но я не уверен. Посмотрим.
Код: Выделить всё
Basic.Fingerprint = ObjectFile.Fingerprint = цел64
(* проблема здесь *)
FPNumber(fp, fpOther + Basic.Fingerprint(vis))
проц FPVisibility*(перем fp: Basic.Fingerprint; vis: мнвоНаБитахМЗ);
fp : Basic.Fingerprint - типы параметров соответствуют
fpOther = 3 - какого же типа она?
vis: мнвоНаБитахМЗ
Basic.Fingerprint(vis) - преобразует мнвоНаБитахМЗ в цел64.
FPNumber*(перем fp: Basic.Fingerprint; val: цел64)
Re: Чиним Win64
И опять мимо. Ещё одно место:
Код: Выделить всё
проц Address(section: IntermediateCode.Section; value: адресВПамяти);
перем op: IntermediateCode.Operand;
нач
IntermediateCode.InitImmediate(op,IntermediateCode.GetType(module.system, module.system.addressType),value);
проц InitImmediate*(перем op: Operand(*запись*); type: Type(*запись*); value: цел64);
value преобразуется из адресВПамяти (бцел32) в цел64, но это не должно же быть криминалом?