从LLVM IR中的寄存器中存储该值
Getting the value stored from register in llvm IR
我有一个简单的C程序。
int
1.main(int argc, char **argv) {
2. unsigned buffer[4] = { 0, 0, 0, 0 };
3. return buffer[argc];
4. }
,IR代码如下
; Function Attrs: norecurse nounwind readnone uwtable
define i32 @main(i32 %argc, i8** nocapture readnone %argv) #0 !dbg !6 {
%buffer = alloca [4 x i32], align 16
tail call void @llvm.dbg.value(metadata i32 %argc, i64 0, metadata !14, metadata !21), !dbg !22
tail call void @llvm.dbg.value(metadata i8** %argv, i64 0, metadata !15, metadata !21), !dbg !23
%1 = bitcast [4 x i32]* %buffer to i8*, !dbg !24
call void @llvm.lifetime.start(i64 16, i8* %1) #3, !dbg !24
tail call void @llvm.dbg.declare(metadata [4 x i32]* %buffer, metadata !16, metadata !21), !dbg !25
call void @llvm.memset.p0i8.i64(i8* %1, i8 0, i64 16, i32 16, i1 false), !dbg !26
%2 = sext i32 %argc to i64, !dbg !28
%3 = getelementptr inbounds [4 x i32], [4 x i32]* %buffer, i64 0, i64 %2, !dbg !28
%4 = load i32, i32* %3, align 4, !dbg !28, !tbaa !29
call void @llvm.lifetime.end(i64 16, i8* %1) #3, !dbg !33
ret i32 %4, !dbg !34
}
我想比较第3行的访问索引是否是有效的索引。为了进行此比较,我需要提取为ARGC存储的值。以下是我写的代码,以遵守argc
的vvalueauto gep = llvm::dyn_cast<llvm::GetElementPtrInst>(inst);
auto operand2 = gep->getOperand(2);
outs() << "operand 2 "<<*operand2<<"n";
auto newOperand =operand2.getOperand(0);
outs()<<"New operand "<<*newOperand<<"n";
输出: -
操作数2%2 = sext I32%argc to I64,!dbg!28
新操作数i32%argc
如何获得%argc的值?
getOperand
函数的返回值是argc
变量的Value*
对象(代码中的变量newOperand
)。您可以将该值传递给IR中可能要注入的任何新指令(例如CreateICmpEQ
),以将argc
的值与某些常数值进行比较。
相关文章:
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 有没有办法强制C++编译器将变量存储在寄存器中?
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- 视觉 C++编译器在计算其参数之前是否允许将函数 ptr 存储在寄存器中?
- 从LLVM IR中的寄存器中存储该值
- 将临时对象保留在寄存器上以避免虚拟机中的额外存储/加载
- 将EAX寄存器存储在变量中
- 如何从汇编寄存器中获取字符串并将其存储在C++中的变量中
- 如何在"unsigned char"阵列上存储_m128 SSE 寄存器数据?
- 如何在使用高达 SSSE3 的内部函数后存储 16 字节寄存器中的 4 个字节
- 如何在寄存器中存储c++变量
- SSE intrinsic:如何将值存储到寄存器中
- 我实际上是否将对象存储在这里的 cpu 寄存器中
- 为什么我们不能总是在 C 中使用寄存器存储类?