Я пытаюсь использовать Bison и Flex, чтобы учесть инструкцию, которая получает значение по индексу массива. Например, если инструкция была:
(aref array 2)
, инструкция загружала бы значение по индексу 2 массива (3-й элемент).
Я пытаюсь чтобы вычислить смещение массива с помощью LLVMBuildGEP (), но моя инструкция LLVM продолжает получать доступ к недопустимой памяти и возвращать ошибку недопустимой записи. Я просмотрел документацию doxygen , но я не совсем уверен, что означают аргументы функции. Прямо сейчас я предполагаю, что аргумент Pointer
является начальным адресом массива, аргумент Indices
является представлением указателя смещения (я не понимаю этого), а аргумент NumIndices
является числом элементы, которые вы хотите вернуть, но я не понимаю, как это работает и правильно ли я это использую.
Это то, что я делаю, чтобы попытаться получить элемент из моего файла зубров. token_or_expr
может быть вычислено как целое число, LPAREN
и RPAREN
- это левые и правые скобки, aref
- команда, а ID
- имя массива. Я получаю значение идентификатора, используя структуру данных карты, которая, я уверен, работает через различные тесты. Структура данных возвращает адрес, который может быть загружен с помощью LLVMBuildLoad
. expr_no_return
- это просто глобальная переменная, которую я установил в 0 или 1, в зависимости от того, передал ли я LLVMValueRef
дерево разбора или нет. Вот мой смысл:
| LPAREN AREF ID token_or_expr RPAREN
{
// IMPLEMENT
LLVMValueRef loc = map_find($3);
if(loc!=NULL){
//$$ = LLVMBuildGEP(Builder,loc,$4,1,"element");
LLVMTypeRef int32ptr = LLVMPointerType(LLVMInt32Type(),0);
LLVMValueRef int2ptr = LLVMBuildIntToPtr(Builder,$4,int32ptr,"ptr");
expr_no_return = 0;
$$ = LLVMBuildGEP(Builder,loc,int2ptr,1,"element");
}
else{
yyerror("ERROR: Undefined array.");
}
printf("AREF\n");
//DONE
}
Компилятор выдает предупреждение, что int2ptr
это LLVMValueRef
и что это должно быть LLVMValueRef *
. Я не уверен, как go об этом, хотя.