Найти в Дзене
Данил Волокитин

2.2.5 Неявный режим возврата

Связанные параметры: call_counter_size_p, return_stack_size_p, itype_width_p. Хотя возврат функции обычно является косвенным переходом, программы с хорошим поведением возвращаются к точке в программе, из которой была вызвана функция, используя стандартное соглашение о вызове. Для этих программ можно определить путь выполнения без явного уведомления об адресе назначения возврата. Неявный режим возврата может привести к очень значительному повышению эффективности кодировщика трассировки. Возврат может рассматриваться как выводимый только в том случае, если соответствующий вызов уже был зарегистрирован в более раннем пакете. Кодировщик должен убедиться, что это так. Это может быть достигнуто с помощью счетчика для отслеживания количества отслеживаемых вложенных вызовов. Счетчик увеличивается при вызовах (но не при последующих вызовах) и уменьшается при возвратах (определения см. в разделе 3.1.1). Счетчик не будет переполняться или уменьшаться, и сбрасывается на 0 всякий раз,

Связанные параметры: call_counter_size_p, return_stack_size_p, itype_width_p.

Хотя возврат функции обычно является косвенным переходом, программы с хорошим поведением возвращаются к точке в программе, из которой была вызвана функция, используя стандартное соглашение о вызове. Для этих программ можно определить путь выполнения без явного уведомления об адресе назначения возврата. Неявный режим возврата может привести к очень значительному повышению эффективности кодировщика трассировки.

Возврат может рассматриваться как выводимый только в том случае, если соответствующий вызов уже был зарегистрирован в более раннем пакете. Кодировщик должен убедиться, что это так. Это может быть достигнуто с помощью счетчика для отслеживания количества отслеживаемых вложенных вызовов. Счетчик увеличивается при вызовах (но не при последующих вызовах) и уменьшается при возвратах (определения см. в разделе 3.1.1). Счетчик не будет переполняться или уменьшаться, и сбрасывается на 0 всякий раз, когда отправляется пакет синхронизации. Возвраты будут рассматриваться как выводимые и не будут генерировать пакет трассировки, если количество не равно нулю (т. е. о связанном вызове уже сообщалось в более раннем пакете).

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

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