blob: b04951c590cecc0ce04ddec74d6fbd3b66c8c3da [file]
//-------------------------------------------------------------------------------------------------------
// 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(); \
}