如何在LLVM中使用数组检查给定指令

如何在LLVM中使用数组检查给定指令,llvm,Llvm,我想问的是,我们是否可以检查一条给定的指令是否包含一个数组作为LLVM中的操作数。我正在写一个通行证,并且卡在这个阶段。是的,您可以用以下代码检查: 指令*I; bool UsingArray=false; for(unsigned num=0;numgetnumperands();++num) if(isa(I->GetOperator(num)->getType()) UsingArray=true; @neel,如果它不工作,那么操作数有其他类型,而不是ArrayType@neel,我认

我想问的是,我们是否可以检查一条给定的指令是否包含一个数组作为LLVM中的操作数。我正在写一个通行证,并且卡在这个阶段。

是的,您可以用以下代码检查:

指令*I;
bool UsingArray=false;
for(unsigned num=0;numgetnumperands();++num)
if(isa(I->GetOperator(num)->getType())
UsingArray=true;

@neel,如果它不工作,那么操作数有其他类型,而不是
ArrayType
@neel,我认为这个问题与这些是不同的问题有关,例如:int a[10]将使用isArrayLocation()计算为aray分配,但如果我们说int b=c+a[3];在这种情况下,您将如何使用数组或not@neel,在您的示例中,[3]不是数组,它是整数,具有数组元素的类型。感谢@vkorchagin帮助我。只需添加一点,您就可以识别I是否是加载指令(如果[3]存储在内存中,则会出现这种情况),然后对加载指令执行
Value*v=I->getPointerOperand()
,然后调用
isa(v)
来检测是否使用了GEP指令。我想这是从内存加载数组的唯一方法。如果我错了,请纠正我。
Instruction *I;
bool UsingArray = false;
for (unsigned num = 0; num < I->getNumOperands(); ++num)
  if (isa<ArrayType>(I->getOperand(num)->getType()))
    UsingArray = true;