C 计数数组的数目

C 计数数组的数目,c,llvm,clang,C,Llvm,Clang,在C程序中如何计算数组的总数 LLVM IR中的数组声明对应于alloca类型的操作。 所以 对应于 %a = alloca [10 x i32], align 4 在LLVM IR中 但我也注意到 int j = 0; 也对应于alloca指令 %j = alloca i32, align 4 那么,如何计算只对应于数组的alloca指令的数量呢 编辑: (函数::迭代器i=F.begin(),e=F.end();i!=e;++i) { 对于(BasicBlock::迭代器ii=(*

在C程序中如何计算数组的总数

LLVM IR中的数组声明对应于alloca类型的操作。 所以

对应于

%a = alloca [10 x i32], align 4
在LLVM IR中

但我也注意到

 int j = 0;
也对应于alloca指令

 %j = alloca i32, align 4
那么,如何计算只对应于数组的alloca指令的数量呢

编辑:

(函数::迭代器i=F.begin(),e=F.end();i!=e;++i) { 对于(BasicBlock::迭代器ii=(*i).begin(),ii_e=(*i).end();ii!=ii_e;++ii) { 指令*n=dyn_铸件(&*ii); 对于(int num=0;numgetnumperands();++num) if(isa(n->GetOperator(num)->getType()) { //不起作用 errs()打开并编译以下代码

int main(int argc, char **argv) {
  int a[10];
  return 0;
}

到LLVM C++ API调用。< /P> 这就是

a
的创建方式:

AllocaInst* ptr_a = new AllocaInst(ArrayTy_6, "a", label_9);
其中
ArrayTy_6
为:

ArrayType* ArrayTy_6 = ArrayType::get(IntegerType::get(mod->getContext(), 32), 10);
所以,要确定您正在查看的
alloca
指令是否定义了数组,只需执行
isa以获取更多信息。

打开并编译以下代码

int main(int argc, char **argv) {
  int a[10];
  return 0;
}

到LLVM C++ API调用。< /P> 这就是

a
的创建方式:

AllocaInst* ptr_a = new AllocaInst(ArrayTy_6, "a", label_9);
其中
ArrayTy_6
为:

ArrayType* ArrayTy_6 = ArrayType::get(IntegerType::get(mod->getContext(), 32), 10);

因此,要确定您正在查看的
alloca
指令是否正在定义数组,只需执行
isa以了解更多信息。

AllocaInst
具有公共方法
isArrayAllocation()
。您可以使用它来计算仅对应于数组的alloca指令的数量

for (Function::iterator BB = F.begin(), BE = F.end(); BB != BE; ++BB)
  for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II)
    if (AllocaInst *AI = dyn_cast<AllocaInst>(II))
      if (AI->isArrayAllocation())
        errs() << "Alloca of array is found!\n";
for(函数::迭代器BB=F.begin(),BE=F.end();BB!=BE;++BB)
对于(基本块::迭代器II=BB->begin(),IE=BB->end();II!=IE;++II)
如果(AllocaInst*AI=动态铸造(II))
如果(AI->isArrayAllocation())

errs()
AllocaInst
具有公共方法
isArrayAllocation()
。您可以使用它来计算仅与数组相对应的alloca指令数

for (Function::iterator BB = F.begin(), BE = F.end(); BB != BE; ++BB)
  for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II)
    if (AllocaInst *AI = dyn_cast<AllocaInst>(II))
      if (AI->isArrayAllocation())
        errs() << "Alloca of array is found!\n";
for(函数::迭代器BB=F.begin(),BE=F.end();BB!=BE;++BB)
对于(基本块::迭代器II=BB->begin(),IE=BB->end();II!=IE;++II)
如果(AllocaInst*AI=动态铸造(II))
如果(AI->isArrayAllocation())

用什么代码?shell脚本?C代码?最简单的是分析代码,看看你有没有代码> alOrg[x……],<代码> >还是代码> aloLCA…,<代码>,不是吗?@我使用LLVM C++密码,用什么?shell脚本?C代码?最简单的是分析行,看看你是否有<代码>“E.C.>或代码< > Alela…,<代码>不是吗?@ ErgRITE我使用LLVM C++ PASS请查看编辑的问题。“ISA”不利于检测数组,也许不需要代码> > GETType()/<代码>。没有GETTYPE,它会出错。我尝试了这个简单的代码以及N-> GETType()-ISARAYTY()。。这也不起作用。我无法找到我错的地方。请查看编辑后的问题。“isa”无助于检测数组。可能不需要
->getType()
?如果没有getType,则会出现错误。我也尝试了此简单代码n->getType()->isArray()。这也不起作用。我无法找到我错的地方