diff options
Diffstat (limited to 'packaging/0022-Remove-relocations-for-InterfaceInfo_t-m_pMethodTabl.patch')
-rw-r--r-- | packaging/0022-Remove-relocations-for-InterfaceInfo_t-m_pMethodTabl.patch | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/packaging/0022-Remove-relocations-for-InterfaceInfo_t-m_pMethodTabl.patch b/packaging/0022-Remove-relocations-for-InterfaceInfo_t-m_pMethodTabl.patch new file mode 100644 index 0000000000..3f39a249f0 --- /dev/null +++ b/packaging/0022-Remove-relocations-for-InterfaceInfo_t-m_pMethodTabl.patch @@ -0,0 +1,138 @@ +From 53ec75f90fc77f7d03309a6aaeae182d875148d4 Mon Sep 17 00:00:00 2001 +From: Gleb Balykov <g.balykov@samsung.com> +Date: Thu, 22 Jun 2017 20:24:54 +0300 +Subject: [PATCH 22/32] Remove relocations for InterfaceInfo_t::m_pMethodTable + for Linux ARM + +--- + src/vm/array.cpp | 7 +++++-- + src/vm/methodtable.cpp | 33 +++++++++++++++++++++++++++------ + src/vm/methodtable.h | 23 +++++++++++++++++++---- + 3 files changed, 51 insertions(+), 12 deletions(-) + +diff --git a/src/vm/array.cpp b/src/vm/array.cpp +index d679294..3f5a8aa 100644 +--- a/src/vm/array.cpp ++++ b/src/vm/array.cpp +@@ -509,8 +509,11 @@ MethodTable* Module::CreateArrayMethodTable(TypeHandle elemTypeHnd, CorElementTy + #endif // !defined(_WIN64) && (DATA_ALIGNMENT > 4) + pMT->SetBaseSize(baseSize); + // Because of array method table persisting, we need to copy the map +- memcpy(pMTHead + imapOffset, pParentClass->GetInterfaceMap(), +- pParentClass->GetNumInterfaces() * sizeof(InterfaceInfo_t)); ++ for (unsigned index = 0; index < pParentClass->GetNumInterfaces(); ++index) ++ { ++ InterfaceInfo_t *pIntInfo = (InterfaceInfo_t *) (pMTHead + imapOffset + index * sizeof(InterfaceInfo_t)); ++ pIntInfo->SetMethodTable((pParentClass->GetInterfaceMap() + index)->GetMethodTable()); ++ } + pMT->SetInterfaceMap(pParentClass->GetNumInterfaces(), (InterfaceInfo_t *)(pMTHead + imapOffset)); + + // Copy down flags for these interfaces as well. This is simplified a bit since we know that System.Array +diff --git a/src/vm/methodtable.cpp b/src/vm/methodtable.cpp +index e219bb7..b849746 100644 +--- a/src/vm/methodtable.cpp ++++ b/src/vm/methodtable.cpp +@@ -1237,7 +1237,12 @@ void MethodTable::AddDynamicInterface(MethodTable *pItfMT) + if (TotalNumInterfaces > 0) { + InterfaceInfo_t *pInterfaceMap = GetInterfaceMap(); + PREFIX_ASSUME(pInterfaceMap != NULL); +- memcpy(pNewItfMap, pInterfaceMap, TotalNumInterfaces * sizeof(InterfaceInfo_t)); ++ ++ for (unsigned index = 0; index < TotalNumInterfaces; ++index) ++ { ++ InterfaceInfo_t *pIntInfo = (InterfaceInfo_t *) (pNewItfMap + index); ++ pIntInfo->SetMethodTable((pInterfaceMap + index)->GetMethodTable()); ++ } + } + + // Add the new interface at the end of the map. +@@ -4285,16 +4290,32 @@ void MethodTable::Save(DataImage *image, DWORD profilingFlags) + // Dynamic interface maps have an additional DWORD_PTR preceding the InterfaceInfo_t array + if (HasDynamicInterfaceMap()) + { +- ZapStoredStructure * pInterfaceMapNode = image->StoreInternedStructure(((DWORD_PTR *)GetInterfaceMap()) - 1, +- GetInterfaceMapSize(), +- DataImage::ITEM_INTERFACE_MAP); +- ++ ZapStoredStructure * pInterfaceMapNode; ++ if (decltype(InterfaceInfo_t::m_pMethodTable)::isRelative) ++ { ++ pInterfaceMapNode = image->StoreStructure(((DWORD_PTR *)GetInterfaceMap()) - 1, ++ GetInterfaceMapSize(), ++ DataImage::ITEM_INTERFACE_MAP); ++ } ++ else ++ { ++ pInterfaceMapNode = image->StoreInternedStructure(((DWORD_PTR *)GetInterfaceMap()) - 1, ++ GetInterfaceMapSize(), ++ DataImage::ITEM_INTERFACE_MAP); ++ } + image->BindPointer(GetInterfaceMap(), pInterfaceMapNode, sizeof(DWORD_PTR)); + } + else + #endif // FEATURE_COMINTEROP + { +- image->StoreInternedStructure(GetInterfaceMap(), GetInterfaceMapSize(), DataImage::ITEM_INTERFACE_MAP); ++ if (decltype(InterfaceInfo_t::m_pMethodTable)::isRelative) ++ { ++ image->StoreStructure(GetInterfaceMap(), GetInterfaceMapSize(), DataImage::ITEM_INTERFACE_MAP); ++ } ++ else ++ { ++ image->StoreInternedStructure(GetInterfaceMap(), GetInterfaceMapSize(), DataImage::ITEM_INTERFACE_MAP); ++ } + } + + SaveExtraInterfaceInfo(image); +diff --git a/src/vm/methodtable.h b/src/vm/methodtable.h +index f8b34ae..ef0cb44 100644 +--- a/src/vm/methodtable.h ++++ b/src/vm/methodtable.h +@@ -111,25 +111,40 @@ struct InterfaceInfo_t + friend class NativeImageDumper; + #endif + +- FixupPointer<PTR_MethodTable> m_pMethodTable; // Method table of the interface ++ // Method table of the interface ++#if defined(PLATFORM_UNIX) && defined(_TARGET_ARM_) ++ RelativeFixupPointer<PTR_MethodTable> m_pMethodTable; ++#else ++ FixupPointer<PTR_MethodTable> m_pMethodTable; ++#endif + + public: + FORCEINLINE PTR_MethodTable GetMethodTable() + { + LIMITED_METHOD_CONTRACT; +- return m_pMethodTable.GetValue(); ++ return ReadPointerMaybeNull(this, &InterfaceInfo_t::m_pMethodTable); + } + + #ifndef DACCESS_COMPILE + void SetMethodTable(MethodTable * pMT) + { + LIMITED_METHOD_CONTRACT; +- m_pMethodTable.SetValue(pMT); ++ m_pMethodTable.SetValueMaybeNull(pMT); + } + + // Get approximate method table. This is used by the type loader before the type is fully loaded. + PTR_MethodTable GetApproxMethodTable(Module * pContainingModule); +-#endif ++#endif // !DACCESS_COMPILE ++ ++#ifndef DACCESS_COMPILE ++ InterfaceInfo_t(InterfaceInfo_t &right) ++ { ++ m_pMethodTable.SetValueMaybeNull(right.m_pMethodTable.GetValueMaybeNull()); ++ } ++#else // !DACCESS_COMPILE ++private: ++ InterfaceInfo_t(InterfaceInfo_t &right); ++#endif // !DACCESS_COMPILE + }; // struct InterfaceInfo_t + + typedef DPTR(InterfaceInfo_t) PTR_InterfaceInfo; +-- +2.7.4 + |