Установить значение для llvm :: ConstantInt - PullRequest
6 голосов
/ 08 февраля 2012

Я играю с LLVM. Я думал об изменении значения константы в промежуточном коде. Однако для класса llvm :: ConstantInt я не вижу функцию setvalue. Любая идея, как я могу изменить значение константы в ИК-коде?

1 Ответ

12 голосов
/ 08 февраля 2012

ConstantInt - это фабрика, не так ли? Класс имеет метод get для создания новой константы:

     /* ... return a ConstantInt for the given value. */
00069   static Constant *get(Type *Ty, uint64_t V, bool isSigned = false);

Так что, я думаю, вы не можете изменить существующий ConstantInt. Если вы хотите изменить IR, вы должны попытаться изменить указатель на аргумент (изменить сам IR, но не постоянный объект).

Может быть, вы хотите что-то подобное (пожалуйста, помните, у меня нулевой опыт работы с LLVM; и я почти уверен, что пример неверен).

Instruction *I = /* your argument */;
/* check that instruction is of needed format, e.g: */
if (I->getOpcode() == Instruction::Add) {
   /* read the first operand of instruction */
   Value *oldvalue = I->getOperand(0);

   /* construct new constant; here 0x1234 is used as value */
   Value *newvalue = ConstantInt::get(oldValue->getType(), 0x1234); 

   /* replace operand with new value */
   I->setOperand(0, newvalue);
}

Чтобы «изменить» только одну константу, есть решение (показаны увеличение и уменьшение ):

 /// AddOne - Add one to a ConstantInt.
 static Constant *AddOne(Constant *C) {
   return ConstantExpr::getAdd(C, ConstantInt::get(C->getType(), 1));
 }

 /// SubOne - Subtract one from a ConstantInt.
 static Constant *SubOne(ConstantInt *C) {
   return ConstantInt::get(C->getContext(), C->getValue()-1);
 }

PS, у Constant.h есть важный комментарий в начале о создании и удалении констант http://llvm.org/docs/doxygen/html/Constant_8h_source.html

00035 /// Note that Constants are immutable (once created they never change) 
00036 /// and are fully shared by structural equivalence.  This means that two 
00037 /// structurally equivalent constants will always have the same address.  
00038 /// Constants are created on demand as needed and never deleted: thus clients 
00039 /// don't have to worry about the lifetime of the objects.
00040 /// @brief LLVM Constant Representation
...