The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Первый стабильный релиз компоновщика Mold, развиваемого разработчиком LLVM lld, opennews (??), 16-Дек-21, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


60. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от Аноним (60), 17-Дек-21, 00:27 
> template <>
> void GotPltSection<X86_64>::copy_buf(Context<X86_64> &ctx) {

Рили?

Ответить | Правка | К родителю #30 | Наверх | Cообщить модератору

61. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от Аноним (80), 17-Дек-21, 00:42 
То что обычные сишные процедуры зачем-то в виде шаблонов оформлены, сути не меняет. Там за вечер этот 1% кода выкинуть можно и заменить сишными вызовами процедур и будет 100% сишка. А так пока 99% си 1% си++.
Ответить | Правка | Наверх | Cообщить модератору

69. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от n00by (ok), 17-Дек-21, 08:15 
> То что обычные сишные процедуры зачем-то в виде шаблонов оформлены

Интересно, зачем?

    u8 *loc = base + rel.r_offset;

/// ...

    auto write8 = [&](u64 val) {
      overflow_check(val, 0, 1 << 8);
      *loc = val;
    };

/// ...

      write8(S + A);

Ответить | Правка | Наверх | Cообщить модератору

72. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от Аноним (80), 17-Дек-21, 08:56 
> auto write8 = [&](u64 val) {

Легко заменяется на вложенную функцию из GCC C расширения или макрос и дальше можно так же писать
write8(S + A);

Ответить | Правка | Наверх | Cообщить модератору

76. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от Аноним (65), 17-Дек-21, 12:24 
Только тогда теряется либо совместимость со стандартом, либо типобезопасность.
Ответить | Правка | Наверх | Cообщить модератору

79. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от Аноним (18), 17-Дек-21, 12:58 
-stg=gnu99
Ответить | Правка | Наверх | Cообщить модератору

90. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +2 +/
Сообщение от Аноним (65), 17-Дек-21, 18:08 
Вот и я про тоже. Нестандартные расширения GNU.
Ответить | Правка | Наверх | Cообщить модератору

78. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от n00by (ok), 17-Дек-21, 12:36 
Наверное, я что-то уловил, но зачем там вообще лямбда. Вызывается однократно в теле той же функции, где определена.

    u8 *loc = base + rel.r_offset;

/// ...

#ifdef LLL
    auto write8 = [&](u64 val) {
      overflow_check(val, 0, 1 << 8);
      *loc = val;
    };
#endif

/// ...

#ifdef LLL
      write8(S + A);
#else
      overflow_check(S + A, 0, 1 << 8);
      *loc = S + A;
#endif


Ответить | Правка | К родителю #72 | Наверх | Cообщить модератору

91. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от Аноним (65), 17-Дек-21, 18:11 
Может раньше неоднократно вызывалась, потом другие вызовы убрали. Да много причин может быть
Ответить | Правка | Наверх | Cообщить модератору

92. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от n00by (ok), 17-Дек-21, 18:36 
Многократно вызывается write32s. Там switch и write8 вызывается для R_X86_64_8. Больше, вроде, нет подходящих типов релоков. Далее идут прямые записи вида *(u64 *)loc = S + A; Вероятно, изначально хотел единообразие, но потом устал эти лямбды писать на каждый чих.
Ответить | Правка | Наверх | Cообщить модератору

108. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +1 +/
Сообщение от Ordu (ok), 18-Дек-21, 09:17 
> Интересно, зачем?

Возможно, просто как способ сделать код более читаемым. Возможно, как способ повысить maintainability кода инкапсуляцией -- операция write8 вынесена отдельно, и если ты хочешь изменить её, то вот она, тебе не надо весь код функции перелопачивать, выясняя где там мы в loc пишем. Кроме того, если ты присмотришься, тут неявно создаётся локальная переменная val инициализируемая значением S+A. Без этой переменной придётся писать S+A дважды, а это прям приглашает наступить будущих мейнтейнеров на грабли, чтоб они поменяли в одном месте S+A на что-нибудь ещё, а в другом месте забыли бы.

А может, как писали выше, задумка была в том, что таких операций будет много, и может их было когда-то много, а потом стало мало, но это же не повод удалять столь удачную функцию?

Ответить | Правка | К родителю #69 | Наверх | Cообщить модератору

111. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от n00by (ok), 18-Дек-21, 09:47 
Неудачно процитировал, лучше весь код смотреть. Хотя бы это:

    switch (rel.r_type) {
    case R_X86_64_8:
      write8(S + A);
      continue;
    case R_X86_64_16:
      write16(S + A);
      continue;
    case R_X86_64_32:
      write32(S + A);
      continue;
    case R_X86_64_32S:
      write32s(S + A);
      continue;
    case R_X86_64_64:
      *(u64 *)loc = S + A;
      continue;
    case R_X86_64_PC8:
      write8s(S + A - P);
      continue;
    case R_X86_64_PC16:
      write16s(S + A - P);
      continue;
    case R_X86_64_PC32:
      write32s(S + A - P);
      continue;
    case R_X86_64_PC64:
      *(u64 *)loc = S + A - P;
      continue;
    case R_X86_64_PLT32:
      write32s(S + A - P);
      continue;
    case R_X86_64_GOT32:
      write32s(G + A);
      continue;
    case R_X86_64_GOT64:
      *(u64 *)loc = G + A;
      continue;

На остальное автор перестал писать лямбды. Наверное, устал мотать экран туда-сюда. :)
write8, насколько понимаю формат, негде больше переиспольовать.

> если ты присмотришься, тут неявно создаётся локальная переменная val инициализируемая
> значением S+A. Без этой переменной придётся писать S+A дважды, а это
> прям приглашает наступить будущих мейнтейнеров на грабли, чтоб они поменяли в
> одном месте S+A на что-нибудь ещё, а в другом месте забыли
> бы.

Вариант. И switch так красивее - все case по три строчки.

Ответить | Правка | Наверх | Cообщить модератору

112. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от Аноним (80), 18-Дек-21, 15:39 
И switch так красивее - все case по три строчки.
Не, красивее было бы вместо rel.r_type передать указатель на функцию соответствующего write...() и свитч не нужен был бы.
Ответить | Правка | Наверх | Cообщить модератору

113. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +1 +/
Сообщение от n00by (ok), 18-Дек-21, 16:53 
rel.r_type читается из объектника, а указатель откуда возьмётся?
Ответить | Правка | Наверх | Cообщить модератору

123. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +/
Сообщение от Crazy Alex (ok), 19-Дек-21, 20:15 
Ну, в принципе если проверку вадиности значения отдельно вынести - можно и по табличке сделать, но подозреваю, что кода будет больше, маинтайнить станет менее удобно, а толку - никакого, этот свитч, скорее всего, во что-то подобное компилятором и будет преобразован
Ответить | Правка | Наверх | Cообщить модератору

101. "Первый стабильный релиз компоновщика Mold, развиваемого разр..."  +1 +/
Сообщение от Аноним (65), 17-Дек-21, 21:18 
> template <>
> void GotPltSection<X86_64>::copy_buf(Context<X86_64> &ctx) {
> Рили?

Подозреваю, что причина использование темплейтов в том, что линкер похожим образом обрабатывает ELF-файлы разных архитектур. Похожим образом, но не абсолютно одинаковым. То есть многие функции обработки выглядят одинаково, но не все. Те, которые разные - реализованы в виде специализации темплейта для конкретной архитектуры, например X86_64, что мы и наблюдаем в этом файле.

Ответить | Правка | К родителю #60 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру