Создать глобальный указатель на определенный адрес памяти в LLVM IR - PullRequest
0 голосов
/ 12 мая 2018

Я экспериментирую с LLVM IR как альтернативой сборке для программирования микросхем AVR, но я столкнулся с камнем преткновения.

У меня есть следующий рабочий код:

target triple = "avr-atmel-none"

define void @main() {
    %1 = load i8, i8* inttoptr (i8 34 to i8*)
    %or = or i8 %1, 1
    store i8 %or, i8* inttoptr (i8 34 to i8*)
    ret void
}

Обратите внимание на inttoptr (i8 34 to i8*) - это расположение ввода-вывода с отображением в памяти на моем чипе, с которым я буду часто взаимодействовать, поэтому я хотел бы дать ему имя, например @PORTA. Однако я не могу найти способ инициализировать глобальную переменную как указатель на определенный адрес памяти. Это не работает:

@PORTA = constant i8* inttoptr (i8 34 to i8*)

, поскольку он инициализирует содержимое переменной-указателя @PORTA, а не создает его, указывая на этот адрес.

Можно ли создать глобальный псевдоним для определенного адреса памяти в LLVM IR? Если нет, есть ли какой-нибудь другой ярлык, который позволил бы мне использовать псевдонимы этих имен?

1 Ответ

0 голосов
/ 12 мая 2018

Вам действительно нужно создать такой псевдоним на уровне ИК?LLVM IR не должно удобнее писать вручную.

Если вы генерируете код из C ++ API, просто сделайте это inttoptr константным выражением глобальным и используйте его где угодно:

ConstantExpr* porta = ...

void foo()
{
new LoadInst(..., porta);
...
new StoreInst(..., porta);
}
...