LLVM StructType isPacked () - PullRequest
       11

LLVM StructType isPacked ()

0 голосов
/ 25 мая 2018

У меня проблема с вызовом функции LLVM StructType isPacked ().Мы используем llvm 3.9.

Under gdb:
(gdb) p *pt
$3 = {
  <llvm::CompositeType> = {
    <llvm::Type> = {
      Context = @0x7fffffffb210, 
      ID = llvm::Type::StructTyID, 
      SubclassData = 9, 
      NumContainedTys = 3, 
      ContainedTys = 0x472fed0
    }, <No data fields>}, 
  members of llvm::StructType: 
  SymbolTableEntry = 0x4731110
}
But 
(gdb) p pt->isPacked()
$5 = false

Упакованная структура - это простая упакованная структура с typedef:

typedef struct aprgb {
      unsigned char R;
      unsigned char G;
      unsigned char B;
    } __attribute__ ((packed)) RGB_t ;
   ...
   void sum(RGB_t *in. ....)
   ...

Я не мог понять, почему isPacked возвращает false.Любая помощь будет оценена.Спасибо!

1 Ответ

0 голосов
/ 25 мая 2018

Я не понимаю, почему ваша структура должна быть упакована на уровне IR.В конце концов, все члены - i8 и никакие дополнения и т. Д. Не требуются (на основных архитектурах).Обратите внимание, что атрибуты уровня источника не переводятся напрямую в функции IR.Вместо этого, внешний интерфейс моделирует любую семантику исходного языка, используя семантику LLVM IR.

Для справки по языку LLVM (https://llvm.org/docs/LangRef.html#t-struct):

Структуры могут быть «упакованными» структурами,которые указывают, что выравнивание структуры составляет один байт, и что между элементами нет заполнения. В неупакованных структурах заполнение между типами полей вставляется, как определено строкой DataLayout в модуле, что требуется для соответствия тому, чтобазовый генератор кода ожидает.

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