summaryrefslogtreecommitdiff
path: root/src/vm/gchelpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/gchelpers.h')
-rw-r--r--src/vm/gchelpers.h123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/vm/gchelpers.h b/src/vm/gchelpers.h
new file mode 100644
index 0000000000..f5590beebe
--- /dev/null
+++ b/src/vm/gchelpers.h
@@ -0,0 +1,123 @@
+// 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.
+
+/*
+ * GCHELPERS.H
+ *
+ * GC Allocation and Write Barrier Helpers
+ *
+
+ *
+ */
+
+#ifndef _GCHELPERS_H_
+#define _GCHELPERS_H_
+
+//========================================================================
+//
+// ALLOCATION HELPERS
+//
+//========================================================================
+
+OBJECTREF AllocateValueSzArray(TypeHandle elementType, INT32 length);
+ // The main Array allocation routine, can do multi-dimensional
+OBJECTREF AllocateArrayEx(TypeHandle arrayClass, INT32 *pArgs, DWORD dwNumArgs, BOOL bAllocateInLargeHeap = FALSE
+ DEBUG_ARG(BOOL bDontSetAppDomain = FALSE));
+ // Optimized verion of above
+OBJECTREF FastAllocatePrimitiveArray(MethodTable* arrayType, DWORD cElements, BOOL bAllocateInLargeHeap = FALSE);
+
+
+#if defined(_TARGET_X86_)
+
+ // for x86, we generate efficient allocators for some special cases
+ // these are called via inline wrappers that call the generated allocators
+ // via function pointers.
+
+
+ // Create a SD array of primitive types
+typedef HCCALL2_PTR(Object*, FastPrimitiveArrayAllocatorFuncPtr, CorElementType type, DWORD cElements);
+
+extern FastPrimitiveArrayAllocatorFuncPtr fastPrimitiveArrayAllocator;
+
+ // The fast version always allocates in the normal heap
+OBJECTREF AllocatePrimitiveArray(CorElementType type, DWORD cElements);
+
+ // The slow version is distinguished via overloading by an additional parameter
+OBJECTREF AllocatePrimitiveArray(CorElementType type, DWORD cElements, BOOL bAllocateInLargeHeap);
+
+
+// Allocate SD array of object pointers. StubLinker-generated asm code might
+// implement this, so the element TypeHandle is passed as a PVOID to avoid any
+// struct calling convention weirdness.
+typedef HCCALL2_PTR(Object*, FastObjectArrayAllocatorFuncPtr, /*TypeHandle*/PVOID ArrayType, DWORD cElements);
+
+extern FastObjectArrayAllocatorFuncPtr fastObjectArrayAllocator;
+
+ // The fast version always allocates in the normal heap
+OBJECTREF AllocateObjectArray(DWORD cElements, TypeHandle ElementType);
+
+ // The slow version is distinguished via overloading by an additional parameter
+OBJECTREF AllocateObjectArray(DWORD cElements, TypeHandle ElementType, BOOL bAllocateInLargeHeap);
+
+
+ // Allocate string
+typedef HCCALL1_PTR(StringObject*, FastStringAllocatorFuncPtr, DWORD cchArrayLength);
+
+extern FastStringAllocatorFuncPtr fastStringAllocator;
+
+STRINGREF AllocateString( DWORD cchStringLength );
+
+ // The slow version, implemented in gcscan.cpp
+STRINGREF SlowAllocateString( DWORD cchStringLength );
+
+#else
+
+// On other platforms, go to the (somewhat less efficient) implementations in gcscan.cpp
+
+ // Create a SD array of primitive types
+OBJECTREF AllocatePrimitiveArray(CorElementType type, DWORD cElements, BOOL bAllocateInLargeHeap = FALSE);
+
+ // Allocate SD array of object pointers
+OBJECTREF AllocateObjectArray(DWORD cElements, TypeHandle ElementType, BOOL bAllocateInLargeHeap = FALSE);
+
+STRINGREF SlowAllocateString( DWORD cchStringLength );
+
+inline STRINGREF AllocateString( DWORD cchStringLength )
+{
+ WRAPPER_NO_CONTRACT;
+
+ return SlowAllocateString( cchStringLength );
+}
+
+#endif
+
+OBJECTREF DupArrayForCloning(BASEARRAYREF pRef, BOOL bAllocateInLargeHeap = FALSE);
+
+// The JIT requests the EE to specify an allocation helper to use at each new-site.
+// The EE makes this choice based on whether context boundaries may be involved,
+// whether the type is a COM object, whether it is a large object,
+// whether the object requires finalization.
+// These functions will throw OutOfMemoryException so don't need to check
+// for NULL return value from them.
+
+OBJECTREF AllocateObject(MethodTable *pMT
+#ifdef FEATURE_COMINTEROP
+ , bool fHandleCom = true
+#endif
+ );
+
+extern void StompWriteBarrierEphemeral(bool isRuntimeSuspended);
+extern void StompWriteBarrierResize(bool isRuntimeSuspended, bool bReqUpperBoundsCheck);
+
+extern void ThrowOutOfMemoryDimensionsExceeded();
+
+//========================================================================
+//
+// WRITE BARRIER HELPERS
+//
+//========================================================================
+
+void ErectWriteBarrier(OBJECTREF* dst, OBJECTREF ref);
+
+#endif // _GCHELPERS_H_