Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Вряд ли возможно реализовать компилятор языка С для 4-хбитной архитектурыТо есть, для Z80 можно?
//сумма эл-тов массива
int foo(int arr[10]) {
int sum = 0;
for(int i = 0; i < 10; ++i) {
sum += arr[i];
}
return sum;
} Видно, что доступ к элементам массива происходит через gelelementptr/load Код на асме ARM: mov r2, 0
mov r3, 0mov r4, r1
add r4, r2
ldw r0, 0(r4)
add r0, r3
addi r2, 4
mov r3, r0
jeqi r2, 40 goto LBB0_2
jmp LBB0_1каждой переменной значение присваивается ровно один раз и только в одной точке программы.Напомнило Erlang — там переменные присваиваются тоже только один раз.
Но в LLVM есть понятие стека
На уровне IR (промежуточного кода) никакого стека нет, он работает только с виртуальными (не физическими) регистрами.
Дальше генерируются другие промежуточные представления, где действительно есть стек (точнее, Frame Index, индексы в кадре стека)
Хотелось бы, чтобы были не только виртуальные регистры, но и виртуальный стек.
На каком этапе существует IR
сделать ассемблерную вставку с нужной командой.Да, такой «костыль» мог бы стать решением, вот только ещё надо знать, как это сделать. На Си я это делал как раз такой вставкой. Конечно, после вставки нативного кода универсальность теряется.
Если вы хотите сделать оптимизации нативного кода для конкретной архитектуры, то вам не нужно заниматься формированием IR-кода, нужно написать только бэкенд (или модифицировать существующий).Вероятно, надо модифицировать существующий бэкенд, но потом из IR-кода надо ещё как-то воспользоваться этой модификацией. Короче, надо изучать и вникать. Литературы на русском мало, а с английской всё будет дольше.
Конечно, после вставки нативного кода универсальность теряется.
из IR-кода надо ещё как-то воспользоваться этой модификацией.
Вы говорили, что вам нужно только под платформу x86.Да, нет, я начал с этого:
Знакомился с LLVM и не нашёл, как можно изменить содержимое указателя стека. В x86 можно написать так: «xchg esp,other_stack». А как сделать что-то подобное на LLVM?Если есть какой-то универсальный механизм, то кто ж тогда откажется, чтобы его компилятор работал сразу на многих платформах? Честно говоря, написать бэкенд для x86 для меня проще, чем для LLVM, потому что всё знакомо. Но если LLVM позволит сделать многоплатформенный компилятор, то стоит задуматься об изучении LLVM – игра будет стоить свеч.
написать бэкенд для x86 для меня проще, чем для LLVM
Бэкенд для x86 уже написан, и он входит в состав LLVM. Я не знаю точно, что вы хотите сделать, но вам нужно внести изменения в Clang, наверное.Имею в виду преобразование (бэкенд) «своё промежуточное представление -> код x86» (которое для меня проще), нежели «своё промежуточное представление -> код LLVM IR»
Вы хотите реализовать какой-то свой язык программирования?
Вы хотите реализовать какой-то свой язык программирования?Мы, по-видимому, смотрим на LLVM под разным углом зрения: я – как состыковать свой язык программирования с LLVM, а Вы – как состыковать с ним своё железо :)
своё промежуточное представление
LLVM: компилятор своими руками. Введение