@@ -143,6 +143,57 @@ feature detection on the x86 platforms.
143
143
> may be enabled or disabled for an entire crate with the
144
144
> [ ` -C target-feature ` ] flag.
145
145
146
+ ## The ` track_caller ` attribute
147
+
148
+ The ` track_caller ` attribute may be applied to any function with [ ` "Rust" ` ABI] [ rust-abi ] . When
149
+ applied to functions and methods in trait declarations, the attribute applies to all
150
+ implementations. If the trait provides a default implementation with the attribute, then the
151
+ attribute also applies to override implementations.
152
+
153
+ When applied to a function in an ` extern ` block the attribute must also be applied to any linked
154
+ implementations, otherwise undefined behavior results. When applied to a function which is made
155
+ available to an ` extern ` block, the declaration in the ` extern ` block must also have the attribute,
156
+ otherwise undefined behavior results.
157
+
158
+ ### Behavior
159
+
160
+ Applying the attribute to a function ` f ` allows code within ` f ` to get a hint of the [ ` Location ` ] of
161
+ the "topmost" tracked call that led to ` f ` 's invocation. At the point of observation, an
162
+ implementation behaves as if it walks up the stack from ` f ` 's frame to find the nearest frame of an
163
+ * unattributed* function ` outer ` , and it returns the [ ` Location ` ] of the tracked call in ` outer ` .
164
+
165
+ > Note: ` core ` provides [ ` core::panic::Location::caller ` ] for observing caller locations. It wraps
166
+ > the [ ` core::intrinsics::caller_location ` ] intrinsic implemented by ` rustc ` .
167
+
168
+ > Note: because the resulting ` Location ` is a hint, an implementation may halt its walk up the stack
169
+ > early. See [ Limitations] ( #limitations ) for important caveats.
170
+
171
+ #### Examples
172
+
173
+ If ` f ` is called directly by ` outer ` , code in ` f ` observes its callsite within ` outer ` .
174
+
175
+ If ` f ` is called by another attributed function ` g ` which is in turn called by ` outer ` , code in both
176
+ ` f ` and ` g ` observes ` g ` 's callsite within ` outer ` .
177
+
178
+ If ` g ` is called by another attributed function ` h ` which is in turn called by ` outer ` , all code in
179
+ ` f ` , ` g ` , and ` h ` observes ` h ` 's callsite within ` outer ` , and so on.
180
+
181
+ ### Limitations
182
+
183
+ This information is a hint and implementations are not required to preserve it.
184
+
185
+ In particular, coercing a function with ` #[track_caller] ` to a function pointer creates a shim which
186
+ appears to observers to have been called at the attributed function's definition site, losing actual
187
+ caller information across virtual calls. A common example of this coercion is the creation of a
188
+ trait object whose methods are attributed.
189
+
190
+ > Note: The aforementioned shim for function pointers is necessary because ` rustc ` implements
191
+ > ` track_caller ` in a codegen context by appending an implicit parameter to the function ABI, but
192
+ > this would be unsound for an indirect call because the parameter is not a part of the function's
193
+ > type and a given function pointer type may or may not refer to a function with the attribute. The
194
+ > creation of a shim hides the implicit parameter from callers of the function pointer, preserving
195
+ > soundness.
196
+
146
197
[ _MetaListNameValueStr_ ] : ../attributes.md#meta-item-attribute-syntax
147
198
[ `-C target-cpu` ] : ../../rustc/codegen-options/index.html#target-cpu
148
199
[ `-C target-feature` ] : ../../rustc/codegen-options/index.html#target-feature
@@ -155,3 +206,7 @@ feature detection on the x86 platforms.
155
206
[ trait ] : ../items/traits.md
156
207
[ undefined behavior ] : ../behavior-considered-undefined.md
157
208
[ unsafe function ] : ../unsafe-functions.md
209
+ [ rust-abi ] : ../items/external-blocks.md#abi
210
+ [ `core::intrinsics::caller_location` ] : ../../core/intrinsics/fn.caller_location.html
211
+ [ `core::panic::Location::caller` ] : ../../core/panic/struct.Location.html#method.caller
212
+ [ `Location` ] : ../../core/panic/struct.Location.html
0 commit comments