[fpc-devel] OSX: Setting up parameters to objc_msgSend()

David Jenkins david at scootersoftware.com
Thu Oct 11 23:51:05 CEST 2018


Thanks.  I'll get a bug report in tomorrow morning.

On 10/11/18 3:16 PM, Jonas Maebe wrote:
> On 11/10/18 21:41, David Jenkins wrote:
>
>> Here is the assembly code generated by fpc (3.1.1) for just the 
>> section where .setEnabled(Enabled) is called
>>
>> ->  0x1001ba68d <+61>:  movq   -0x8(%rbp), %rdi
>>      0x1001ba691 <+65>:  callq  0x1002016d0 ; GETHANDLE at 
>> menuitem.inc:515
>>      0x1001ba696 <+70>:  movq   %rax, %rbx
>>      0x1001ba699 <+73>:  movq   0x329ee0(%rip), %rsi ; "setEnabled:"
>>      0x1001ba6a0 <+80>:  movb   -0x10(%rbp), %dl
>>      0x1001ba6a3 <+83>:  movq   %rbx, %rdi
>>      0x1001ba6a6 <+86>:  callq  0x1002d23da ; symbol stub for: 
>> objc_msgSend
>>
>> Notice the the value of Enabled (a BOOL) is treated as 8bit (which 
>> BOOL is) and placed into the lowest 8 bits of edx with the line 'movb 
>> -0x10(%rbp), %dl'.  Which means that the upper 24 bits of edx are not 
>> changed (not cleared, not signed extended, nothing, just left alone).
>
> That's because the x86-64 ABI says 
> (https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf 
> ):
>
> ***
> When a value of type _Bool is returned or passed in a register or on 
> the stack, bit 0 contains the truth value and bits 1 to 7 shall be 
> zero. (14)
>
> ...
>
> (14) Other bits are left unspecified, hence the consumer side of those 
> values can rely on it being 0 or 1 when truncated to 8 bit
> ***
>
> However, the Objective-C BOOL type does not map to _Bool on x86-64, 
> but to signed char. And values of that type indeed do need to (sign) 
> extended. So this needs to be fixed in the compiler. Please file a bug 
> report, and thanks for the analysis.
>
>
> Jonas
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel





More information about the fpc-devel mailing list