FAQ — различия между версиями

Материал из Compilers Wiki
Перейти к: навигация, поиск
Строка 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:

  1. QBE
  2. Типы
    1. Простые типы данных
    2. Подтипирование
  3. Константы
  4. Объявления
    1. Составные типы данных
    2. Data
    3. Функции
  5. Управление
    1. Блоки
    2. Переходы
  6. Инструкции
    1. Арифметические и битовые операции
    2. Память
    3. Сравнения
    4. Преобразования
    5. Инструкции Cast и Copy
    6. Инструкция Call
    7. Вариативность
    8. Инструкция Phi
  7. Список всех инструкций

Как получить 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 Программа