From bed856154344a9421dc8d808597277975069216d Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Wed, 28 Jan 2026 10:01:30 +0100 Subject: [PATCH 1/2] SPMI: Fix aligned allocation size computation --- src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp index 999af5e2b1f515..5952ae180adbc6 100644 --- a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp @@ -1594,7 +1594,7 @@ void MyICJI::allocMem(AllocMemArgs* pArgs) { hotCodeSize = chunk.size; unsigned codeAlignment = std::max((uint32_t)sizeof(void*), chunk.alignment); - size_t hotCodeSizeAligned = ALIGN_UP_SPMI(chunk.size, codeAlignment); + size_t hotCodeSizeAligned = chunk.size + codeAlignment; hotCodeBlock = (uint8_t*)jitInstance->mc->cr->allocateMemory(hotCodeSizeAligned); hotCodeBlock = (uint8_t*)ALIGN_UP_SPMI(hotCodeBlock, codeAlignment); chunk.block = hotCodeBlock; @@ -1617,7 +1617,7 @@ void MyICJI::allocMem(AllocMemArgs* pArgs) if (roDataSize > 0) { - size_t roDataSizeAligned = ALIGN_UP_SPMI(roDataSize, roDataAlignment); + size_t roDataSizeAligned = roDataSize + roDataAlignment; roDataBlock = (uint8_t*)jitInstance->mc->cr->allocateMemory(roDataSizeAligned); roDataBlock = (uint8_t*)ALIGN_UP_SPMI(roDataBlock, roDataAlignment); size_t offset = 0; From d819b34860fdea55bd785e3ea6dc73ced4feeb4d Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Wed, 28 Jan 2026 10:22:33 +0100 Subject: [PATCH 2/2] Copilot feedback --- src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp index 5952ae180adbc6..0fc4837fadb62a 100644 --- a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp @@ -1594,8 +1594,8 @@ void MyICJI::allocMem(AllocMemArgs* pArgs) { hotCodeSize = chunk.size; unsigned codeAlignment = std::max((uint32_t)sizeof(void*), chunk.alignment); - size_t hotCodeSizeAligned = chunk.size + codeAlignment; - hotCodeBlock = (uint8_t*)jitInstance->mc->cr->allocateMemory(hotCodeSizeAligned); + size_t hotCodeSizePadded = chunk.size + codeAlignment - 1; + hotCodeBlock = (uint8_t*)jitInstance->mc->cr->allocateMemory(hotCodeSizePadded); hotCodeBlock = (uint8_t*)ALIGN_UP_SPMI(hotCodeBlock, codeAlignment); chunk.block = hotCodeBlock; chunk.blockRW = chunk.block; @@ -1617,8 +1617,8 @@ void MyICJI::allocMem(AllocMemArgs* pArgs) if (roDataSize > 0) { - size_t roDataSizeAligned = roDataSize + roDataAlignment; - roDataBlock = (uint8_t*)jitInstance->mc->cr->allocateMemory(roDataSizeAligned); + size_t roDataSizePadded = roDataSize + roDataAlignment - 1; + roDataBlock = (uint8_t*)jitInstance->mc->cr->allocateMemory(roDataSizePadded); roDataBlock = (uint8_t*)ALIGN_UP_SPMI(roDataBlock, roDataAlignment); size_t offset = 0; // Zero the block to ensure all the padding we allocated is zeroed for the later comparisons