FAQ

Материал из Compilers Wiki
Версия от 18:01, 26 сентября 2018; Vlad (обсуждение | вклад) (Как пользоваться Си-интерфейсом?)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Что такое 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

Для линковки (в т.ч. со стандартной библиотекой языка 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).