| 12345678910111213141516171819202122232425262728 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #pragma once
- // Only need to be used if the pointer is long live within the function and doesn't escape
- // NOTE: Currently, there is no way to tell the compiler a local variable need to be on the stack
- // and last for a certain life time. But if we take the address of the local and pass it to a non-LTCG
- // function the assignment won't be dead stored and the local will not be stack packed away.
- // IMPORTANT!!! LeavePinnedScope MUST be called at the end of the desired lifetime of a local
- // that you allocate using LEAVE_PINNED_SCOPE().
- void EnterPinnedScope(volatile void** var);
- void LeavePinnedScope();
- // These MACROs enforce scoping so LEAVE must be called for each instance of ENTER
- #define ENTER_PINNED_SCOPE(T, var) \
- T * var; \
- EnterPinnedScope((volatile void**)& ## var); \
- {
- #define LEAVE_PINNED_SCOPE() \
- LeavePinnedScope(); \
- }
|