2015-03-19 2 views
0

У меня есть переменная типа int32_t * в llvm IR, которая хранит адрес места, где хранится int32.Установка значения указателя в LLVM IR

Я хочу, чтобы установить значение этого int32_t * переменная в LLVM IR

Скажем адрес 1223. Затем я попытался следующее. Это верно? Это не похоже на работу

store i64 1223, i32** %1 

Я храню адрес 1223 в int64_t постоянная междунара (так как это 64-разрядная машина) и я создаю команду магазина, чтобы сохранить это значение в памяти, где i32 * сохраняется.

Есть ли лучший способ?

ответ

0

Я предполагаю, что пропуск Validate говорит, что вы делаете что-то неправильно и типы несоответствия StoreInst.

Вы пытаетесь сохранить переменную i64 в области памяти i32, что, очевидно, является проблемой. Для того, чтобы целая переменная указатель вы должны отбрасывать адрес, используя inttoptr бросок:

store i32* inttoptr (i64 1223 to i32*), i32** %1 
+0

Нет, verifyModule доволен тем, что я сделал. И программа работает нормально. Но я буду следовать вашему предложению, так как это кажется правильным путем. – user855

0

Все инструкции LLVM строго типизированных и требуют операнды для поддержания типа корректности. Хотя ваш подход работает на языке C, который имеет менее строгие правила типа, он не работает в LLVM. Вы должны явно преобразовать ваш целочисленную константу к указателю:

%2 = inttoptr i64 1223 to i32* 
store i32* %2, i32** %1 

Преобразование целочисленного типа в указателе делает программу «типа небезопасным», который явно виден через инструкцию inttoptr.

Вы можете прочитать больше об обучении в 3,6 Отличительный безопасный и небезопасный код инструкции произнесения в Инструкция LLVM Установка и компиляция Стратегия: http://llvm.org/pubs/2002-08-09-LLVMCompilationStrategy.html