LLVM IR: инициализация и приведение [20 x i8] - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь инициализировать и затем привести несколько ИК-переменных LLVM следующим образом:

store i64 %content, i64* %5
%tt2 = load i64, i64* %5
%ttt2 = trunc i64 %tt2 to i32

Хотя это кажется тривиальным и работает нормально, я поймал себя на том, чтобы сделать то же самое для [20 * i8] типизированная переменная.Что-то вроде:

store [20 x i8] %content, [20 x i8]* %5
%tt2 = load [20 x i8], [20 x i8]* %5
%ttt2 = trunc [20 x i8] %tt2 to i32

В настоящее время я получил следующее сообщение об ошибке для третьей строки:

недопустимый код операции приведения для приведения из [20 x i8] в i32

Может ли кто-нибудь пролить свет на этот вопрос?Спасибо!

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете trunc из одного целого в другое, но не из массива в целое.Вот как определяется trunc - если вход не является целым числом, то trunc должен будет сделать что-то заметно отличающееся от «отбрасывать биты старшего разряда и сохранять биты младшего разряда».

Я думаю, что наиболее распространенным подходом является приведение указателя, а затем загрузка / сохранение из указателя, который уже соответствует типу, который вы хотите загрузить / сохранить.

(Обратите внимание, что %ttt2 и т. Д. Не являются переменными LLVMэто значения LLVM. Они никогда не меняются.)

...