Справочник Ada 2012
13.5.1 Разделы представления записей
Раздел record_representation_clause определяет представление записей и расширений записей в памяти, то есть порядок, положение и размер компонентов (включая дискриминанты, если таковые имеются).
Синтаксис
record_representation_clause ::=
for first_subtype_local_name use
record [mod_clause]
{component_clause}
end record;
for first_subtype_local_name use
record [mod_clause]
{component_clause}
end record;
Правила разрешения имен
Правила легальности
first_subtype_local_name в record_representation_clause должен указывать на конкретный тип записи или подтип расширения записи.
Если component_local_name является direct_name, то local_name должен указывать на компонент типа. Для расширения записи компонент не должен наследоваться и не должен быть дискриминантом, соответствующим дискриминанту родительского типа. Если component_local_name имеет attribute_designator, то direct_name local_name должен указывать либо на объявление типа, либо на компонент типа, а attribute_designator должен указывать на определённый реализацией неявный компонент типа.
Значения position, first_bit и last_bit должны быть статическими выражениями. Значение position и first_bit должны быть неотрицательными. Значение last_bit должно быть не меньше first_bit - 1.
Если для типа применяется порядок битов по умолчанию, то:
- значение last_bit должно быть меньше размера самого большого машинного скаляра; или
- значение first_bit должно быть нулём, а значение last_bit + 1 должно быть кратно System.Storage_Unit.
Разрешено не более одного component_clause для каждого компонента типа, включая каждый дискриминант (component_clause могут быть заданы для некоторых, всех или ни одного из компонентов). Места хранения в component_list не должны перекрываться, если они не предназначены для компонентов в разных variant тех же variant_part.
Имя, обозначающее компонент типа, не разрешается в record_representation_clause для типа, за исключением component_local_name в component_clause.
Статическая семантика
record_representation_clause (без mod_clause) определяет расположение.
Если для типа применяется порядок битов по умолчанию, то position, first_bit и last_bit каждого component_clause напрямую определяют положение и размер соответствующего компонента.
Если для типа применяется нестандартный порядок битов, то расположение определяется следующим образом:
- элементы component_clause, для которых значение last_bit больше или равно размеру самого большого машинного скаляра, непосредственно определяют положение и размер соответствующего компонента;
- для других component_clause, все компоненты, имеющие одинаковое значение position, рассматриваются как часть одного машинного скаляра, расположенного в этом position; размер этого машинного скаляра является наименьшим размером машинного скаляра, большим, чем наибольшее значение last_bit для всех component_clause в этом position; значения first_bit и last_bit каждого component_clause затем интерпретируются как смещения битов в этом машинном скаляре.
Раздел record_representation_clause для расширения записи не переопределяет расположение родительской части; если расположение было указано для родительского типа, оно наследуется расширением записи.
Разрешения реализации
Реализация может генерировать определенные реализацией компоненты (например, одну, содержащую смещение другого компонента). Реализация может генерировать имена, обозначающие такие определенные реализацией компоненты; такие имена должны быть определёнными реализацией attribute_references. Реализация может разрешать использование таких определённых реализацией имён в record_representation_clauses. Реализация может ограничить такие component_clauses любым способом.
Если record_representation_clause задан для немаркированного производного типа, то атрибуты расположения для всех компонентов производного типа могут отличаться от атрибутов соответствующих компонентов родительского типа, даже для компонентов, расположение которых не указано явно в record_representation_clause.
Рекомендации для реализации
Рекомендуемый уровень поддержки record_representation_clauses:
- Реализация должна поддерживать машинные скаляры, которые соответствуют всем форматам целых, чисел с плавающей точкой и адресов, поддерживаемым машиной.
- Реализация должна поддерживать места хранения, которые можно извлечь с помощью последовательности команд загрузки, маскирования, сдвига машинного кода и установить с помощью последовательности команд загрузки, сдвига, маскирования, сохранения, с учётом доступных машинных инструкций и модели выполнения.
- Место хранения должно поддерживаться, если его размер равен размеру подтипа компонента, а начало и конец находятся на границе, которая подчиняется выравниванию подтипа компонента.
- Для компонента с подтипом, размер которого меньше размера слова, любая область памяти, которая не пересекает выровненную границу слова, должна поддерживаться.
- Реализация может зарезервировать место хранения для поля тега помеченного типа и запретить другим компонентам перекрывать это место.
- Реализация не обязана поддерживать component_clause для компонента части расширения, если место хранения не находится после мест хранения всех компонентов родительского типа, независимо от того, были ли указаны эти места хранения.
ПРИМЕЧАНИЯ
14 Если для компонента не указан component_clause, то выбор места хранения для компонента предоставляется реализации. Если для всех компонентов заданы component_clause, то record_representation_clause полностью определяет представление типа и будет точно соблюдаться реализацией.
Примеры
Пример указания структуры записи типа:
Word : constant := 4; -- элемент хранения — байт, 4 байта на слово
type State is (A,M,W,P);
type Mode is (Fix, Dec, Exp, Signif);
type Mode is (Fix, Dec, Exp, Signif);
type Byte_Mask is array (0..7) of Boolean;
type State_Mask is array (State) of Boolean;
type Mode_Mask is array (Mode) of Boolean;
type State_Mask is array (State) of Boolean;
type Mode_Mask is array (Mode) of Boolean;
type Program_Status_Word is
record
System_Mask : Byte_Mask;
Protection_Key : Integer range 0 .. 3;
Machine_State : State_Mask;
Interrupt_Cause : Interruption_Code;
Ilc : Integer range 0 .. 3;
Cc : Integer range 0 .. 3;
Program_Mask : Mode_Mask;
Inst_Address : Address;
end record;
record
System_Mask : Byte_Mask;
Protection_Key : Integer range 0 .. 3;
Machine_State : State_Mask;
Interrupt_Cause : Interruption_Code;
Ilc : Integer range 0 .. 3;
Cc : Integer range 0 .. 3;
Program_Mask : Mode_Mask;
Inst_Address : Address;
end record;
for Program_Status_Word use
record
System_Mask at 0*Word range 0 .. 7;
Protection_Key at 0*Word range 10 .. 11; -- биты 8,9 не используются
Machine_State at 0*Word range 12 .. 15;
Interrupt_Cause at 0*Word range 16 .. 31;
Ilc at 1*Word range 0 .. 1; -- второе слово
Cc at 1*Word range 2 .. 3;
Program_Mask at 1*Word range 4 .. 7;
Inst_Address at 1*Word range 8 .. 31;
end record;
record
System_Mask at 0*Word range 0 .. 7;
Protection_Key at 0*Word range 10 .. 11; -- биты 8,9 не используются
Machine_State at 0*Word range 12 .. 15;
Interrupt_Cause at 0*Word range 16 .. 31;
Ilc at 1*Word range 0 .. 1; -- второе слово
Cc at 1*Word range 2 .. 3;
Program_Mask at 1*Word range 4 .. 7;
Inst_Address at 1*Word range 8 .. 31;
end record;
for Program_Status_Word'Size use 8*System.Storage_Unit;
for Program_Status_Word'Alignment use 8;
for Program_Status_Word'Alignment use 8;
ПРИМЕЧАНИЯ
15 Примечание к примеру: record_representation_clause определяет структуру записи. Оператор Size гарантирует, что для объектов типа используется (по крайней мере) восемь элементов хранения. Оператор Alignment гарантирует, что адреса связанных, импортированных или экспортированных объектов типа будут кратными восьми.