Справочник Ada 95
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;
component_clause ::=
component_local_name at position range first_bit .. last_bit;
component_local_name at position range first_bit .. last_bit;
position ::= static_expression
first_bit ::= static_simple_expression
last_bit ::= static_simple_expression
Правила разрешения имен
Каждая position, first_bit и last_bit должна быть целого типа.
Правила легитимности
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.
Разрешено не более одного component_clause для каждого компонента типа, включая каждый дискриминант (component_clauses могут быть указаны для некоторых, всех или ни одного из компонентов). Места хранения внутри component_list не должны пересекаться, если они не предназначены для компонентов в различных variant тех же variant_part.
Имя, обозначающее компонент типа, не допускается в record_representation_clause для типа, за исключением component_local_name component_clause.
Статическая семантика
record_representation_clause (без mod_clause) определяет компоновку. Атрибуты места хранения (см. 13.5.2) берутся из значений выражений position, first_bit и last_bit после нормализации этих значений таким образом, чтобы first_bit был меньше Storage_Unit.
record_representation_clause для расширения записи не переопределяет компоновку родительской части; если компоновка была указана для родительского типа, она наследуется расширением записи.
Разрешения реализации
Реализация может генерировать реализационно-определённые компоненты (например, один, содержащий смещение другого компонента). Реализация может генерировать имена, которые обозначают такие реализационно-определённые компоненты; такие имена должны быть реализационно-определёнными attribute_references. Реализация может разрешить использование таких реализационно-определённых имён в record_representation_clauses. Реализация может ограничить такие component_clauses любым способом.
Если для неименованного производного типа задан record_representation_clause, атрибуты места хранения для всех компонентов производного типа могут отличаться от атрибутов соответствующих компонентов родительского типа, даже для компонентов, место хранения которых не указано явно в record_representation_clause.
Рекомендации по реализации
Рекомендуемый уровень поддержки record_representation_clauses:
- Реализация должна поддерживать места хранения, которые можно извлечь с помощью последовательности команд загрузки, маскирования, сдвига и установить с помощью последовательности команд загрузки, сдвига, маскирования, сохранения, учитывая доступные машинные инструкции и модель выполнения.
- Место хранения должно поддерживаться, если его размер равен размеру подтипа компонента, и оно начинается и заканчивается на границе, которая подчиняется выравниванию подтипа компонента.
- Если для объявления данного типа применяется порядок битов по умолчанию, то для компонента, размер подтипа которого меньше размера слова, должна поддерживаться любая область хранения, которая не пересекает выровненную границу слова.
- Реализация может зарезервировать область хранения для поля тега помеченного типа и запретить другим компонентам перекрывать это место.
- Реализация не обязана поддерживать component_clause для компонента части расширения, если место хранения не находится после мест хранения всех компонентов родительского типа, независимо от того, были ли эти места хранения указаны.
ПРИМЕЧАНИЯ
12 Если для компонента не указан component_clause, выбор места хранения для компонента оставляется на усмотрение реализации. Если component_clauses указаны для всех компонентов, 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;
ПРИМЕЧАНИЯ
13 Примечание к примеру: record_representation_clause определяет компоновку записи. Описание Size гарантирует, что (по крайней мере) восемь элементов хранения используются для объектов типа. Описание Alignment гарантирует, что адресуемые, импортированные или экспортированные объекты типа будут иметь адреса, кратные восьми.