FAQ — различия между версиями
Alexander (обсуждение | вклад) (Добавление "Что такое QBE IL?") |
(→Как использовать QBE IL?) |
||
(не показано 8 промежуточных версий 2 участников) | |||
Строка 27: | Строка 27: | ||
## [[Инструкция Phi]] | ## [[Инструкция Phi]] | ||
# [[Инструкции QBE | Список всех инструкций]] | # [[Инструкции QBE | Список всех инструкций]] | ||
+ | |||
+ | == Как получить QBE IL? == | ||
+ | Первое, что Вам необходимо сделать – обзавестись самим [[QBE]]. Сделать это можно из [https://compilers.ispras.ru/git/qbe.git git-репозитория ИСП РАН]. | ||
+ | $ git clone https://compilers.ispras.ru/git/qbe.git | ||
+ | $ cd qbe | ||
+ | Сборка полученных файлов осуществляется с помощью [https://ru.wikipedia.org/wiki/Make GNU_Make] командой: | ||
+ | $ make && make install DESTDIR=/path/to/install | ||
+ | Результатом сборки является исполняемый файл qbe (qbe.exe), представляющий интерфейс командной строки к [[QBE]], а также библиотека libqbe.a, предоставляющая программный интерфейс. | ||
+ | ---- | ||
+ | Источник: [https://compilers.ispras.ru/qbe.html | ispras.ru] | ||
+ | |||
+ | == Как использовать QBE IL? == | ||
+ | [[QBE]] предоставляет утилиту для работы с файлами на языке промежуточного представления: | ||
+ | $ qbe -h | ||
+ | qbe [OPTIONS] {file.ssa, -} | ||
+ | -h prints this help | ||
+ | -o file output to file | ||
+ | -t <target> generate for a target among: | ||
+ | amd64_sysv, arm64 | ||
+ | -G {e,m} generate gas (e) or osx (m) asm | ||
+ | -d <flags> dump debug information | ||
+ | |||
+ | Типичное использование утилиты заключается в компиляции файла с промежуточным представлением в файл на языке ассемблера: | ||
+ | $ qbe my-loop.il -o my-loop.s | ||
+ | Для компиляции ассемблерного файла в объектный или исполняемый файл можно использовать компиляторы GCC и Clang: | ||
+ | $ cc my-loop.s | ||
+ | Команды компиляции и запуска можно объединить в одну: | ||
+ | $ qbe my-loop.il | cc -xassembler - -o exe && ./exe | ||
+ | ---- | ||
+ | Источник: [https://compilers.ispras.ru/qbe.html | ispras.ru] | ||
+ | |||
+ | == Как пользоваться Си-интерфейсом? == | ||
+ | {{ТребуютсяПравки|FAQ}} | ||
+ | |||
+ | Неофициальный Cи-интерфейс [[QBE]] представлен файлом [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD all.h] в корневой директории проекта. | ||
+ | |||
+ | Для реализации анализов и трансформаций на уровне промежуточного представления вам понадобятся функции [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l459 parse] и [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l460 printfn] для чтения и записи [[QBE | QBE IL]] в текстовом формате. | ||
+ | |||
+ | Программа на [[QBE | QBE IL]] является последовательностью определений функций, данных и типов. Определения функций представлены структурой [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l329 Fn], содержащий указатель на entry-блок [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l330 Fn::start]. | ||
+ | |||
+ | Базовые блоки представлены структурой [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l214 Blk], содержащей указатель на следующий блок в некотором порядке обхода [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l224 Blk::link], указатели на последующие блоки [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l222 Blk::s1] и [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l223 Blk::s2], указатели на предшествующие блоки [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l234 Blk::pred], а также на начало массива инструкций [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l216 Blk::ins]. | ||
+ | |||
+ | Инструкции представлены структурой [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l198 Ins], содержащий код операции [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l199 Ins::op] (который может использоваться в качестве ключа в массиве [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l458 optab]), и ссылки [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l200 Ins::to] и [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l200 Ins::arg] на результат операции и её операнды. | ||
+ | |||
+ | Рекомендуется использовать функцию [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD#l414 freeall] для освобождения памяти. | ||
+ | ---- | ||
+ | Источник: [https://compilers.ispras.ru/qbe.html | ispras.ru] | ||
+ | |||
+ | == Можно ли использовать С++? == | ||
+ | Ответ - можно. Но вместо директивы <code># include "qbe/all.h"</code> используйте | ||
+ | #define export exports | ||
+ | extern "C" { | ||
+ | #include "qbe/all.h" | ||
+ | } | ||
+ | #undef export | ||
+ | Для линковки (в т.ч. со стандартной библиотекой языка C++) воспользуйтесь командой: | ||
+ | g++ -L/путь/до/qbe/lib -lqbe объектныйФайл.o -o Программа | ||
+ | Либо используйте драйвер <code>g++</code> (либо <code>clang++</code>, либо <code>c++</code> — некоторые UNIX системы предоставляют исполняемый файл с таким именем в качестве обобщения) для компиляции и линковки одной командой: | ||
+ | g++ -I/путь/до/qbe/include -L/путь/до/qbe/lib исходныйФайл.cpp -lqbe -o Программа | ||
+ | |||
+ | (подразумевается, что QBE проинсталлирован в директорию /путь/до/qbe — например, с помощью <code>DESTDIR=/путь/до/qbe make install</code>). |
Текущая версия на 06:30, 22 сентября 2024
Содержание
Что такое QBE IL?[править]
Ответ на данный вопрос Вы сможете найти в статье про QBE. Документация ко внутреннему представлению доступна в оригинале на сайте c9x.me (англоязычная версия) и в данном проекте Wiki (оригинал с параллельным переводом).
Документация на Wiki:
- QBE
- Типы
- Константы
- Объявления
- Управление
- Инструкции
- Список всех инструкций
Как получить QBE IL?[править]
Первое, что Вам необходимо сделать – обзавестись самим QBE. Сделать это можно из git-репозитория ИСП РАН.
$ git clone https://compilers.ispras.ru/git/qbe.git $ cd qbe
Сборка полученных файлов осуществляется с помощью GNU_Make командой:
$ make && make install DESTDIR=/path/to/install
Результатом сборки является исполняемый файл qbe (qbe.exe), представляющий интерфейс командной строки к QBE, а также библиотека libqbe.a, предоставляющая программный интерфейс.
Источник: | ispras.ru
Как использовать QBE IL?[править]
QBE предоставляет утилиту для работы с файлами на языке промежуточного представления:
$ qbe -h qbe [OPTIONS] {file.ssa, -}
-h prints this help -o file output to file -t <target> generate for a target among: amd64_sysv, arm64 -G {e,m} generate gas (e) or osx (m) asm -d <flags> dump debug information
Типичное использование утилиты заключается в компиляции файла с промежуточным представлением в файл на языке ассемблера:
$ qbe my-loop.il -o my-loop.s
Для компиляции ассемблерного файла в объектный или исполняемый файл можно использовать компиляторы GCC и Clang:
$ cc my-loop.s
Команды компиляции и запуска можно объединить в одну:
$ qbe my-loop.il | cc -xassembler - -o exe && ./exe
Источник: | ispras.ru
Как пользоваться Си-интерфейсом?[править]
Требуются правки: см. Обсуждение.
Неофициальный Cи-интерфейс QBE представлен файлом all.h в корневой директории проекта.
Для реализации анализов и трансформаций на уровне промежуточного представления вам понадобятся функции parse и printfn для чтения и записи QBE IL в текстовом формате.
Программа на QBE IL является последовательностью определений функций, данных и типов. Определения функций представлены структурой Fn, содержащий указатель на entry-блок Fn::start.
Базовые блоки представлены структурой Blk, содержащей указатель на следующий блок в некотором порядке обхода Blk::link, указатели на последующие блоки Blk::s1 и Blk::s2, указатели на предшествующие блоки Blk::pred, а также на начало массива инструкций Blk::ins.
Инструкции представлены структурой Ins, содержащий код операции Ins::op (который может использоваться в качестве ключа в массиве optab), и ссылки Ins::to и Ins::arg на результат операции и её операнды.
Рекомендуется использовать функцию freeall для освобождения памяти.
Источник: | ispras.ru
Можно ли использовать С++?[править]
Ответ - можно. Но вместо директивы # include "qbe/all.h"
используйте
#define export exports extern "C" { #include "qbe/all.h" } #undef export
Для линковки (в т.ч. со стандартной библиотекой языка C++) воспользуйтесь командой:
g++ -L/путь/до/qbe/lib -lqbe объектныйФайл.o -o Программа
Либо используйте драйвер g++
(либо clang++
, либо c++
— некоторые UNIX системы предоставляют исполняемый файл с таким именем в качестве обобщения) для компиляции и линковки одной командой:
g++ -I/путь/до/qbe/include -L/путь/до/qbe/lib исходныйФайл.cpp -lqbe -o Программа
(подразумевается, что QBE проинсталлирован в директорию /путь/до/qbe — например, с помощью DESTDIR=/путь/до/qbe make install
).