ABI, кажется, говорит, что каждое восьмибайтовое поле должно быть передано как INTEGER функции, поэтому rdi == foo
и rsi == bar
.
Согласовано, для "global"функции доступны из нескольких блоков компиляции , структура аргумента разбита на куски по восемь байт, первая полностью заполнена foo
, а вторая полностью заполнена bar
.Они классифицируются как INTEGER и поэтому передаются в% rdi и% rsi соответственно.
Аналогично, при возврате мы должны иметь возможность использовать rax
и rdx
, так как мы не делаемнужен указатель памяти в rdi
.
Я не слежу за вашей точкой зрения о% rdi, но я согласен, что члены возвращаемого значения возвращаются в% rax и% rdx.
Действительная реализация сборки, игнорирующая пролог и эпилог, была бы: [...]
Согласовано.
Возможно, мысленнонесовершенный компилятор может заполнить структуру заполнением NO_CLASS и сделать эту сборку недействительной.Мне интересно, записано ли где-нибудь, что структура с только двумя восьмибайтовыми полями должна обрабатываться таким образом.
Компилятор, который создает код, соответствующий SysV x86-64ABI будет использовать уже обсуждаемые регистры для передачи аргумента и возврата возвращаемого значения.Такой компилятор, конечно, не обязан реализовывать тело функции именно так, как вы описываете, но я не вижу вашей озабоченности.Да, эти детали записаны.Хотя конкретный случай, который вы представляете, явно не описан в спецификации ABI, которую вы связали, все поведение, рассмотренное выше, следует из этой спецификации.Это точка этого.
Компилятор, который генерирует код (для глобальной функции), который ведет себя по-другому, не является умственно несовершенным, он не соответствует .
Более широкий контекст моего вопроса заключается в том, что я пишу простой переключатель задач C11 для своего собственного назидания.Я основываю это в основном на boost.context, и именно так boost передает два поля.Я хочу знать, является ли он кошерным при любых обстоятельствах или буст обманывает.
Мне потребовалось бы больше анализа, чем я готов потратить, чтобы точно определить, что Boost делает в коде.Вы указываете на.Обратите внимание, что это , а не , что вы представляете в своем example_function
.Но разумно предположить, что Boost по крайней мере пытается реализовать свои вызовы функций в соответствии с ABI.