On 22.6.2010 15:39, Stephen Leake wrote: > Tero Koskinen <[email protected]> writes: > >> procedure printf (S : Interfaces.C.char_array; I : Interfaces.C.Int); >> pragma Import (C, printf, "printf"); > > This is _not_ guaranteed to work;
Thanks. This indeed seem to be the issue. I was comparing the assembly generated for Ada and C version of printf call and noticed that for Ada GCC uses movl instruction to move string location into register and for C GCC uses movq instruction and in addition resets eax/rax to 0. Ada: movl .LC0, %edi movl $99999, %esi call printf C: movq .LC0, %rdi movl $99999, %esi movl $0, %eax call printf "movl .LC0, %edi" is same as "movq .LC0, %rdi" when .LC0 resides on the lower half of the address space (like .rodata section and NOT in stack). When the data is in the stack, GNAT correctly uses movq. movl seems like some optimization done by GNAT, although I am not sure is it always correct. (Can the .rodata sections appear on the upper half of the address space?) Adding "movl $0, %eax" to the Ada version of the code allowed made the printf call work for Ada also, but I am really not into inserting random assembly instructions in my code, so I'll probably end up doing the wrapper for printf as the user guide suggests. -Tero -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected] Archive: http://lists.debian.org/[email protected]
