2017-02-16 27 views
1

У меня есть простая программа на C.Получение значения, сохраненного из регистра в llvm IR

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. Ниже кусок кода, который я написал obain в VVALUE из ARGC

auto 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 = секстет i32% ARGC к I64, ДБГ 28

Новый операнд i32% argc

Как я могу получить значение% argc?

ответ

0

Возвращаемое значение getOperand функции Value* объект переменной argc (переменная newOperand в коде). Вы можете передать это значение любой новой инструкции, которую вы, возможно, захотите ввести (например, CreateICmpEQ) в ИК, чтобы сравнить значение argc с некоторым постоянным значением.