Что происходит с пустыми классами в AMD64 ABI?

Я просматриваю AMD64 ABI, и он похоже, не указано, как передавать пустые типы классов. Для функций-членов пустого класса кажется, что this передается как обычно, но для пустых классов Clang генерирует код, который просто игнорирует этот класс. Это правильно согласно AMD64 ABI?


person Puppy    schedule 24.04.2013    source источник
comment
Можете ли вы привести пример, который мы можем запустить в проводнике gcc, чтобы сравнить сгенерированный код clang и gcc? И, может быть, указать более точно, что заставляет вас думать, что он игнорирует указатель this?   -  person PlasmaHH    schedule 24.04.2013
comment
Вы имеете в виду, если вы передаете объект класса по значению?   -  person Mats Petersson    schedule 24.04.2013
comment
Для C++ документ, на который вы ссылаетесь, ссылается на IA-64 C++ ABI, в главе 3.1.3 говорится: Empty classes will be passed no differently from ordinary classes. Не совсем уверен, что это именно тот контекст, о котором вы спрашиваете, но я бы сказал, что Clang ошибается...   -  person Andreas Fester    schedule 24.04.2013


Ответы (1)


Хотя неясно, в чем именно заключается вопрос, ответ довольно ясен в отношении того, что такое C++ ABI:

Для C++ ABI мы будем использовать IA-64 C++ ABI и создадим его соответствующим образом. Текущий проект этого ABI доступен по адресу:

Ссылка на текущее местоположение спецификации Itanium ABI

Это говорит:

Пустые классы будут сдаваться не иначе, как обычные классы. При передаче в регистрах бит NaT не должен устанавливаться во всех регистрах, составляющих класс.

Содержимое однобайтового слота параметра не указано, и вызываемый объект может не зависеть ни от какого конкретного значения. В Itanium соответствующий бит NaT не должен быть установлен, если слот параметра связан с регистром.

Еще одна подсказка доступна здесь:

Результат пустого типа класса будет возвращен, как если бы это была структура, содержащая один символ, т. е. struct S { char c; };. Фактическое содержимое регистра возврата не указано. В Itanium соответствующий бит NaT не должен быть установлен.

Таким образом, пустой класс следует рассматривать как структуру, содержащую единственный символ, но этот единственный символ никогда не используется.

Конечно, возможно, что в clang есть ошибка, связанная с пустыми классами. Хотя сомневаюсь, если честно.

person Mats Petersson    schedule 24.04.2013
comment
Я высказал предположение в #llvm, что двоичный интерфейс может быть идентичен, в зависимости от соглашения о вызовах, то есть, если бы я должен был привести указатель к функции, которая пропустила пустой класс в качестве последнего параметра, а затем передала значение , что это будет незаметно для вызываемого объекта. - person Puppy; 24.04.2013
comment
Не уверен, что понимаю ваш комментарий, но, насколько объясняет ABI, вы не можете игнорировать пустые классы. Но передача дополнительного параметра функции почти всегда незаметна для вызываемого объекта — единственный случай, когда это неверно, — это когда аргументы передаются в порядке справа налево или когда вызываемый объект отвечает за очистку аргументов из стека. - person Mats Petersson; 24.04.2013