blob: 4b738c0cf36946463d6d9035c08d7a6c930f0bcf [file] [log] [blame]
:orphan:
``@_transparent``
=================
Semantically, ``@_transparent`` means something like "treat this operation as
if it were a primitive operation". The name is meant to imply that both the
compiler and the compiled program will "see through" the operation to its
implementation.
This has several consequences:
- Any calls to a function marked ``@_transparent`` MUST be inlined prior to
doing dataflow-related diagnostics, even under ``-Onone``. This may be
necessary to *catch* dataflow errors.
- Because of this, a ``@_transparent`` function is inherently "fragile", in
that changing its implementation most likely will not affect callers in
existing compiled binaries.
- Because of this, a ``@_transparent`` function MUST only reference public
symbols, and MUST not be optimized based on knowledge of the module it's in.
[This is not currently implemented or enforced.]
- Debug info SHOULD skip over the inlined operations when single-stepping
through the calling function.
This is all that ``@_transparent`` means.
When should you use ``@_transparent``?
--------------------------------------
- Does the implementation of this function ever have to change? Then you can't
allow it to be inlined.
- Does the implementation need to call private things---either true-``private``
functions, or ``internal`` functions that might go away in the next release?
Then you can't allow it to be inlined. (Well, you can for now for
``internal``, but it'll break once we have libraries that aren't shipped with
apps.)
- Is it okay if the function is *not* inlined? You'd just prefer that it were?
Then you should use [the attribute we haven't designed yet], rather than
``@_transparent``. (If you really need this right now, try
``@inline(__always)``.)
- Is it a problem if the function is inlined even under ``-Onone``? Then you're
really in the previous case. Trust the compiler.
- Is it a problem if you can't step through the function that's been inlined?
Then you don't want ``@_transparent``; you just want ``@inline(__always)``.
- Is it okay if the inlining happens after all the dataflow diagnostics? Then
you don't want ``@_transparent``; you just want ``@inline(__always)``.
If you made it this far, it sounds like ``@_transparent`` is the right choice.
Current implementation limitations
----------------------------------
- We don't have a general ``@inlineable`` attribute for functions that *allows*
inlining but doesn't *require* it.
- As mentioned above, we don't enforce that inlineable things only refer to
public symbols. rdar://problem/22666548
- We also don't keep from optimizing based on implementation details of the
current module. [No Radar yet.]
- If you have local types in your inlineable function, serialization falls
over. (As does textual SIL.) rdar://problem/17631278
- When compiling in non-single-frontend mode, SIL is generated for each file
but then thrown away in the "merge modules" step. So none of it is inlineable
for external callers. (Currently, ``-whole-module-optimization`` is
equivalent to ``-force-single-frontend-invocation``.) rdar://problem/18913977
- Similarly, when compiling in non-single-frontend mode, no SIL is generated for
any functions but those in the primary file (for each frontend invocation),
including ``@inline(__always)`` and ``@_transparent`` functions. This is
semantically a bug. rdar://problem/15366167