SSA как с\с++ компилирует

Тема в разделе "LANGS.C", создана пользователем _evil, 6 май 2018.

  1. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    41
    компиляторы С++ используют SSA формат для генерации кода. А как он в этом формате обрабатывает ссылки и указатели?
    (если их не учитывать, то взяв адрес с переменной и преобразуется следующее выражение(оно будет в новой переменной) то адрес будет уже неправильным).
    Заранее благодарен.
     
  2. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    41
    промежуточное представление
    а куда результат записывается?
    что ты этим хотел сказать ? может скажешь как с ссылками дело обстоит ?
    https://courses.cs.washington.edu/courses/cse501/04wi/slides/slides.slides.ps.pdf
    есть пример но я его не догоняю
     
  3. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Публикаций:
    0
    Регистрация:
    13 май 2017
    Сообщения:
    95
    Там предлагается
    LLVM так и поступает. SSA только для регистров, а для памяти там не используется SSA-представление.
    Этим в тьюториале предлагают пользоваться для упрощения кодогенерации
    https://llvm.org/docs/tutorial/LangImpl07.html#memory-in-llvm
     
    Последнее редактирование: 7 май 2018
    _evil нравится это.
  4. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    41
    дак это тока для динамической памяти и вобще если прочитать дальше то они вводят i функцию
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.268
    Адрес:
    Fryazino
    Так учитывайте. Кто вам не даёт?
    Взятие адреса это числовое преобразование, а в данном случае речь идёт о символьных. А во вторых основа адреса сохраняется так что всегда есть возможность восстановить адрес.
     
  6. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Публикаций:
    0
    Регистрация:
    13 май 2017
    Сообщения:
    95
    Да. Я просто остановился на том, о применении чего мне точно известно.
    Применяют ли GCC или MSVC i-функцию вместо не-SSA памяти я не знаю.
     
  7. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    41
    возник ещё такой вопрос:
    SSA строится в компиляторах над произвольном выражением типа оп1:=оп2+оп3 , или уже из машинно специфичных выражениях оп2:=оп2+оп3?
    всем спасибо!
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    1.968
    зависит от SSA вероятно... LLVM IR строго типизирован, то есть оп1 = add i32 оп2 оп3, то есть сложение двух 32-битных интов в третий 32-битный инт... у GCC представление GIMPLE тож вроде строго типизированное, если мне не изменяет память... только там вроде не пишется типизация в операции, но все регистры объявляются в начале функции с указанием типа, аля старая сишечка... у GCC еще есть RTL представление, более низкоуровневое, но это уже почти как ассемблер, но в виде LISP-синтаксисе...
     
    _evil нравится это.
  9. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    41
    не совсем то (то что строго типизировано это понятно иначе бы не скомпилировалось)
    при помощи mov можно записать только в первый источник - приходится коректировать код
    как я понял современные компиляторы сначало переводят в SSA а потом при генерации кода переводят в бинарные (двух операторные) команды
    а почему так ? не подскажите - вроде можно и наоборот ...
     
  10. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    41
    немного подумавши стал догонять - в SSA каждое новое присваивание в новую переменную то есть для машинных команд не подходит
    а когда переводят SSA в машинные команды наверное учитывают специфику машинных команд во время распределения регистров
    где-нибудь это описано ? чтото эта тема плохо освещена... в книжках и интернете ... наверное сложная
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    1.968
    что значит плохо освящена? в драконьей книге вроде была отдельная глава про распределение регистров, у стенфорда в видео курсе по компиляторам тож отдельная глава про это...
     
    _evil нравится это.
  12. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    41
    одни иностранные источники...
     
  13. _evil

    _evil Member

    Публикаций:
    0
    Регистрация:
    28 сен 2003
    Сообщения:
    41
    возник такой вопрос:" как я понял при обработке С++ выражений в промежуточный код получается очень много промежуточных переменных - компилятор скорее всего оптимизирует(переставляет мат операции местами) чтобы понадобилось меньше регистров/переменных для выполнения". Какими методами он это делает? Или перебором переставляет выражения а потом откидывает те которые используют не появившиеся переменные?