{{>head}}

Сборка и использование QBE

Для выполнения практических заданий в курсе используется промежуточное представление QBE IL, являющееся частью проекта QBE. QBE предоставляет средства для анализа и трансформации кода на промежуточном представлении, а также компиляции в объектный код для платформ x86_64 и ARM.

Сборка QBE

Для выполнения заданий требуется загрузить QBE c репозитория ИСП РАН. Сборка выполняется при помощи GNU Make:

				$ git clone https://compilers.ispras.ru/git/qbe.git
				$ cd qbe
				$ make && make install DESTDIR=/path/to/install
		
Результатом сборки является исполняемый файл qbe (qbe.exe), представляющий интерфейс командной строки к QBE, а также библиотека libqbe.a, предоставляющая программный интерфейс.

Использование QBE из командной строки

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

Программное использование QBE

Неофициальный 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 для освобождения памяти.