如何获取llvm内联asm操作数类型?

时间:2015-03-21 14:47:59

标签: c++ c assembly llvm llvm-clang

我正在开发一个关于LLVM的内联asm的项目,但我遇到了关于asm操作数的一个问题。例如,我有这样的代码:

int a;
int b;
asm("nop": "=r"(a), "r"(b), "g"(30));

我可以获得asm string" nop"使用llvm :: InlineAssembly :: getAsmString()函数,我也可以获得约束" r r imr"信息使用llvm :: InlineAsm :: ParseConstraints函数并迭代返回值。但我的问题是我无法获取asm操作数信息,特别是asm operarands类型(a是整数类型,b是整数类型,30是常数int)。

那么有人知道有没有办法获得asm操作数信息?

1 个答案:

答案 0 :(得分:0)

在LLVM中,InlineAsmValue的子类,关联值始终为指向函数的指针。该伪造函数的内容是asm代码本身。

因此,要获得操作数的类型,就像使用指向函数的指针一样。你有一个方便的FunctionType *InlineAsm::getFunctionType() const可以完成一半的工作。

其余的非常简单:Type * FunctionType::getReturnType()获取输出参数,FunctionType::params()或类似获取输入参数。