#clang #llvm #llvm-ir #instructions
#clang #llvm #llvm-ir #Инструкции
Вопрос:
Я работаю над игрушечным компилятором и пытаюсь сгенерировать байт-код llvm ir, а exe-файл компилирует его с помощью clang. У меня простой вопрос: я искал в Google некоторую информацию о getelementptr
, но я не могу понять, почему я должен передавать два i32
или i64
consts в качестве последних двух аргументов.
Например:
в глобальной области видимости:
@string = constant [4 x i8] c"abc0"
В области действия функции:
;result now contains the value of @string
; instruction | type of result | pointer to @string | what are these two i32 0?
%result = getelementptr [4 x i8], [4 x i8]* @string, i32 0, i32 0
Комментарии:
1. Вы читали часто неправильно понимаемую инструкцию GEP ? В любом случае, первый 0 присутствует, потому
@string
что это указатель на массив, а второй 0 присутствует, потому что нам нужен указатель на символ с индексом 0 массива.2. хорошо, спасибо, вы сказали, что последнее 0 означает символ с индексом 0, но после этой инструкции%result в любом случае будет содержать всю строку
3.
%result
будет содержать адрес первого символа как ani8*
. Если вы передаете такой указатель на функцию, ожидающую C-строку, он представляет всю строку (поскольку строка C считается последовательностью символов, начинающихся с символа, на который указывают, до следующего байта 0).