Llvm добавление 8-байтовых метаданных для каждого распределения стека

saman jafari спросил: 13 июня 2018 в 07:24 в: c++

Я новичок в llvm pass, и я хочу написать код, с помощью которого я могу добавить метаданные перед каждым распределением объектов стека. Другими словами, всякий раз, когда я вижу AllocaInst, я выделил стек и заполнил его своим значением. Однако, когда я проверяю стек (в gdb), я вижу, что все метаданные добавляются сначала в стек, а затем в объекты стека. Но я пытался получить метаданные между каждым стеке (как показано ниже)

<metadata>
stack_obj1
<metadata>
stack_obj2

Вот что я написал:

if (AllocaInst *AI = dyn_cast<AllocaInst>(&I)){
   IRBuilder<> IRB(AI);
   auto* A = IRB.CreateAlloca (IntTy->getPointerTo(), nullptr, "a");
   auto* V = ConstantInt::get(Type::getInt8Ty(m.getContext()), <a value>)
   IRB.CreateStore(V, A, false);
}

1 ответ

Есть решение
ConsistentProgrammer ответил: 15 июня 2018 в 02:05

Попробуйте добавить метаданные следующим образом:

  if (llvm::Instruction* I = dyn_cast<llvm::Instruction>(X)) {
            llvm::Value *C = llvm::ConstantInt::get(
                llvm::Type::getInt32Ty(VMContext), 100);
            llvm::MDNode *Ndata = llvm::MDNode::get(VMContext,
                llvm::ValueAsMetadata::getConstant(C));
            I->setMetadata("meta_data", Ndata);
    }

Вам нужно будет адаптировать эту логику для своего собственного кода. Следует отметить, что нам не нужно создавать узел хранилища для добавления к нему некоторых метаданных.

saman jafari ответил: 17 июня 2018 в 07:39
Большой! Я могу получить следующий код: auto AI = dyn_cast < AllocaInst > (LI- gt; getOperand (0)); llvm :: MDNode md = cast < llvm :: MDNode > (AI- > getMetadata ("meta_data"));
saman jafari ответил: 18 июня 2018 в 05:20
Теперь у меня есть metadata i64 100. Я не уверен, как передать его функции для выполнения проверок? Однако у меня есть c-файл с функцией, так как тип - это метаданные, которые я не могу передать в вышеупомянутую функцию. Обязательно ли мне определять внутреннюю функцию?

Дополнительное видео по вопросу: Llvm добавление 8-байтовых метаданных для каждого распределения стека

[C++] Stack - Структура данных Стек

Функции и стек. Стек алгоритм. Стек что это. Стек рекурсии. Стек c++. Стек рекурсивных вызовов #42

уроки по с++. 20 урок. Стек