Hi Blaine,
On Tue, Mar 16, 2010 at 2:21 PM, Blaine Garst <[email protected]> wrote:
> Author: blaine
> Date: Tue Mar 16 16:21:07 2010
> New Revision: 98676
>
> URL: http://llvm.org/viewvc/llvm-project?rev=98676&view=rev
> Log:
> rev existing doc to account for recent ABI changes
>
> Modified:
> cfe/trunk/docs/BlockImplementation.txt
>
> Modified: cfe/trunk/docs/BlockImplementation.txt
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/BlockImplementation.txt?rev=98676&r1=98675&r2=98676&view=diff
> ==============================================================================
> --- cfe/trunk/docs/BlockImplementation.txt (original)
> +++ cfe/trunk/docs/BlockImplementation.txt Tue Mar 16 16:21:07 2010
> @@ -30,10 +30,17 @@
> 2008/10/30 - revise new layout to have invoke function in same place
> 2008/10/30 - add __weak support
>
> +2010/3/16 - rev for stret return, signature field
> +
> This document describes the Apple ABI implementation specification of Blocks.
>
> +The first shipping version of this ABI is found in Mac OS X 10.6, and shall
> be referred to as 10.6.ABI. Proposals have been made to enhance the blocks
> compiler and runtime, and these changes would form a new ABI called
> post-10.6.ABI if these changes were ever shipped in a product, which is
> purely speculative.
> +
> +Since the Apple ABI references symbols from other elements of the system,
> any attempt to use this ABI on systems prior to SnowLeopard is undefined.
> +
> 1. High Level
>
> +The ABI of blocks consist of their layout and the runtime functions required
> by the compiler.
> A Block consists of a structure of the following form:
>
> struct Block_literal_1 {
> @@ -43,23 +50,37 @@
> void (*invoke)(void *, ...);
> struct Block_descriptor_1 {
> unsigned long int reserved; // NULL
> - unsigned long int size; // sizeof(struct Block_literal_1)
> + unsigned long int size; // sizeof(struct Block_literal_1)
> // optional helper functions
> - void (*copy_helper)(void *dst, void *src);
> - void (*dispose_helper)(void *src);
> + void (*copy_helper)(void *dst, void *src); // IFF (1<<25)
> + void (*dispose_helper)(void *src); // IFF (1<<25)
> + // required post 10.6.ABI
> + const char *signature; // IFF (1<<30)
> } *descriptor;
> // imported variables
> };
>
> -The following flags bits are used by the compiler:
> +The following flags bits are in use thusly for a possible post.10.6.ABI:
>
> enum {
> BLOCK_HAS_COPY_DISPOSE = (1 << 25),
> BLOCK_HAS_CTOR = (1 << 26), // helpers have C++ code
> BLOCK_IS_GLOBAL = (1 << 28),
> - BLOCK_HAS_DESCRIPTOR = (1 << 29), // interim until complete world
> build is accomplished
> + BLOCK_HAS_STRET = (1 << 29),
> + BLOCK_HAS_SIGNATURE = (1 << 30),
> };
>
> +In 10.6.ABI the (1<<29) was unconditionally set and ignored by the runtime -
> it was a transitional marker that did not get deleted after the transition.
> This bit is now paired with (1<<30), and represented as the pair (3<<30), for
> the following combinations of valid bit settings, and their meanings.
3 << 30 should be 3 << 29?
- Daniel
> +
> +switch (flags & (3<<29)) {
> + case (0<<29): <unused> , error
> + case (1<<29): 10.6.ABI, no signature field available
> + case (2<<29): post-10.6.ABI, regular calling convention, presence of
> signature field
> + case (3<<29): post-10.6.ABI, street calling convention, presence of
> signature field,
> +}
> +
> +The following discussions are presented as 10.6.ABI otherwise.
> +
> Block literals may occur within functions where the structure is created in
> stack local memory. They may also appear as initialization expressions for
> Block variables of global or static local variables.
>
> When a Block literal expression is evaluated the stack based structure is
> initialized as follows:
> @@ -72,6 +93,7 @@
> 2a) the isa field is set to the address of the external
> _NSConcreteStackBlock, which is a block of uninitialized memory supplied in
> libSystem, or _NSConcreteGlobalBlock if this is a static or file level block
> literal.
> 2) The flags field is set to zero unless there are variables imported into
> the block that need helper functions for program level Block_copy() and
> Block_release() operations, in which case the (1<<25) flags bit is set.
>
> +
> As an example, the Block literal expression
> ^ { printf("hello world\n"); }
> would cause to be created on a 32-bit system:
>
>
> _______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits