| //------------------------------------------------------------------------------------------------------- |
| // 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(); \ |
| } |
| |
| |