For P a subprogram, P'Code_Address is expected to return the address at which the machine code for P starts.
It differs from 'Address on targets where function symbol names denote the address of a function descriptor, a record from which the code address can be fetched (e.g. on ppc-aix). On such targets, P'Address is expected to return the descriptor address, and it does. P'Code_Address should fetch the code address from the, descriptor but we have nothing in place to achieve that today. It just returns the same as 'Address. The attached patch is the gigi part of a change to fix this, relying on a tm definition that we'll be submitting later on. With everything in place, the testcase below is expected to display "OK". Bootstrapped and regtested on x86_64-pc-linux-gnu Olivier 2015-03-12 Olivier Hainque <hain...@adacore.com> * gcc-interface/trans.c (Attribute_to_gnu) <Code_Address case>: On targets where a function symbol designates a function descriptor, fetch the function code address from the descriptor. -- with System, Ada.Unchecked_Conversion; with Ada.Text_IO; use Ada.Text_IO; procedure Code_Addr_P is Addr, Code_Addr : System.Address; type Fn_Descriptor is record Fn_Address : System.Address; end record; type Descriptor_Access is access all Fn_Descriptor; function To_Descriptor_Access is new Ada.Unchecked_Conversion (System.Address, Descriptor_Access); Da : Descriptor_Access; use type System.Address; begin Addr := Code_Addr_P'Address; Code_Addr := Code_Addr_P'Code_Address; Da := To_Descriptor_Access (Addr); if Da.Fn_Address /= Code_Addr then raise Program_Error; end if; Put_Line ("OK"); end;
fndesc.diff
Description: Binary data