@@ -1129,63 +1129,117 @@ void Compiler::eeDispLineInfos()
11291129 * (e.g., host AMD64, target ARM64), then VM will get confused anyway.
11301130 */
11311131
1132- void Compiler::eeAllocMem (AllocMemArgs* args, const UNATIVE_OFFSET roDataSectionAlignment)
1132+ void Compiler::eeAllocMem (AllocMemChunk& codeChunk,
1133+ AllocMemChunk* coldCodeChunk,
1134+ AllocMemChunk* dataChunks,
1135+ unsigned numDataChunks,
1136+ unsigned numExceptions)
11331137{
1138+ ArrayStack<AllocMemChunk> chunks (getAllocator (CMK_Codegen));
1139+
1140+ chunks.Push (codeChunk);
1141+
1142+ int coldCodeChunkIndex = -1 ;
1143+ if (coldCodeChunk != nullptr )
1144+ {
1145+ coldCodeChunkIndex = chunks.Height ();
1146+ chunks.Push (*coldCodeChunk);
1147+ }
1148+
11341149#ifdef DEBUG
11351150
11361151 // Fake splitting implementation: place hot/cold code in contiguous section.
1137- UNATIVE_OFFSET coldCodeOffset = 0 ;
1138- if (JitConfig.JitFakeProcedureSplitting () && (args->coldCodeSize > 0 ))
1152+ if (JitConfig.JitFakeProcedureSplitting () && (coldCodeChunk != nullptr ))
11391153 {
1140- coldCodeOffset = args->hotCodeSize ;
1141- assert (coldCodeOffset > 0 );
1142- args->hotCodeSize += args->coldCodeSize ;
1143- args->coldCodeSize = 0 ;
1154+ // Keep offset into hot code in the block/blockRW pointers
1155+ coldCodeChunk->block = (uint8_t *)(uintptr_t )chunks.BottomRef (0 ).size ;
1156+ coldCodeChunk->blockRW = (uint8_t *)(uintptr_t )chunks.BottomRef (0 ).size ;
1157+ chunks.BottomRef (0 ).size += coldCodeChunk->size ;
1158+ // Remove cold chunk
1159+ chunks.Pop ();
1160+ coldCodeChunkIndex = -1 ;
11441161 }
11451162
11461163#endif // DEBUG
11471164
1165+ int firstDataChunk = chunks.Height ();
1166+
11481167#if defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
11491168
11501169 // For arm64/LoongArch64/RISCV64, we want to allocate JIT data always adjacent to code similar to what native
11511170 // compiler does.
11521171 // This way allows us to use a single `ldr` to access such data like float constant/jmp table.
11531172 // For LoongArch64 using `pcaddi + ld` to access such data.
11541173
1155- UNATIVE_OFFSET roDataAlignmentDelta = 0 ;
1156- if (args->roDataSize > 0 )
1174+ for (unsigned i = 0 ; i < numDataChunks; i++)
11571175 {
1158- roDataAlignmentDelta = AlignmentPad (args->hotCodeSize , roDataSectionAlignment);
1176+ // Increase size of the hot code chunk and store offset in data chunk
1177+ AllocMemChunk& codeChunk = chunks.BottomRef (0 );
1178+
1179+ codeChunk.size = AlignUp (codeChunk.size , dataChunks[i].alignment );
1180+ dataChunks[i].block = (uint8_t *)(uintptr_t )codeChunk.size ;
1181+ dataChunks[i].blockRW = (uint8_t *)(uintptr_t )codeChunk.size ;
1182+ codeChunk.size += dataChunks[i].size ;
1183+
1184+ codeChunk.alignment = max (codeChunk.alignment , dataChunks[i].alignment );
11591185 }
11601186
1161- const UNATIVE_OFFSET roDataOffset = args->hotCodeSize + roDataAlignmentDelta;
1162- args->hotCodeSize = roDataOffset + args->roDataSize ;
1163- args->roDataSize = 0 ;
1187+ #else
1188+
1189+ for (unsigned i = 0 ; i < numDataChunks; i++)
1190+ {
1191+ chunks.Push (dataChunks[i]);
1192+ }
11641193
11651194#endif // defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
11661195
1167- info.compCompHnd ->allocMem (args);
1196+ AllocMemArgs args;
1197+ args.chunks = chunks.Data ();
1198+ args.chunksCount = (unsigned )chunks.Height ();
1199+ args.xcptnsCount = numExceptions;
1200+
1201+ info.compCompHnd ->allocMem (&args);
1202+
1203+ codeChunk.block = chunks.BottomRef (0 ).block ;
1204+ codeChunk.blockRW = chunks.BottomRef (0 ).blockRW ;
1205+
1206+ if (coldCodeChunkIndex != -1 )
1207+ {
1208+ coldCodeChunk->block = chunks.BottomRef (coldCodeChunkIndex).block ;
1209+ coldCodeChunk->blockRW = chunks.BottomRef (coldCodeChunkIndex).blockRW ;
1210+ }
11681211
11691212#ifdef DEBUG
11701213
1171- if (JitConfig.JitFakeProcedureSplitting () && (coldCodeOffset > 0 ))
1214+ if (JitConfig.JitFakeProcedureSplitting () && (coldCodeChunk != nullptr ))
11721215 {
11731216 // Fix up cold code pointers. Cold section is adjacent to hot section.
1174- assert (args->coldCodeBlock == nullptr );
1175- assert (args->coldCodeBlockRW == nullptr );
1176- args->coldCodeBlock = ((BYTE*)args->hotCodeBlock ) + coldCodeOffset;
1177- args->coldCodeBlockRW = ((BYTE*)args->hotCodeBlockRW ) + coldCodeOffset;
1217+ assert (coldCodeChunk != nullptr );
1218+ coldCodeChunk->block = codeChunk.block + (uintptr_t )coldCodeChunk->block ;
1219+ coldCodeChunk->blockRW = codeChunk.blockRW + (uintptr_t )coldCodeChunk->blockRW ;
11781220 }
11791221
11801222#endif // DEBUG
11811223
1224+ int curDataChunk = firstDataChunk;
1225+
11821226#if defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
11831227
11841228 // Fix up data section pointers.
1185- assert (args->roDataBlock == nullptr );
1186- assert (args->roDataBlockRW == nullptr );
1187- args->roDataBlock = ((BYTE*)args->hotCodeBlock ) + roDataOffset;
1188- args->roDataBlockRW = ((BYTE*)args->hotCodeBlockRW ) + roDataOffset;
1229+ for (unsigned i = 0 ; i < numDataChunks; i++)
1230+ {
1231+ dataChunks[i].block = codeChunk.block + (size_t )dataChunks[i].block ;
1232+ dataChunks[i].blockRW = codeChunk.blockRW + (size_t )dataChunks[i].blockRW ;
1233+ }
1234+
1235+ #else
1236+
1237+ for (unsigned i = 0 ; i < numDataChunks; i++)
1238+ {
1239+ dataChunks[i].block = chunks.BottomRef (curDataChunk).block ;
1240+ dataChunks[i].blockRW = chunks.BottomRef (curDataChunk).blockRW ;
1241+ curDataChunk++;
1242+ }
11891243
11901244#endif // defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
11911245}
0 commit comments