FAQ — различия между версиями
Alexander (обсуждение | вклад) |
Alexander (обсуждение | вклад) |
||
Строка 57: | Строка 57: | ||
---- | ---- | ||
Источник: [https://compilers.ispras.ru/qbe.html | ispras.ru] | Источник: [https://compilers.ispras.ru/qbe.html | ispras.ru] | ||
+ | |||
+ | == Как пользоваться Си-интерфейсом? == | ||
+ | Неофициальный 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 | ||
+ | Для осуществления компиляции воспользуйтесь командой: | ||
+ | g++ -lm объектныйФайл.o qbe/obj/libqbe.a -o Программа | ||
+ | Либо: | ||
+ | g++ исходныйФайл.c qbe/obj/libqbe.a -o Программа |
Версия 05:20, 21 марта 2018
Содержание
Что такое 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
Для осуществления компиляции воспользуйтесь командой:
g++ -lm объектныйФайл.o qbe/obj/libqbe.a -o Программа
Либо:
g++ исходныйФайл.c qbe/obj/libqbe.a -o Программа