[00:20:55] <ada_ru> (I_vlxy_I) Ура! Новая версия компилятора Ады!
[03:55:09] <ada_ru> (avkvlru) А там точно ада есть?
[07:42:26] <ada_ru> (geniepro) отвечает (avkvlru) на <А там точно ада есть…>
ну ада официально часть GCC же
[09:33:56] <ada_ru> (reznikmm) https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89493
[09:34:23] <ada_ru> (reznikmm) Надо бы проверить, вдруг само пофиксилось
[10:41:14] <ada_ru> (avkvlru) Подскажите pls, есть ли смысл делать быструю библиотеку для ввода вывода, что-то наподобие winfastdirect_io, или им уже всё равно никто не пользуется? А то меня direct_io очень раздражает своей тормознутостью...
[10:41:31] <ada_ru> (avkvlru) Кстати под linux он такой-же тормознутый?
[11:48:48] <ada_ru> (reznikmm) Я как-то только Ada.Streams пользуюсь почему-то
[12:15:08] <ada_ru> (nitrocerber) А в Pre и Post можно как-то засунуть итераторы и хитровые выражения? Скажем, у меня аргумент - тот же Map, и я хочу в Post забить, что существует не больше одного ключа из такого-то диапазона значений.
[12:15:46] <ada_ru> (nitrocerber) Или тут уже нужны те самые лямбды, о которых так долго говорили большевики (и которых немаэ) и надо мутить ghost предикат?
[12:18:16] <ada_ru> (nitrocerber) Вроде спаркофаги навводили всяких кванторов... но я их не знаю. И не исключаю, что они работают тока в спаркофагском контексте
[12:30:21] <ada_ru> (reznikmm) Да, можно всё, что хочешь. Только будет же подтормаживать. Кванторы это ж просто
[12:31:05] <ada_ru> (Victor) "-фаги" или "-филы"?
[12:36:08] <ada_ru> (nitrocerber) отвечает (reznikmm) на <Да, можно всё, что х…>
А оно где-нибудь задокументировано во меняемом виде?
[12:36:43] <ada_ru> (nitrocerber) Ну, начальник большой адепт пре и постов... С целью минимизации защитного кода унутрях
[12:36:58] <ada_ru> (nitrocerber) пытаюсь адаптироваться под стиль
[12:37:52] <ada_ru> (reznikmm) отвечает (nitrocerber) на <А оно где-нибудь зад…>
http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-4-5-8.html
[12:38:13] <ada_ru> (reznikmm) отвечает (nitrocerber) на <пытаюсь адаптировать…>
мимикрировать? 😄
[12:39:04] <ada_ru> (reznikmm) У тебя Ordered_Map?
[12:41:49] <ada_ru> (nitrocerber) помойму да
[12:41:54] <ada_ru> (nitrocerber) Хм
[12:42:00] <ada_ru> (nitrocerber) all и some есть
[12:42:08] <ada_ru> (nitrocerber) а "единственный" ?
[12:43:56] <ada_ru> (reznikmm) ну можно найти первый, затем сказать что больше нет (not (for some X...
[12:45:00] <ada_ru> (reznikmm) там есть итератор "начиная с" и есть Floor/ceiling
[12:45:47] <ada_ru> (nitrocerber) таки да можно собрать
[12:45:51] <ada_ru> (nitrocerber) ладнно, то такое
[12:46:19] <ada_ru> (nitrocerber) А ещё вопрос на миллион, как в проектном файле задать левый объектник, чтобы линкер его хватал?
[12:46:50] <ada_ru> (nitrocerber) с командной сроки просто кормишь его largs и норм
[12:46:52] <ada_ru> (reznikmm) это библиотечный проект или для экзешника?
[12:47:03] <ada_ru> (nitrocerber) библа
[12:47:10] <ada_ru> (nitrocerber) будет
[12:47:13] <ada_ru> (nitrocerber) но и то ,и то интересует
[12:48:17] <ada_ru> (reznikmm) package Linker is
for Linker_Options use ("my.o");
[12:48:23] <ada_ru> (reznikmm) это для либы
[12:48:50] <ada_ru> (nitrocerber) Для экзешника чота другое, потому что я именно так и пробовал в наколенном примере и оно не хотит)
[12:49:00] <ada_ru> (nitrocerber) а там наверно не опшнз а свитчез надо?
[12:49:08] <ada_ru> (nitrocerber) опшонз вроде игнорируется в корневом проекте
[12:49:38] <ada_ru> (reznikmm) Для бинаря кажется так:
package Linker is
for Default_Switches ("Ada") use ("my.o");
[12:50:29] <ada_ru> (I_vlxy_I) отвечает (reznikmm) на <Да, можно всё, что х…>
А почему будет подтормаживать?
[12:50:36] <ada_ru> (reznikmm) нас ща выгонят за офтопик 😂
[12:51:09] <ada_ru> (reznikmm) отвечает (I_vlxy_I) на <А почему будет подто…>
ну будет же на каждый вызов проверяться, бегать по мапе
[12:51:14] <ada_ru> (nitrocerber) Да там
[12:51:20] <ada_ru> (nitrocerber) этот вызов будет 1 раз
[12:51:29] <ada_ru> (nitrocerber) за лайфтайм
[12:51:35] <ada_ru> (I_vlxy_I) отвечает (reznikmm) на <ну будет же на кажды…>
ВСЁ ПЛОХО!!1
[12:51:59] <ada_ru> (reznikmm) отвечает (I_vlxy_I) на <ВСЁ ПЛОХО!!1>
по другому только спарк ;)
[12:52:01] <ada_ru> (I_vlxy_I) отвечает (nitrocerber) на <этот вызов будет 1 р…>
Скрипт на Аде? ;-)
[12:52:07] <ada_ru> (nitrocerber) блин, думаю чо не работает, а у меня блин объектник создан в 32 бита, а компилятор в пути 64
[12:52:16] <ada_ru> (I_vlxy_I) отвечает (reznikmm) на <по другому только сп…>
sparkSparkSPARK!
[12:52:26] <ada_ru> (nitrocerber) отвечает (I_vlxy_I) на <Скрипт на Аде? ;-)>
парсинг зашитой базы знаний. распарсил один раз во внутреннее представление и усё
[12:52:56] <ada_ru> (I_vlxy_I) отвечает (nitrocerber) на <парсинг зашитой базы…>
Неплохо! Тогда реально пофиг
[12:52:58] <ada_ru> (reznikmm) отвечает (I_vlxy_I) на <sparkSparkSPARK!>
да ну нафик, хочется же быстро гомнокодить, а не мучатся 😂
[12:53:27] <ada_ru> (I_vlxy_I) отвечает (reznikmm) на <да ну нафик, хочется…>
Это правда :-)
[12:53:37] <ada_ru> (nitrocerber) А мож вы мне ещё и раскажете, как правильно делать obcopy для 64битной архитектуры?)
[12:53:41] <ada_ru> (reznikmm) отвечает (nitrocerber) на <ладнно, то такое>
Блин, а я уже пробовать кинулся 😄
[12:54:11] <ada_ru> (reznikmm) отвечает (nitrocerber) на <А мож вы мне ещё и р…>
также как и для остальных? нет?
[12:55:46] <ada_ru> (nitrocerber) objcopy -I binary -O elf32-i386 --binary-architecture i386 boo boo.o
замена 32 на 62 не помогает))) я в этой команде понимаю ровно два последних аргумента😂
[12:57:06] <ada_ru> (I_vlxy_I) у тебя ж тут для x86?
[12:57:25] <ada_ru> (nitrocerber) а как сделать для x86_64?
[12:57:31] <ada_ru> (nitrocerber) куда чо дописать
[12:57:43] <ada_ru> (nitrocerber) я подозреваю, что надо бинари аркитектуре тоже поменять
[12:57:49] <ada_ru> (I_vlxy_I) да
[12:57:51] <ada_ru> (nitrocerber) на что?
[12:57:58] <ada_ru> (nitrocerber) тупо _64 хвостиком?_
[12:58:20] <ada_ru> (nitrocerber) явно нет, он такого не знает
[12:58:56] <ada_ru> (nitrocerber) i686 тож не хотет
[12:59:21] <ada_ru> (I_vlxy_I) --info
[12:59:32] <ada_ru> (I_vlxy_I) objcopy --info
[12:59:38] <ada_ru> (I_vlxy_I) запусти - оно выдаст список
[13:01:28] <ada_ru> (reznikmm) elf64-x86-64 наверное
[13:01:45] <ada_ru> (nitrocerber) ну в списке 64 ваще нет
[13:01:50] <ada_ru> (nitrocerber) никаких)
[13:02:06] <ada_ru> (reznikmm) у тебя objcopy 32-хбитный
[13:02:17] <ada_ru> (I_vlxy_I) СТРАДАТЬ!
[13:02:28] <ada_ru> (nitrocerber) а, блед
[13:02:35] <ada_ru> (nitrocerber) сэндбокс насрал
[13:02:36] <ada_ru> (reznikmm) поставь другой тулчейн
[13:02:45] <ada_ru> (I_vlxy_I) используй dicker!
[13:03:09] <ada_ru> (reznikmm) отвечает (I_vlxy_I) на <используй dicker!>
на венде только его, да 😂
[13:04:02] <ada_ru> (nitrocerber) всё, нашОл
[13:04:04] <ada_ru> (nitrocerber) аригато
[13:04:14] <ada_ru> (nitrocerber) я и забыл, что окружение покурочил
[13:04:27] <ada_ru> (nitrocerber) долбанёшься всё это на виндузе собирать😂
[13:05:34] <ada_ru> (I_vlxy_I) эмм... так у тебя ж elf, какая нафиг винда? в виндах же PE
[13:08:09] <ada_ru> (nitrocerber) на 32 битах работает😂
[13:08:21] <ada_ru> (nitrocerber) мож сягвин чо мухлюет
[13:08:33] <ada_ru> (nitrocerber) я вообще ничерта в этом не понимаю (и чесгря понимать не хочу)
[13:08:44] <ada_ru> (nitrocerber) но приходится
[13:09:22] <ada_ru> (I_vlxy_I) приходится сушить мозги программированием? 🙂
[13:09:40] <ada_ru> (nitrocerber) программирование - это высокоуровневые абстракции))
[13:09:53] <ada_ru> (nitrocerber) а это какая-то дичь, привязанная к железу))
[13:10:16] <ada_ru> (nitrocerber) ща придёт досочник и подвергнет меня экстерминатусу
[13:10:54] <ada_ru> (I_vlxy_I) досочник спит небось 🙂
[13:10:59] <ada_ru> (nitrocerber) кароч шо то, шо это. не привязывается оно, undefined reference и воруй-убивай
[13:11:13] <ada_ru> (nitrocerber) нафиг, буду 32битку куртить
[13:11:33] <ada_ru> (nitrocerber) а с этими пирогами потом пущай системщики сношаются
[13:11:37] <ada_ru> (reznikmm) 😕
[13:12:14] <ada_ru> (I_vlxy_I) отвечает (nitrocerber) на <а с этими пирогами п…>
о! у вас там разделение труда? 🙂
[13:12:43] <ada_ru> (I_vlxy_I) и, как я понимаю, в объектнике/бинаре как раз база знаний и лежит? 🙂
[13:13:01] <ada_ru> (nitrocerber) да тупо стринга здоовенная
[13:13:45] <ada_ru> (nitrocerber) тупо импортишь binari_filename_start и binary_filename_end и окок
[13:13:57] <ada_ru> (nitrocerber) но тока в 32 окок, а в 64 покамест не выходит у меня
[13:14:34] <ada_ru> (I_vlxy_I) о! а в плюсах я бы её тупо заинклюдил 🙂
[13:14:43] <ada_ru> (I_vlxy_I) #include <myblob>
[13:14:45] <ada_ru> (I_vlxy_I) 🙂
[13:14:51] <ada_ru> (I_vlxy_I) наверное
[13:15:28] <ada_ru> (I_vlxy_I) а, не, точно заинклюдил бы. raw strings c с++17 есть. Так что норм было бы
[13:15:39] <ada_ru> (I_vlxy_I) платформонезависимо и без всяких objcopy
[13:16:17] <ada_ru> (nitrocerber) Ну там уже поднялась некая волна, что это полезный юзкейс и надо бы что-то делать. Хз ,чем кончится.
[13:16:45] <ada_ru> (nitrocerber) но кончится явно сильно позже, чем мне надо
[13:17:00] <ada_ru> (nitrocerber) Ну так-то стринга - это частный случай
[13:17:07] <ada_ru> (I_vlxy_I) препрофессор рулит!
[13:17:21] <ada_ru> (nitrocerber) ну это дичь)))
[13:17:22] <ada_ru> (nitrocerber) хотя
[13:17:37] <ada_ru> (nitrocerber) препроцессором тоже можно)
[13:17:51] <ada_ru> (nitrocerber) правда сорс файл с блобом - это уныло
[13:18:36] <ada_ru> (I_vlxy_I) да ладно, компилятор он железный, все вытянет 🙂
[13:18:53] <ada_ru> (I_vlxy_I) а для программиста то в самом сорсе не будет блоба
[13:18:56] <ada_ru> (I_vlxy_I) и нормально!
[13:20:53] <ada_ru> (nitrocerber) Но тогда надо приложить сам блоб
[13:22:57] <ada_ru> (I_vlxy_I) да, рядом с исходниками
[13:23:23] <ada_ru> (I_vlxy_I) но тебе и так его приложить придется. линкеру же объектник нужен будет один фиг
[13:23:46] <ada_ru> (nitrocerber) то да
[13:24:11] <ada_ru> (nitrocerber) хз, что предпочтительнее, мб решение политическое
[13:24:18] <ada_ru> (nitrocerber) надо закинуть на обсуждение
[13:24:37] <ada_ru> (nitrocerber) хотя препроцессор я капец не люблю
[13:24:53] <ada_ru> (nitrocerber) Интересно, а для externally_built библ как это будет работать?
[13:25:18] <ada_ru> (nitrocerber) в сырцах - директивы, а объекты уже по месту?
[13:25:58] <ada_ru> (I_vlxy_I) externally_built - это что такое?
[13:26:14] <ada_ru> (nitrocerber) предустановленные
[13:26:20] <ada_ru> (nitrocerber) флажок в gpr файле
[13:26:35] <ada_ru> (nitrocerber) ничего не пересобирается для этого проекта, берётся усё как есть
[13:27:26] <ada_ru> (I_vlxy_I) типа бинарь уже есть?
[13:27:37] <ada_ru> (nitrocerber) угу
[13:27:53] <ada_ru> (reznikmm) AWS как-то умеет в себя влинковывать ресурсы, типа как фаловая система внутри сервера
[13:31:03] <ada_ru> (nitrocerber) ой я на это смотрел
[13:31:19] <ada_ru> (nitrocerber) умеет, но там половину aws надо вынуть
[13:31:27] <ada_ru> (nitrocerber) ну, не половину, я клозуру определил
[13:31:34] <ada_ru> (nitrocerber) но там надо это курочить всё
[13:31:40] <ada_ru> (nitrocerber) хмм
[13:31:41] <ada_ru> (reznikmm) https://docs.adacore.com/aws-docs/aws/resources.html#building-resources
[13:32:02] <ada_ru> (nitrocerber) ld всё это делает проще, ей не надо подсовывать архитектуры итд
[13:32:11] <ada_ru> (nitrocerber) но на 64 битах всё равно не линкуется
[13:32:20] <ada_ru> (reznikmm) там у них какая-то своя приблуда закостылена...
[13:32:55] <ada_ru> (nitrocerber) опа
[13:33:00] <ada_ru> (nitrocerber) ну-ка ну-ка
[13:33:43] <ada_ru> (nitrocerber) да жёёёёваный крот
[13:35:12] <ada_ru> (nitrocerber) на 32
binary_FILENAME_start
binary_FILENAME_end
на 64 битах
_binary_FILENAME_start
_binary_FILENAME_end
[13:35:16] <ada_ru> (nitrocerber) это кто вообще додумался
[13:35:33] <ada_ru> (I_vlxy_I) отвечает (nitrocerber) на <на 32
binary_FILENA…>
Это чего такое?
[13:36:23] <ada_ru> (nitrocerber) символы, указывающие на старт и конец блоба
[13:36:45] <ada_ru> (I_vlxy_I) НЕПЛОХО
[13:40:08] <ada_ru> (I_vlxy_I) картинка https://www.ada-ru.org/files/bot/2020-05-08-x4.jpg
[13:48:32] <ada_ru> (nitrocerber) отвечает (nitrocerber) на <символы, указывающие…>
интересно, а их можно кастомизировать?
[14:21:39] <ada_ru> (nitrocerber) дело не в бабине
[14:21:45] <ada_ru> (nitrocerber) символы генерятся правильно
[14:30:17] <ada_ru> (I_vlxy_I) отвечает (nitrocerber) на <дело не в бабине>
А в чем?
[14:31:25] <ada_ru> (nitrocerber) пока не знаю
[14:33:52] <ada_ru> (nitrocerber) или я очень круто нагадил где-то в тулчейн, или прагма Import странно работает на 32
[14:40:17] <ada_ru> (avkvlru) кстати обнаружил странный баг. В старых версиях ады, операторы корректно подключались фразой with, в новых - с ними глюки. Например тот код флока, что я залил- на современных компиляторах просто отказывался компилироваться, пришлось переоформить переопредления операторов в прямые вызовы
[14:45:04] <ada_ru> (I_vlxy_I) Можешь минимальный пример написать где это видно? Чтобы народ тут мог оценить.
[14:52:54] <ada_ru> (nitrocerber) отвечает (nitrocerber) на <пока не знаю>
кароч как-то не так я импортировал
[14:54:34] <ada_ru> (nitrocerber) надо было линк нейм
[14:54:44] <ada_ru> (nitrocerber) а у меня по ходу был экстернал нейм
[14:54:53] <ada_ru> (nitrocerber) фигли оно по-разному на разной битности я хз
[15:23:31] <ada_ru> (reznikmm) отвечает (nitrocerber) на <или я очень круто на…>
Там есть External_Name, есть Linked_Name, попробуй поменять одно на другое
[15:23:53] <ada_ru> (nitrocerber) ну вот на Link_Name норм
[15:24:03] <ada_ru> (nitrocerber) а в чём промеж них разница?
[15:24:35] <ada_ru> (reznikmm) ну наверное чтобы наступать на эти грабли 😕 Я хз
[15:25:31] <ada_ru> (avkvlru) минут через 10
[15:35:13] <ada_ru> (reznikmm) @nitrocerber Мне надо такое же, только для секции констант, как это сделать? ты умеешь? Я хочу определить по адресу объекта (конкретнее "строкового литерала"), это константа или нет
[15:36:05] <ada_ru> (reznikmm) чтобы оптимизировать; делать преобразование констант в матрёшке в Universal_String только один раз.
[15:48:24] <ada_ru> (avkvlru) with Interfaces.C;
...
FLMode:=LOCKFILE_FAIL_IMMEDIATELY or LOCKFILE_EXCLUSIVE_LOCK - в старых компиляторах работает без проблем.
В новых, его приходится записывать через
FLMode:=Interfaces.C."or"(LOCKFILE_FAIL_IMMEDIATELY , LOCKFILE_EXCLUSIVE_LOCK );
[15:51:14] <ada_ru> (reznikmm) отвечает (avkvlru) на <with Interfaces.C;
.…>
Можно/нужно сделать use Interfaces.C; или use type Interfaces.C.<какой там тип>;
[15:51:52] <ada_ru> (avkvlru) Теоретически возможно это ошибка старых компиляторов кочевавшая из одного в другой, но трюк с подключением переопределений оператором with (без use) встречается прямо в коде библиотек)
[15:53:49] <ada_ru> (avkvlru) use Interface.C - приводит к множественным конфликтам , поэтому проще сделать второй вариант.
[16:01:45] <ada_ru> (nitrocerber) отвечает (reznikmm) на <@nitrocerber Мне над…>
Эээ?
[16:02:29] <ada_ru> (nitrocerber) Типа как эмбеднуть-то?
[16:13:46] <ada_ru> (reznikmm) Ну вот есть у меня в коде вызов To_Universal_String ("abc"), я хочу внутри взять адрес первого символа и узнать, лежит он в секции констант или нет. Если да, я знаю что аргументтникогда не поменяется и могу закешировать результат, чтобы не пересоздавать его каждый раз
[16:15:30] <ada_ru> (nitrocerber) о_О ох, я фиг знает. эт чот сильно далеко от того, что я леплю, я даж не понял, как ты выстроил подобие
[16:16:22] <ada_ru> (reznikmm) Ну тоже нужны символы _begin, _end но только для всей секции констант
[16:16:50] <ada_ru> (nitrocerber) а там фиксированное имя? в моём-то случае имя от эмбеддируемого файла берётся
[16:17:42] <ada_ru> (reznikmm) Мне надо для всех файлов
[16:18:19] <ada_ru> (reznikmm) Линкер же их все объединит в непрерывную область памяти
[16:18:36] <ada_ru> (nitrocerber) Да у меня-то всё педально, единственный файл,
Start : constant Character;
pragma Import (C, KB_Start, Link_Name => "_begin_");
End : constant Character;
pragma Import (C, KB_End, Link_Name => "_end_");
и дальше 'Address
[16:19:14] <ada_ru> (nitrocerber) Если ты знаешь Link_Name...
[16:19:40] <ada_ru> (reznikmm) А сами символы кто создаёт?
[16:19:45] <ada_ru> (nitrocerber) ld
[16:19:51] <ada_ru> (nitrocerber) ну или обжкопи
[16:20:41] <ada_ru> (nitrocerber) я натравливаю ld на файл, получаю .o
[16:20:53] <ada_ru> (nitrocerber) с этими символами и контентом промеж
[16:21:02] <ada_ru> (nitrocerber) и подсовываю его во время линковки
[16:21:14] <ada_ru> (nitrocerber) а с адской стороны эспорчу эти символы
[16:26:24] <ada_ru> (nitrocerber) Я боюсь хрен ты предугадаешь, какие там имена. Я правда про содержимое объектных файлов начал узнавать только сегодня с помощью гугла)
[16:26:28] <ada_ru> (nitrocerber) из меня тот ещё советчик
[16:32:10] <ada_ru> (reznikmm) Интересно, а в DLLу каждой своя секция констант или они объединяются в непрерывный участок памяти
[16:35:29] <ada_ru> (nitrocerber) Хм, интересно вообще, в каких-нибудь языках можно узнать, константа это чи ни
[16:36:05] <ada_ru> (nitrocerber) про длл хз даж как их смотреть
[16:55:16] <ada_ru> (avkvlru) отвечает (reznikmm) на <Интересно, а в DLLу …>
Своя, насколько я помню.
[17:06:20] <ada_ru> (sergey_dukov) <прислал документ>
[17:14:58] <ada_ru> (sergey_dukov) отвечает (nitrocerber) на <про длл хз даж как и…>
В SDK есть утилита "dumpbin.exe". Она показывает всё, вплоть до дизассемлерных кодов!
[17:24:14] <ada_ru> (sergey_dukov) отвечает (nitrocerber) на <про длл хз даж как и…>
Есть так же утилита "Quick View Plus". Показывает заголовки PE-файлов, импорт и экспорт, список секций и их атрибуты. (Только нужна не последняя версия 14,0 а какая ни будь предыдущая)
[17:46:29] <ada_ru> (I_vlxy_I) отвечает (nitrocerber) на <Хм, интересно вообще…>
Есть константы которые не в секции констант :-)
[17:46:49] <ada_ru> (I_vlxy_I) Константа времени компиляции. Она может не иметь адреса вовсе
[17:47:17] <ada_ru> (sergey_dukov) отвечает (nitrocerber) на <про длл хз даж как и…>
И, наконец, мощная утилита из MINGW или CYGWIN "objdump".
[17:49:14] <ada_ru> (reznikmm) отвечает (I_vlxy_I) на <Константа времени ко…>
У строковой константы всега есть адрес! Кажется 😊
[17:49:30] <ada_ru> (I_vlxy_I) отвечает (reznikmm) на <У строковой констант…>
А это от языка зависит :-)
[17:49:51] <ada_ru> (reznikmm) другие языки мне не интересны 😋
[17:58:18] <ada_ru> (I_vlxy_I) как грубо!
[17:58:20] <ada_ru> (I_vlxy_I) 🙂
[18:05:59] <ada_ru> (sergey_dukov) отвечает (I_vlxy_I) на <А это от языка завис…>
В GCC все объектные коды генерирует один генератор кодов. Так что устройство объектных кодов мало чем отличается для различных языков, входящих в GCC.
[18:06:24] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <В GCC все объектные …>
до бэкенда константа может и не доехать
[18:09:05] <ada_ru> (sergey_dukov) Да, если в секции .text
[18:09:27] <ada_ru> (I_vlxy_I) ну, то есть как бы попробуйте найти хоть одну строку тут: https://godbolt.org/z/cCTrX_
[18:09:35] <ada_ru> (I_vlxy_I) (в асме справа)
[18:10:19] <ada_ru> (I_vlxy_I) хотя в коде их тут аж две
[18:15:22] <ada_ru> (I_vlxy_I) причем, замечу, тут даже оптимизации все отключены
[18:19:38] <ada_ru> (sergey_dukov) %c" — это нормальная константа и в какой ни будь секции она будет. Вторая — это число и компилятор, по всей видимости, вычислит это число и подставит его в качестве операнда в инструкцию процессора.
[18:20:17] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <%c" — это нормальная…>
Не будет. Все секции асме видны
[18:20:37] <ada_ru> (I_vlxy_I) Ни в одной из секций этой строки из трёх символов не будет
[18:23:02] <ada_ru> (sergey_dukov) А это фрагмент не из С или С++?
[18:31:26] <ada_ru> (sergey_dukov) Возможно компилятор засунет константу в целую константу. Но если посмотрите бинарный код, вы увидите эту константу в секции ".text". И всё же она будет в явном виде!
[18:35:38] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <Возможно компилятор …>
Дык там есть асм справа
[18:35:45] <ada_ru> (I_vlxy_I) Нет там этой константы :-)
[18:36:15] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <А это фрагмент не из…>
Очевидно, что фрагмент из с++ или Си. Где ещё есть printf?
[18:45:24] <ada_ru> (sergey_dukov) Тут зависит нет от ЯП а от конкретной реализации компилятора. Здесь компилятор согласно своим INSTRICT-правилам перевёл вызов printf в вызов putc. Другой компилятор языка С этого делать не будет.
[18:49:08] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <Тут зависит нет от Я…>
Это зависит и от языка тоже. Если в стандарте языка сказано, что любая строка всегда должна быть адресуема, то такая оптимизация будет запрещена. И ее не будет.
[19:00:41] <ada_ru> (sergey_dukov) В стандарте не указан способ генерации кодов. И, скорее всего, эту отсебятину вносит не сам компилятор, а генератор кодов для С, С++. Но, по-моему, эту отсебятину можно запретить опциями.
Я сторонник того, чтобы компилятор делал то что я ему говорю.
[19:04:49] <ada_ru> (sergey_dukov) По стандарту fprintf — такая же функция как и все другие. INSNRICT-правила оптимизации не входят в стандарт.
[19:12:02] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <В стандарте не указа…>
Нет. Это преобразование на middle end’e происходит. Не на фронте
[19:12:50] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <По стандарту fprintf…>
Нет. По стандарту языка вся стандартная либа может быть вшита в компилятор и реализована не как обычная либа.
[19:17:29] <ada_ru> (reznikmm) В стандарте ады написано, что любой "сложный" тип передаётся в подпрограмму по ссылке. Т.е. имеет адрес
[19:19:11] <ada_ru> (I_vlxy_I) отвечает (reznikmm) на <В стандарте ады напи…>
Можно проверить gnat на кошерность значит :-)
[19:19:21] <ada_ru> (I_vlxy_I) А инлайн запрещен?
[19:19:42] <ada_ru> (sergey_dukov) Именно, стандарт этого не запрещает. И всё зависит от реализации, а не от ЯП.
[19:20:31] <ada_ru> (reznikmm) наверное и в С так, просто компилятор сишком умный и знает, что в (конкретно) printf не нужен адрес
[19:21:08] <ada_ru> (reznikmm) отвечает (I_vlxy_I) на <А инлайн запрещен?>
нет, но что это меняет. это же не запрещает мне взять адрес
[19:42:09] <ada_ru> (sergey_dukov) отвечает (reznikmm) на <В стандарте ады напи…>
В GNAT куча своих "инстриктов". В AdaMagic они свои. Хотя стандарт один и тотже (я имею ввиду GNAT в режиме АДЫ95. И эти инстрикты зависят от платформы. В AdaMagic добавляются инстрикты компилятора С или С++, а в GNAT добавляются инстрикты генератора кода GCC. Но стандарт не запрещает "инстрикты". Так что тут ситуация такая же как и в СИ. Хотя в СИ предложением типа — "#define NOINSTRICT" можно запретить подмену вызовов функций, то АДЕ такого отката нет. Так что ни один компилятор АДЫ (а их осталось всего один) теста на кошерность не пройдёт!
[20:24:07] <ada_ru> (reznikmm) я не знаю в каком месте GNAT нарушает стандарт.
[20:46:42] <ada_ru> (mister_alexander) отвечает (sergey_dukov) на <В GNAT куча своих "и…>
А что такое инстрикты?
[20:48:09] <ada_ru> (nitrocerber) Хммм. Странную хрень наблюдаю. У меня есть сточка в 183895 символов. Я открываю файл, делаю Ada.Text_IO.Put в файл и закрываю файл. Какого-то хрена в результирующем файле 2 строчки.
[20:48:18] <ada_ru> (nitrocerber) откуда нахрен взялся перенос строки?
[20:49:03] <ada_ru> (nitrocerber) строчка получена склеиванием Get_Line из других файлов, всё в рамках одной файловой системы
[20:49:15] <ada_ru> (nitrocerber) всяких CL и CF быть не должно
[21:02:10] <ada_ru> (sergey_dukov) Это некие правила реализации, где что делается не так, как рекомендовано стандартом. Что то типа того. Я до сих пор не могу найти соответствующий перевод слову "ITEM". В АДЕ есть прагма "instrict". Некая внутренняя особенность компилятора. Что-то вроде того. Наверное где-то в RM2012 есть точное определение этого.
[21:07:36] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <В GNAT куча своих "и…>
Нельзя. Это не работает же. Такого макроса нет в стандарте c++ и Си.
[21:08:10] <ada_ru> (I_vlxy_I) И да, я проверил - реально не работает
[21:09:28] <ada_ru> (I_vlxy_I) пруф: https://godbolt.org/z/3X2t4A
[21:10:53] <ada_ru> (sergey_dukov) отвечает (reznikmm) на <я не знаю в каком ме…>
По моему, структуры которые вмещаются в одно 64 разрядное слово на платформе AMD64, при передаче по значению, передаются действительно побитном значением, а не как обычно ссылкой.
[21:12:08] <ada_ru> (reznikmm) отвечает (sergey_dukov) на <По моему, структуры …>
Этого не может быть 😁
[21:12:46] <ada_ru> (I_vlxy_I) юзайте godbolt же, ну! именно там проще всего проверить. сразу виден асм
[21:20:53] <ada_ru> (sergey_dukov) отвечает (reznikmm) на <Этого не может быть …>
Вот такая в GNAT инстринктная оптимизация, хотя точно сказать это я не могу. Но помнится что это так. И это не нарушает стандарт. Это в стандарте подобные отступления разрешены. Просто нужно указать в это в соответствующей спецификации.
[21:32:47] <ada_ru> (sergey_dukov) отвечает (I_vlxy_I) на <пруф: https://godbol…>
Я имел в ввиду, что подобный макрос существует. Если вы на платформе Intel, то поищите определение в инклуде функций memcpy, memmove или memset. Там вы найдёте подобный макрос, который запрещает подмену этих функций. И опять же не стандарт, а особенность конкретного компилятора на конкретной платформе.
[21:33:22] <ada_ru> (I_vlxy_I) дык для платформы интел компиляторов плюсов есть как минимум 4 штуки
[21:33:37] <ada_ru> (I_vlxy_I) а компиляторов Си вообще огромное количество 🙂
[21:38:09] <ada_ru> (I_vlxy_I) В любом случае, вот реализация memcpy: https://github.com/gcc-mirror/gcc/blob/master/libssp/ssp/string.h#L55
[21:38:12] <ada_ru> (I_vlxy_I) где тут этот макрос?
[21:42:00] <ada_ru> (sergey_dukov) отвечает (nitrocerber) на <Хммм. Странную хрень…>
Это глюк компилятора GNAT. Эта проблема уже всплывала на этом. Спросите Максима. Он тогда точную причину и место затыка. Это было связано с индексной арифметикой для больших массивов.
[21:42:29] <ada_ru> (nitrocerber) та это и на строчке в 3 буквы вылазит
[21:42:52] <ada_ru> (sergey_dukov) А вот он "#if __SSP_FORTIFY_LEVEL > 0"
[21:44:02] <ada_ru> (sergey_dukov) отвечает (I_vlxy_I) на <где тут этот макрос?>
А вот он "#if __SSP_FORTIFY_LEVEL > 0"
[21:44:39] <ada_ru> (I_vlxy_I) эммм.. нет. кажется это что-то другое
[21:44:57] <ada_ru> (I_vlxy_I) в любом случае, кажется, я не тот memcpy нашел 🙂 надо ж в glibc искать
[21:45:48] <ada_ru> (I_vlxy_I) а этот макрос - про опцию компиляции которая используется для защиты стека
[21:49:44] <ada_ru> (I_vlxy_I) вот кажется кошерное место:
https://github.com/bminor/glibc/blob/master/sysdeps/i386/memcopy.h#L20
[21:49:48] <ada_ru> (I_vlxy_I) https://github.com/bminor/glibc/blob/master/string/memcpy.c#L29
[21:51:49] <ada_ru> (sergey_dukov) Но запретит переназначение функций. Эти функции есть в библиотеке. Но на Intel обычно все компиляторы используют встроенные функции.
[21:52:12] <ada_ru> (I_vlxy_I) см выше ссылку на исходники glibc
[22:01:52] <ada_ru> (sergey_dukov) отвечает (nitrocerber) на <та это и на строчке …>
У вас массив размером 183895. В библиотеке исполнения просходит переполнение типа Positive. Нужно попытаться как-то это обойти.
[22:02:10] <ada_ru> (nitrocerber) да я проверил на строчке в 3 кэректера
[22:02:23] <ada_ru> (nitrocerber) всё равно всё равно перенос строки появляется
[22:07:59] <ada_ru> (sergey_dukov) отвечает (nitrocerber) на <всё равно всё равно …>
У вас индекс обнуляется, весь массив пропадает. А дальнейшие действия добавляют в файл лишь эти три символа.
[22:17:35] <ada_ru> (sergey_dukov) отвечает (I_vlxy_I) на <вот кажется кошерное…>
Второй неудачный. Он показывает как реализовать оптимальный вариант функции. Искать нужно не в исходниках, а в стандартных include компилятора. Сейчас попробую найти фрагмент из MINGW. Он там он точно есть.
[22:21:41] <ada_ru> (I_vlxy_I) отвечает (sergey_dukov) на <Второй неудачный. Он…>
первый вариант - это потроха компилятора, а не стандартная сишная либа
[22:21:45] <ada_ru> (I_vlxy_I) к сожалению
[22:21:54] <ada_ru> (I_vlxy_I) то есть когда пишешь memcpy, то будет использоваться вот та штука
[22:21:58] <ada_ru> (I_vlxy_I) которая в glibc
[22:23:06] <ada_ru> (I_vlxy_I) но, в любом случае, как мне вот тут сделать так, чтобы printf не заменяли на putchar? https://godbolt.org/z/mtGSgA
[23:22:04] <ada_ru> (sergey_dukov) отвечает (I_vlxy_I) на <первый вариант - это…>
Вы правы! Нет подобного макроса. Что-то я сегодня совсем заврался. Прошу меня простить. Где-то я читал, что компиляторы заменяют эти функции встроенными. Но это, оказывается, никак не отражено в хеадерах. Может только в опциях компилятора, но и в этом я не уверен.