Ада-95. Компилятор GNAT



         

Получение расширенной информации компилятора


Опция командной строки компилятора -gnatG

позволяет получить информацию о том как GNAT интерпретирует исходный текст после его первоначального анализа.

Если при этом одновременно использована опция -gnatD, то GNAT сохранит эту информацию в файле с расширением имени .dg

(для отладки "debug").

Для демонстрации использования опции -gnatG

рассмотрим пример простой программы Pointers:

with System.Address_To_Access_Conversions; with Ada.Text_IO; use Ada.Text_IO;

procedure Pointers is

package Int_Ptrs is new System.Address_To_Access_Conversions( Integer ); -- Конкретизация настраиваемого пакета для обеспечения возможности -- выполнения преобразования между ссылочными типами и адресами. -- Это также дополнительно создает ссылочный тип Object_Pointer, -- позволяющий ссылаться на значения целочисленного типа Integer.

Five : aliased Integer := 5; -- Переменная Five описана как косвенно адресуемая, -- поскольку мы будем обращаться к ней с помощью -- значений ссылочного типа

Int_Pointer : Int_Ptrs.Object_Pointer; -- Обобщенный ссылочный тип Ады

Int_Address : System.Address; -- Адрес в памяти, подобный указателю языка C

begin

Int_Pointer := Five'Unchecked_Access; -- Использование атрибута 'Unchecked_Access необходимо, -- поскольку переменная Five локальна для головной программы. -- Если бы она была глобальной, то мы могли бы использовать -- атрибут 'Access вместо атрибута 'Unchecked_Access.

Int_Address := Five'Address; -- Адреса моут быть определены с помощью атрибута 'Address. -- Это эквивалентно указателям языка C.

Int_Pointer := Int_Ptrs.To_Pointer( Int_Address ); Int_Address := Int_Ptrs.To_Address( Int_Pointer ); -- Преобразование типов указателей Ады и C.

end Pointers;

Используя опцию командной строки компилятора -gnatG, для показанной выше программы Pointers, можно получить от GNAT информацию о результате анализа этой программы.

В данном случае, это отображает результаты конкретизации настраиваемого пакета:

Source recreated from tree for Pointers (body) ----------------------------------------------

with ada; with system; with system.system__address_to_access_conversions; with ada.ada__text_io; use ada.ada__text_io; with system; with system; with unchecked_conversion;

procedure pointers is

package int_ptrs is subtype int_ptrs__object is integer; package int_ptrs__address_to_access_conversions renames int_ptrs; type int_ptrs__object_pointer is access all int_ptrs__object; for int_ptrs__object_pointer'size use 32; function pointers__int_ptrs__to_pointer (value : system__address) return int_ptrs__object_pointer; function pointers__int_ptrs__to_address (value : int_ptrs__object_pointer) return system__address; pragma convention (intrinsic, pointers__int_ptrs__to_pointer); pragma convention (intrinsic, pointers__int_ptrs__to_address); end int_ptrs;

package body int_ptrs is

function pointers__int_ptrs__to_address (value : int_ptrs__object_pointer) return system__address is begin if value = null then return system__null_address; else return value.all'address; end if; end pointers__int_ptrs__to_address;

function pointers__int_ptrs__to_pointer (value : system__address) return int_ptrs__object_pointer is

package a_to_pGP3183 is subtype a_to_pGP3183__source is system__address; subtype a_to_pGP3183__target is int_ptrs__object_pointer; function pointers__int_ptrs__to_pointer__a_to_pGP3183__a_to_pR (s : a_to_pGP3183__source) return a_to_pGP3183__target; end a_to_pGP3183; function a_to_p is new unchecked_conversion (system__address, int_ptrs__object_pointer); begin return a_to_pGP3183__target!(a_to_pGP3183__source(value)); end pointers__int_ptrs__to_pointer; end int_ptrs;

package int_ptrs is new system.system__address_to_access_conversions (integer); five : aliased integer := 5; int_pointer : int_ptrs.int_ptrs__object_pointer := null; int_address : system.system__address; begin int_pointer := five'unchecked_access; int_address := five'address; int_pointer := int_ptrs.pointers__int_ptrs__to_pointer (int_address); int_address := int_ptrs.pointers__int_ptrs__to_address (int_pointer); return; end pointers;




Содержание  Назад  Вперед