Имена и параметры переменных инструкции LLVM - PullRequest
9 голосов
/ 22 марта 2012

Я пытаюсь обнаружить объявления массива и построить таблицу значений символов для статических массивов.Он будет содержать пару name-arraySize.У меня есть несколько вопросов:

  1. При наличии такой инструкции, как %a = alloca [200 x i8], align 16
    как мне извлечь a, имя массива из него?

  2. Я пытаюсь извлечь 200 в качестве размера массива, но этот код:

    if(AllocaInst *allocInst = dyn_cast<AllocaInst>(&*I)){
         PointerType *p = allocInst->getType();
         if(p->getElementType()->isArrayTy()){
              Value* v = allocInst->getOperand(0);
              errs() << *v ;
         }
    } 
    

    дает мне i32 1, когда я печатаю v.
    Кто-нибудьзнаете, почему это так?
    Я не думал, что в этом есть что-то 32-битное, кроме, может быть, адреса.

1 Ответ

3 голосов
/ 02 июня 2014

Некоторые ответы есть в комментариях, но здесь есть более полное объяснение.

Существует два источника размера в alloca: размер выделенного типа иколичество элементов этого типа, которые выделяются.Если вы не укажете число явно, вы получите неявное значение по умолчанию для выделения одного элемента .Это значение i32 1, которое вы получаете из операнда # 0. Если выделенный тип является типом массива (для проверки используйте dyn_cast<...>, так как cast<...> подтвердит), то вам также необходимо учитывать этот размер.

В LLVMоптимизатор канонизирует команды alloca со статическим размером больше единицы в инструкцию alloca одного массива с таким размером.Таким образом, вы чаще всего видите размер alloca как постоянный.

Есть и более дружественные API для этого: http://llvm.org/docs/doxygen/html/classllvm_1_1AllocaInst.html

В частности, AllocaInst::getArraySize() даст вам числоэлементы (обычно 1) и AllocaInst::getAllocatedType() получат тип выделенного элемента (иногда массив).

Наконец, примечание об использовании имени: LLVM не делает any гарантии об именах инструкций.Различные части оптимизатора будут уничтожать имена или менять их.Просто будьте осторожны, используя их для производственного кода, так как вы можете быть удивлены, когда они исчезнут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...