аргументы команды getelementptr llvm ir

#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 будет содержать адрес первого символа как an i8* . Если вы передаете такой указатель на функцию, ожидающую C-строку, он представляет всю строку (поскольку строка C считается последовательностью символов, начинающихся с символа, на который указывают, до следующего байта 0).