在LLVM IR中创建指向特定内存地址的全局指针

时间:2018-05-11 23:35:37

标签: llvm avr llvm-ir

我正在尝试使用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*) - 这是我芯片上的内存映射IO位置,我会与之进行很多交互,所以我想给它起一个像@PORTA这样的名字。但是,我找不到一种方法来将全局变量初始化为指向特定的内存地址。此有效:

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

初始化指针变量@PORTA内容,而不是创建指向该地址的内容

是否可以在LLVM IR中为某个内存地址创建全局别名?如果没有,是否有其他快捷方式可以让我为这些名称添加别名?

1 个答案:

答案 0 :(得分:-1)

你真的需要在IR级别创建这样的别名吗? LLVM IR并不适合手动编写。

如果要从C ++ API生成代码,那么只需将inttoptr常量表达式设为全局并在任何您喜欢的地方使用它:

ConstantExpr* porta = ...

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