2016-09-11 4 views
1

У меня есть программа, которая выделяет память из стека, как это:LLVM Как получить возвращаемое значение инструкции

%x = alloca i32, align 4 

В моем проходе я хочу, чтобы получить фактический указатель памяти, который указывает на этой выделенной памяти во время выполнения , Это должно быть% x. Как получить указатель в моем проходе?

Instruction* I; 
if (AllocaInst* AI = dyn_cast<AllocaInst>(I)) { 
    //How to get %x? 
} 

ответ

3

Вы можете работать с инструкцией * в качестве значения * (и инструкция наследует от стоимости), то вы работаете со значением результата/возврат этой инструкции. Я адаптировал некоторый код из моего LLVM Pass, чтобы продемонстрировать выделение пространства с помощью alloca, а затем сохранить в этом месте. Обратите внимание, что результаты инструкций могут быть напрямую переданы другим инструкциям, так как они являются значениями.

// M is the module 
    // ci is the current instruction 
    LLVMContext &ctx = M.getContext(); 
    Type* int32Ty = Type::getInt32Ty(ctx); 
    Type* int8Ty = Type::getInt8Ty(ctx); 
    Type* voidPtrTy = int8Ty->getPointerTo(); 

    // Get an identifier for rand() 
    Constant* = M.getOrInsertFunction("rand", FunctionType::get(cct.int32Ty, false)); 

    // Construct the struct and allocate space 
    Type* strTy[] = {int32Ty, voidPtrTy}; 
    Type* t = StructType::create(strTy); 
    Instruction* nArg = new AllocaInst(t, "Wrapper Struct", ci); 

    // Add Store insts here 
    Value* gepArgs[2] = {ConstantInt::get(int32Ty, 0), ConstantInt::get(int32Ty, 0)}; 
    Instruction* prand = GetElementPtrInst::Create(NULL, nArg, ArrayRef<Value*>(gepArgs, 2), "RandPtr", ci); 

    // Get a random number 
    Instruction* tRand = CallInst::Create(getRand, "", ci); 

    // Store the random number into the struct 
    Instruction* stPRand = new StoreInst(tRand, prand, ci); 
0

Если вы хотите сохранить или загрузить в% х вы просто использовать магазин или крышкой ИНСТРУКЦИЯ

Если вы хотите, чтобы числовое значение указателя, используйте инструкцию ptrtoint.

Смежные вопросы