Важная информация

User Tag List

Страница 9 из 13 ПерваяПервая ... 5678910111213 ПоследняяПоследняя
Показано с 81 по 90 из 125

Тема: LLVM Backend для Z80

  1. #81
    Member Аватар для EARL
    Регистрация
    17.01.2006
    Адрес
    Тамбов
    Сообщений
    97
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Подозреваю, что clang и llvm находятся в разных папках. Если это так, то советую сделать следующим образом.
    1. Качаем llvm и кладем например в папку llvm-z80
    2. Качаем clang и кладем в папку llvm-z80/tools/clang
    3. Натравливаем cmake на llvm-z80
    4. Запускаем сборку командой make и ждем.

    Кстати собирать лучше не в папке где находятся исходники llvm/clang, а в отдельной.
    ZX Evolution 4096 Rev.C + NeoGS 4096 Rev.C + PAL Coder Rev.C + FDD 3.5/HDD/CDROM
    Reverse U8

  2. #82
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EARL Посмотреть сообщение
    Подозреваю, что clang и llvm находятся в разных папках. Если это так, то советую сделать следующим образом.
    2. Качаем clang и кладем в папку llvm-z80/tools/clang
    О!! ПЛЯ! я и не знал! ЩАЗ проверю

    Цитата Сообщение от EARL
    Кстати собирать лучше не в папке где находятся исходники llvm/clang, а в отдельной.
    Это основная идея cmake. Каждый день на работе им пользуюсь.

    ---------- Post added at 21:36 ---------- Previous post was at 21:13 ----------

    УРЯЯЯ! Собрался. Сейчас пытать его буду)

    ---------- Post added at 22:15 ---------- Previous post was at 21:36 ----------

    В общем - даже C++ компилирует)
    Но оптимизации пока что никакой.
    Последний раз редактировалось SfS; 11.10.2013 в 18:26.

  3. #83
    Member Аватар для EARL
    Регистрация
    17.01.2006
    Адрес
    Тамбов
    Сообщений
    97
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Помимо оптимизации там пока еще имеются некоторые непонятности, как те или иные вещи реализовать. Например для временного хранения компилятор умеет перекладывать значения в регистр IY и загружать обратно посредством push/pop, но вот когда регистров становится недостаточно и возникает необходимость сохранять значения на стеке, то возникают оказии в виде попытки сгенерировать команду:
    Код:
    LD (IX+NN),HY/LY
    Запретить сохранять на стек только регистр IY нельзя, т.к. аллокация регистров идет после генерации кода. Во всяком случае как это сделать я пока не понял, но уверен, что это реально. Можно просто запретить использовать IY для временного хранения значений, но тогда компилятор начнет чаще в стек лазить за значениями. В общем, ситуация не очень приятная. Это то, на чем сейчас все остановилось. В остальном количество команд, которые компилятор умеет генерировать уже почти хватает для всех видов конструкций, но код как ты заметил не самый оптимальный.
    ZX Evolution 4096 Rev.C + NeoGS 4096 Rev.C + PAL Coder Rev.C + FDD 3.5/HDD/CDROM
    Reverse U8

  4. #84
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EARL Посмотреть сообщение
    Это то, на чем сейчас все остановилось. В остальном количество команд, которые компилятор умеет генерировать уже почти хватает для всех видов конструкций, но код как ты заметил не самый оптимальный.
    Да бог с ним, что "неоптимальный". Дело наживное. Главное, что это вообще сделано!

    А z80-ассемблер ты не пытался прикрутить ещё?

  5. #85
    Member Аватар для EARL
    Регистрация
    17.01.2006
    Адрес
    Тамбов
    Сообщений
    97
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Еще не делал. Однако это позволит делать inline подстановки на асме прямо в код Си. Можно даже дизассемблер туда пристроить
    ZX Evolution 4096 Rev.C + NeoGS 4096 Rev.C + PAL Coder Rev.C + FDD 3.5/HDD/CDROM
    Reverse U8

  6. #86
    Member Аватар для EARL
    Регистрация
    17.01.2006
    Адрес
    Тамбов
    Сообщений
    97
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от perestoronin Посмотреть сообщение
    Ebuild случаем никто не готовил из llvm-z80 для Gentoo ?
    Нет. Я думал сперва довести все же дело до более менее рабочего результата. Тогда и запилю.
    ZX Evolution 4096 Rev.C + NeoGS 4096 Rev.C + PAL Coder Rev.C + FDD 3.5/HDD/CDROM
    Reverse U8

  7. #87
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EARL Посмотреть сообщение
    Еще не делал. Однако это позволит делать inline подстановки на асме прямо в код Си. Можно даже дизассемблер туда пристроить
    насколько я знаю есть binutils с поддержкой z80
    сейчас буду искать

    ---------- Post added at 20:56 ---------- Previous post was at 19:55 ----------

    В общем так.

    1. Собрал binutils-2.22.tar.bz2
    ./configure --prefix=$PREFIX --target=z80-unknown-coff --disable-static --with-gnu-ld --with-gnu-as --enable-install-libbfd --disable-werror

    (Опции нагло взяты из дебианоского скрипта)

    2. Попытался откомпилировать программу на ассемблере, полученную clang'ом.

    НИ ФИГА НЕ ВЫШЛО!

    Причина: Неверно работает кодогенератор:

    Исходный код.
    Код:
    int a;
    
    int b;
    
    int c;
    
    int main(int argc, char* argv[]){
            c = a+b;
            return(0);
    }
    Полученный ассемблер (оптимизация -Os)

    Код:
    .file   "test.c"
            .text
            .globl  main
            .type   main,@function
    main:
            push    ix
            push    de
            push    bc
            ld      ix, 0
            add     ix, sp
            ld      sp, ix
            ld      hl, b
            inc     hl
            ld      b, (hl)
            ld      a, (b)
            ld      c, a
            ld      hl, a
            inc     hl
            ld      d, (hl)
            ld      a, (a)
            ld      e, a
            ld      h, b
            ld      l, c
            add     hl, de
            ld      b, h
            ld      c, l
            ld      hl, c
            inc     hl
            ld      (hl), b
            ld      a, c
            ld      (c), a
            ld      hl, 0
            pop     bc
            pop     de
            pop     ix
            ret
    .tmp0:
            .size   main, .tmp0-main
    
            .type   a,@object
            .comm   a,2,1
            .type   b,@object
            .comm   b,2,1
            .type   c,@object
            .comm   c,2,1
    Обрати внимание на команды:

    Код:
            ld      hl, b
    ...
            ld      hl, a
    ...
            ld      a, (a)
    Без оптимизации картина та же.

    Надо бы привести генерируемые команды к стандарту, пониемому бинутилсами.
    тогда будем тестить дальше, уже на реале.

  8. #88
    Sinclair User Аватар для Eltaron
    Регистрация
    16.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,045
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    144
    Спасибо Благодарностей получено 
    463
    Поблагодарили
    326 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    насколько я знаю есть binutils с поддержкой z80
    сейчас буду искать
    Их z80-coff очень ограниченная штука, кстати, в таблице релоцирования COFF нет некоторых ключевых фич. Я как-то пытался его прикрутить к sdcc, и споткнулся на том, что вот такое (взятие старшего и младшего байта адреса, который неизвестен на этапе компиляции)
    Код:
          section .data
    DATA
          defm "Hello, world"
          
          section .text
          LD H, DATA >> 8
          LD L, DATA & 0xFF
    там в принципе невозможно. sdcc же такое генерит направо и налево, да и практически все прочие z80-ассемблеры понимают подобные по смыслу конструкции. Нужен ELF с его complex relocations.
    Последний раз редактировалось Eltaron; 12.10.2013 в 18:27.
    Граф Дракула наш кумир, патамушта он вомпир!
    VKINK 9 : BORDER NOT PI

  9. #89
    Member Аватар для EARL
    Регистрация
    17.01.2006
    Адрес
    Тамбов
    Сообщений
    97
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    Обрати внимание на команды:

    Код:
            ld      hl, b
    ...
            ld      hl, a
    ...
            ld      a, (a)
    Без оптимизации картина та же.

    Надо бы привести генерируемые команды к стандарту, пониемому бинутилсами.
    тогда будем тестить дальше, уже на реале.
    Это все потому, что приводить к какому-то виду нужно как минимум рабочий вариант, а сейчас некоторые конструкции мой бэкенд еще не умеет строить. По этой причине генерацию листинга делал просто для более наглядной проверки получаемого результата и отладки.

    В llvm есть свои инструменты подобные binutils. Думал в перспективе их использовать.

    Цитата Сообщение от perestoronin Посмотреть сообщение
    Альтернативы ему нет ?
    Есть. Использовать DragonEgg+gcc для генерация llvm кода. Сам еще не пробовал. Очень интересно что получится
    Последний раз редактировалось EARL; 12.10.2013 в 19:23.
    ZX Evolution 4096 Rev.C + NeoGS 4096 Rev.C + PAL Coder Rev.C + FDD 3.5/HDD/CDROM
    Reverse U8

  10. #90
    Master
    Регистрация
    27.01.2005
    Сообщений
    905
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Eltaron Посмотреть сообщение
    Их z80-coff очень ограниченная штука, кстати, в таблице релоцирования COFF нет некоторых ключевых фич. Я как-то пытался его прикрутить к sdcc, и споткнулся на том, что вот такое (взятие старшего и младшего байта адреса, который неизвестен на этапе компиляции)
    Код:
          section .data
    DATA
          defm "Hello, world"
          
          section .text
          LD H, DATA >> 8
          LD L, DATA & 0xFF
    там в принципе невозможно. sdcc же такое генерит направо и налево, да и практически все прочие z80-ассемблеры понимают подобные по смыслу конструкции. Нужен ELF с его complex relocations.
    будем дальше копать. В принципе асм можно любой прикрутить.

    ---------- Post added at 22:27 ---------- Previous post was at 22:24 ----------

    Цитата Сообщение от EARL Посмотреть сообщение
    Есть. Использовать DragonEgg+gcc для генерация llvm кода. Сам еще не пробовал. Очень интересно что получится
    Я, конечно, наглею, давая советы - но может лучше сначала кодогенератор допилишь до того, чтобы он неоптимальный, но рабочий код давал со стандартными опкодами, а потом уж яйца дракона кушать будешь?

Страница 9 из 13 ПерваяПервая ... 5678910111213 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •