FAQ — различия между версиями
Vlad (обсуждение | вклад) (→Можно ли использовать С++?: generalize g++ (mention clang++ and c++)) |
(→Как использовать QBE IL?) |
||
(не показана 1 промежуточная версия 1 участника) | |||
Строка 44: | Строка 44: | ||
-h prints this help | -h prints this help | ||
-o file output to file | -o file output to file | ||
− | -t | + | -t <target> generate for a target among: |
amd64_sysv, arm64 | amd64_sysv, arm64 | ||
-G {e,m} generate gas (e) or osx (m) asm | -G {e,m} generate gas (e) or osx (m) asm | ||
− | -d | + | -d <flags> dump debug information |
Типичное использование утилиты заключается в компиляции файла с промежуточным представлением в файл на языке ассемблера: | Типичное использование утилиты заключается в компиляции файла с промежуточным представлением в файл на языке ассемблера: | ||
Строка 54: | Строка 54: | ||
$ cc my-loop.s | $ cc my-loop.s | ||
Команды компиляции и запуска можно объединить в одну: | Команды компиляции и запуска можно объединить в одну: | ||
− | $ qbe my-loop.il | cc -xassembler - -o exe && ./exe | + | $ qbe my-loop.il | cc -xassembler - -o exe && ./exe |
---- | ---- | ||
Источник: [https://compilers.ispras.ru/qbe.html | ispras.ru] | Источник: [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] в корневой директории проекта. | Неофициальный Cи-интерфейс [[QBE]] представлен файлом [https://c9x.me/git/?p=qbe.git;a=blob;f=all.h;h=24a175526ffea1d56d6084f24d1ef496be716dd7;hb=HEAD all.h] в корневой директории проекта. | ||
Текущая версия на 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
).