кодогенерация msvc10

Тема в разделе "LANGS.C", создана пользователем srm, 29 июл 2011.

  1. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    Здравствуйте. Столкнулся с несколько странным поведением компилятора:
    слил библиотеку minilzo, создал проект, добавил исходники, поставил игнорировать дефолтовые либы. Проект не собирается: unresolved external symbol _memset referenced in function _lzo1x_1_compress. Сначала подумал, что где-то дёргается memset и даже нашёл где:
    Код (Text):
    1.         lzo_memset(wrkmem, 0, ((lzo_uint)1 << D_BITS) * sizeof(lzo_dict_t));
    но при дальнейшем изучении кода обнаружил:

    Код (Text):
    1. #define lzo_hmemset             lzo_memset
    2. ...
    3. LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemset) (lzo_hvoid_p s, int c, lzo_hsize_t len)
    4. {
    5. #if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMSET)
    6.     lzo_hbyte_p p = (lzo_hbyte_p) s;
    7.  
    8.     if __lzo_likely(len > 0)
    9.     {
    10.         do
    11.         {
    12.             *p ++ = (unsigned char)c;
    13.         }
    14.         while __lzo_likely(-- len > 0);
    15.     }
    16.     return s;
    17. #else
    18.     return memset(s, c, len);
    19. #endif
    20. }
    условие (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMCMP) выполняется. Пробовал коментить строчку
    // return memcmp(s1, s2, len);
    - не помогает.
    Но стоит изменить тело функции, например, закоментить строчку
    //*p ++ = (unsigned char)c;
    - как всё нормально компилируется.
    Неужто линкер сравнивает генерируемый код и при возможности заменяет куски кода вызовом стандартных функций?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    srm
    Именно так, в целях оптимизации.
     
  3. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Да, только не линкер - этим компилятор занимается.
    Ещё присваивание структур как минимум на memcpy заменяется обычно.
     
  4. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    как вариант выключить оптимизацию и посмотреть соберется ли...
     
  5. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    Под дебагом собирается. Сейчас свой проект попробовал собрать. В проекте есть такая вот строчка:

    Код (Text):
    1.                 for (n_rep += 4; n_rep; -- n_rep, ++ j)
    2.                     d[j] = c_rep;
    тоже из-за неё не собирается. Говорит error LNK2001: unresolved external symbol _memset.

    писец, не думал, что msvc умный на столько, что заменяет исходный код вызовом стандартных функций..
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Напишите свою memset и будет вам счастье.
     
  7. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    Booster, да, нашёл уже аналогичный топик. Понятно, что нечерезжопных решений нет.
     
  8. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Раньше прокатывало запись цикла с конца. На эту тему тоже был топик.
     
  9. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    srm
    Я не знаю как там msvc, gcc заменяет на вызовы функций типа __builtin*, и при желании можно указать промеж аргументов компиляции -ffreestanding, чтобы gcc оптимизируя не забывал бы о том, что никаких stdlib и crti.o не будет. Поройся промеж опций msvc -- там должно быть что-нибудь в этом роде: с каким бы подозрением я не относился к ms, но я не верю, что они такую каку могли заложить.
     
  10. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    r90, неужто ни у кого при написании дров эта кака не всплывала?
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    cupuyc
    Отключать рантайм при написании дров совсем не нужно.