Llvm 提取PointerType中包含的值

Llvm 提取PointerType中包含的值,llvm,llvm-ir,llvm-c++-api,Llvm,Llvm Ir,Llvm C++ Api,LLVM-IR 斯特伦博士 %call2是strlen函数的返回值,它是size\u t类型。我原以为它是一个结构类型,但结果却是一个指针类型,它的类型是i64(i8*)* 如何取消引用并获取指针值中包含的整数值 编辑:我使用了错误的操作数,但问题尚未解决。我遇到的问题不是指针类型,而是int 64类型转换。见下文 call void @llvm.dbg.declare(metadata i32* %z, metadata !24, metadata !DIExpression()), !d

LLVM-IR

斯特伦博士

%call2是strlen函数的返回值,它是size\u t类型。我原以为它是一个结构类型,但结果却是一个指针类型,它的类型是i64(i8*)*

如何取消引用并获取指针值中包含的整数值

编辑:我使用了错误的操作数,但问题尚未解决。我遇到的问题不是指针类型,而是int 64类型转换。见下文

  call void @llvm.dbg.declare(metadata i32* %z, metadata !24, metadata !DIExpression()), !dbg !25
  %arraydecay1 = getelementptr inbounds [55 x i8], [55 x i8]* %input, i32 0, i32 0, !dbg !26
  %call2 = call i64 @strlen(i8* %arraydecay1) #4, !dbg !28
CallInst I//参照传递
呼叫站点cs&I;
如果(!cs.getInstruction()){
返回;
}否则{
对于(用户*用户:cs.getInstruction()->users()){
if(指令*i=dyn_cast(用户)){
Value*v1=dyn_cast(i->getOperand(0));

errs()如果您谈论的是
%call2
strlen
调用的返回值,那么它的类型是
i64
,正如在
call i64@strlen(…)
中所写的那样

i64(i8*)*
类型是指向接受
i8*
并返回
i64
的函数的指针。它对应于C中的
&strlen
表达式的类型


因此,如果您想处理strlen的返回值,那么只需使用
%call2
值。

如果您正在谈论
%call2
strlen
调用的返回值,那么它的类型是
调用i64@strlen(…)
中编写的
i64

i64(i8*)*
类型是指向接受
i8*
并返回
i64
的函数的指针。它对应于C中的
&strlen
表达式的类型


因此,如果您想使用strlen的返回值,那么只需使用
%call2
值。

如果您有指针值,则使用
LoadInst
获得指向的值。如果您只有指针
类型
,则无法对该值进行ge。在LLVM版本高达9的情况下,您可以获得
类型
p通过调用PointerType::getElementType()指向。getElementType返回i64(i8*)*,如何取消引用?如果您有指针值,则可以使用
LoadInst
获取指向的值。如果您只有指针
类型
,则无法对该值进行ge。在最高达9的LLVM版本上,可以通过调用PointerType::getElementType(),获取指向的
类型。getElementType返回i64(i8*)*,如何取消引用?我正在使用%call2值,但不知道如何取消引用指针。正如您所看到的,我捕获的指针类型是getElementType返回i64(i8*)*正如我所说,所讨论的类型是
i64
。它是一个整数类型,但整个值不是常量。我没有看到与'i64(i8*)相关的任何内容*`。我的目标是获取%call2,但似乎我在迭代指令的RHS端(称为函数params及其返回值spec)。我通过迭代CallInst指令而不是使用CallSite解决了此问题。对于pointertype,似乎需要做更多的工作。我将用这两种情况的答案更新此问题。底线是,因为LLVM是SSA CallInst,它同时具有规范(创建和调用)并且返回值可以通过迭代CallInst指令获得。我在CallSite方向上被蒙住了双眼。我正在使用%call2值,但不知道如何取消对指针的引用。正如您所看到的,我捕获了指针类型是getElementType返回i64(i8*)*正如我所说,所讨论的类型是
i64
。它是一个整数类型,但整个值不是一个常量。我看不到任何与“i64(i8*)*”相关的内容。我的目标是获取%call2,但似乎是迭代指令的RHS端(称为函数参数及其返回值spec)。我通过迭代CallInst指令而不是使用CallSite解决了此问题。对于pointertype,似乎需要做更多的工作。我将用这两种情况的答案更新此问题。底线是,因为LLVM是SSA CallInst,它同时具有规范(创建和调用)返回值可以通过迭代CallInst指令获得。我在CallSite方向上被蒙住了双眼
 CallInst I; //passed by reference
  CallSite cs(&I);
  if(!cs.getInstruction()){
    return;
  } else {
    for (User* user : cs.getInstruction()->users()) {
      if (Instruction* i = dyn_cast<Instruction>(user)) {
        Value *v1 = dyn_cast<Value>(i->getOperand(0));
        errs() << "Type:==" << *(v1) << "\n";
        errs() << "is integer type=" << (v1->getType()->isIntegerTy()) << "\n";
        ConstantInt *cint = dyn_cast<ConstantInt>(v1);
        if (cint) {
          errs() << "constant int" << *cint << "\n";
        } else {
          errs() << "not a constant int??" << "\n";
        }
      }
    }
  }

Type:==  %call2 = call i64 @strlen(i8* %arraydecay1) #4, !dbg !28
is integer type=1
not a constant int??