Чиним Win64

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Чиним Win64

Сообщение БудДен » 08.02.25 22:55

Случилось самое страшное - повреждение кучи. К счастью, оно происходит сразу. Ищем место, где оно возникло.
===============
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, запускается

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 09.02.25 00:55

Ревизия: 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
работает

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 10.02.25 15:25

Дело в починенной конвертации. Притом, если убрать "починку" и пересобрать сначала систему на Win32, а потом ей пересобрать систему на Win64, то на запускается. Есть две возможности - либо изменённые файлы из директории work не видятся (это можно устранить, скопировав видоизменнные символьлные файлы прямо в директорию bin), либо конвертация используется в самом коде компилятора и поэтому пересборка комилятора с "исправлением" самим собой приводит к дефектному кросс-компилятору win32->win64.

Сейчас я проверяю эту версию, а именно:
* взял компилятор, собранный самим собой до починки
* внёс изменения в LisAMDBackend.Mod
* скопировал файлы в win32/bin, чтобы исключить проблемы конфигурирования (хотя на вид их нет)
* теперь этим компилятором пересобираю Win64.

Если win64 запустится, значит, вторая версия верна.

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 10.02.25 15:28

Запустился. Теперь надо понять, как дальше искать место проблемы. Например, можно сравнивать два набора объектных файлов для Win32 (и сам Oberon.exe) и смотреть хотя бы, в каких файлах разница (думаю, она будет во всех).

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 10.02.25 19:47

Или начать с тестов, чтобы понять, правильно ли починено.

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 11.02.25 00:07

Тесты уже были и они проходят. Как и ожидалось, разошлось много файлов. Попробую сделать старый вариант и выдать предупреждение там, где поведение может измениться. Посмотрим, где оно изменится.

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 11.02.25 01:11

Дошёл до одного места в Linker:

Код: Выделить всё

(* 
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

И где здесь изменение?

*)
Видимо, следующем действием будет положить рядом две директории - одну с поправленной ЯОС win32, другую - с непоправленной. И смотреть, как себя поведёт данное вычисление - не будет ли разницы. Если поведёт идентично, то нужно искать следующее вхождение LONG 1 в файле

j\предупреждения.txt

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 11.02.25 12:05

Ещё одна идея - собрать Win64 так и сяк и сравнить побайтно. Может быть, сразу станет очевидно, где проблема.

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 11.02.25 12:48

Собрал нормальный Win64 - его копирую в Win64.ok. Заодно и нормальный Win32 положил в Win32.ok - ведь его тоже можно сравнить. Теперь надо собрать ненормальные.

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 11.02.25 14:05

Как минимум, различие в метаданных, его видно по 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З

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 11.02.25 14:06

Налицо различие в размерах данных.

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 12.02.25 19:52

retBOOL : Kernel32.BOOL = целМЗ , сс ТипЦелМЗ = 0AX

ссПроцедура = F2
ссПеременная = F3

Код: Выделить всё

		ОбластьВидимости = 
			ссНачалоВнутрОбластиВидимости = F0
				{variable:Переменная} {procedure:Процедура}
				{typeDecl:ОбъявлениеТипа} 
			ссКонецВнутрОбластиВидимости.

Код: Выделить всё

		Переменная = ссПеременная = F3
				prevSymbolOffset:размерМЗ 
				name:String (ccОтносительн offset: размерМЗ | ccКосвенн offset: размерМЗ | ccАбсолютн address:адресВПамяти) 
				type:Тип.

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 12.02.25 22:22

Похоже, проблема где-то тут:

Код: Выделить всё

		проц чЦел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б;

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 13.02.25 15:14

План на сегодня:
* внимательно посмотреть на код и ещё раз попробовать поймать случай, когда результаты могут расходиться, а именно скорее всего (32битное) размерМЗ := размерМЗ + цел64 или адресВПамяти := адресВПамяти + цел64 или ещё что-то такое.
* откатить изменение. Убедиться с жизнеспособности win64 и её способности собрать себя.
* сделать две отдельные версии - в одной оба компилятора правильные, в другой оба неправильные. Иначе не получается массированно трассировать компилятор
* дальше сравнивать

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 13.02.25 15:35

Было:

Код: Выделить всё

			аесли destType.sizeInBits > srcType.sizeInBits то (* (implicit) LONG *)
				если part = High то
					если destType.form = IntermediateCode.SignedInteger то
Стало:

Код: Выделить всё

					если srcLowType.form = IntermediateCode.SignedInteger то

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 13.02.25 18:09

Выяснилось, что преобразование цел32 к бцел64 меняется. Об этом компилятор у меня обучен выдавать предупреждения. Попробовал быстро поправить, но не сработало почему-то. Видимо, где-то в другом месте проблема. Переходим к п.2.

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 13.02.25 18:32

С линкером не прокатило, второе место:

Код: Выделить всё

	 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)
Проблема может быть при преобразовании из мнвоНаБитахМЗ в цел64, но я не уверен. Посмотрим.

БудДен
Сообщения: 3033
Зарегистрирован: 07.10.18 14:01

Re: Чиним Win64

Сообщение БудДен » 13.02.25 19:07

И опять мимо. Ещё одно место:

Код: Выделить всё

		проц 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, но это не должно же быть криминалом?
			

Ответить