Как использовать LLVMBuildGEP с LLVM C API - PullRequest
1 голос
/ 17 февраля 2020

Я пытаюсь использовать 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 об этом, хотя.

...