summaryrefslogtreecommitdiff
path: root/src/vm/stublink.inl
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/stublink.inl')
-rw-r--r--src/vm/stublink.inl116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/vm/stublink.inl b/src/vm/stublink.inl
new file mode 100644
index 0000000000..73bd5e8ac6
--- /dev/null
+++ b/src/vm/stublink.inl
@@ -0,0 +1,116 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// StubLink.inl
+//
+// Defines inline functions for StubLinker
+//
+
+
+#ifndef __STUBLINK_INL__
+#define __STUBLINK_INL__
+
+#include "stublink.h"
+#include "eeconfig.h"
+#include "safemath.h"
+
+
+#ifdef STUBLINKER_GENERATES_UNWIND_INFO
+
+inline //static
+SIZE_T StubUnwindInfoHeader::ComputeSize(UINT nUnwindInfoSize)
+{
+ LIMITED_METHOD_CONTRACT;
+
+ return ALIGN_UP( FIELD_OFFSET(StubUnwindInfoHeader, FunctionEntry)
+ + nUnwindInfoSize
+ + sizeof(StubUnwindInfoHeaderSuffix)
+ , sizeof(void*));
+}
+
+
+#ifndef DACCESS_COMPILE
+
+inline
+void StubUnwindInfoHeader::Init ()
+{
+ LIMITED_METHOD_CONTRACT;
+
+ pNext = (StubUnwindInfoHeader*)(SIZE_T)1;
+}
+
+
+inline
+bool StubUnwindInfoHeader::IsRegistered ()
+{
+ LIMITED_METHOD_CONTRACT;
+
+ return pNext != (StubUnwindInfoHeader*)(SIZE_T)1;
+}
+
+#endif // #ifndef DACCESS_COMPILE
+
+#endif // STUBLINKER_GENERATES_UNWIND_INFO
+
+
+inline
+void StubLinker::Push(UINT size)
+{
+ LIMITED_METHOD_CONTRACT;
+
+ ClrSafeInt<SHORT> stackSize(m_stackSize);
+ _ASSERTE(FitsIn<SHORT>(size));
+ SHORT sSize = static_cast<SHORT>(size);
+ stackSize += sSize;
+ _ASSERTE(!stackSize.IsOverflow());
+ m_stackSize = stackSize.Value();
+ UnwindAllocStack(sSize);
+}
+
+
+inline
+void StubLinker::Pop(UINT size)
+{
+ LIMITED_METHOD_CONTRACT;
+
+ ClrSafeInt<SHORT> stackSize(m_stackSize);
+ _ASSERTE(FitsIn<SHORT>(size));
+ stackSize = stackSize - ClrSafeInt<SHORT>(size);
+ _ASSERTE(!stackSize.IsOverflow());
+ m_stackSize = stackSize.Value();
+}
+
+
+inline
+VOID StubLinker::EmitUnwindInfoCheck()
+{
+#if defined(_DEBUG) && defined(STUBLINKER_GENERATES_UNWIND_INFO) && !defined(CROSSGEN_COMPILE)
+ if (g_pConfig->IsStubLinkerUnwindInfoVerificationOn())
+ {
+ if (!m_pUnwindInfoCheckLabel)
+ m_pUnwindInfoCheckLabel = NewCodeLabel();
+ EmitUnwindInfoCheckWorker(m_pUnwindInfoCheckLabel);
+ }
+#endif
+}
+
+
+#ifndef STUBLINKER_GENERATES_UNWIND_INFO
+
+inline VOID StubLinker::UnwindSavedReg (UCHAR reg, ULONG SPRelativeOffset) {LIMITED_METHOD_CONTRACT;}
+inline VOID StubLinker::UnwindAllocStack (SHORT FrameSizeIncrement) {LIMITED_METHOD_CONTRACT;}
+inline VOID StubLinker::UnwindSetFramePointer (UCHAR reg) {LIMITED_METHOD_CONTRACT;}
+
+inline VOID StubLinker::UnwindPushedReg (UCHAR reg)
+{
+ LIMITED_METHOD_CONTRACT;
+
+ m_stackSize += sizeof(void*);
+}
+
+#endif // !STUBLINKER_GENERATES_UNWIND_INFO
+
+
+#endif // !__STUBLINK_INL__
+