Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/coreclr/jit/codegencommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6831,7 +6831,7 @@ void CodeGen::genReportAsyncDebugInfo()
uint32_t diagNativeOffset = 0;
if (genAsyncResumeInfoTable != nullptr)
{
emitLocation& emitLoc = ((emitLocation*)genAsyncResumeInfoTable->dsCont)[i];
emitLocation& emitLoc = genAsyncResumeInfoTable->Locations()[i];
if (emitLoc.Valid())
{
diagNativeOffset = emitLoc.CodeOffset(GetEmitter());
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/codegenlinear.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -961,7 +961,7 @@ void CodeGen::genRecordAsyncResume(GenTreeVal* asyncResume)
emitter::dataSection* asyncResumeInfo;
genEmitAsyncResumeInfoTable(&asyncResumeInfo);

((emitLocation*)asyncResumeInfo->dsCont)[index] = emitLocation(GetEmitter());
asyncResumeInfo->Locations()[index] = emitLocation(GetEmitter());
}

/*
Expand Down
67 changes: 34 additions & 33 deletions src/coreclr/jit/emit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7811,14 +7811,14 @@ UNATIVE_OFFSET emitter::emitDataGenBeg(unsigned size, unsigned alignment, var_ty

/* Allocate a data section descriptor and add it to the list */

dataSection* secDesc = emitDataSecCur = (dataSection*)emitGetMem(roundUp(sizeof(*secDesc) + size));
dataSection* secDesc = emitDataSecCur = (dataSection*)emitGetMem(sizeof(*secDesc));
secDesc->dsType = dataSection::data;
secDesc->Data() = (BYTE*)emitGetMem(size);

secDesc->dsSize = size;

secDesc->dsAlignment = alignment;

secDesc->dsType = dataSection::data;

secDesc->dsDataType = dataType;

secDesc->dsNext = nullptr;
Expand Down Expand Up @@ -7864,14 +7864,14 @@ UNATIVE_OFFSET emitter::emitBBTableDataGenBeg(unsigned numEntries, bool relative

/* Allocate a data section descriptor and add it to the list */

secDesc = emitDataSecCur = (dataSection*)emitGetMem(roundUp(sizeof(*secDesc) + numEntries * sizeof(BasicBlock*)));
secDesc = emitDataSecCur = (dataSection*)emitGetMem(sizeof(*secDesc));
secDesc->dsType = relativeAddr ? dataSection::blockRelative32 : dataSection::blockAbsoluteAddr;
secDesc->Blocks() = (BasicBlock**)emitGetMem(numEntries * sizeof(BasicBlock*));

secDesc->dsSize = emittedSize;

secDesc->dsAlignment = elemSize;

secDesc->dsType = relativeAddr ? dataSection::blockRelative32 : dataSection::blockAbsoluteAddr;

secDesc->dsDataType = TYP_UNKNOWN;

secDesc->dsNext = nullptr;
Expand Down Expand Up @@ -7905,14 +7905,15 @@ void emitter::emitAsyncResumeTable(unsigned numEntries, UNATIVE_OFFSET* dataSecO
unsigned emittedSize = sizeof(CORINFO_AsyncResumeInfo) * numEntries;
emitConsDsc.dsdOffs += emittedSize;

dataSection* secDesc = (dataSection*)emitGetMem(roundUp(sizeof(dataSection) + numEntries * sizeof(emitLocation)));
dataSection* secDesc = (dataSection*)emitGetMem(sizeof(dataSection));
secDesc->dsType = dataSection::asyncResumeInfo;
secDesc->Locations() = (emitLocation*)emitGetMem(numEntries * sizeof(emitLocation));

for (unsigned i = 0; i < numEntries; i++)
new (secDesc->dsCont + i * sizeof(emitLocation), jitstd::placement_t()) emitLocation();
new (&secDesc->Locations()[i], jitstd::placement_t()) emitLocation();

secDesc->dsSize = emittedSize;
secDesc->dsAlignment = TARGET_POINTER_SIZE;
secDesc->dsType = dataSection::asyncResumeInfo;
secDesc->dsDataType = TYP_UNKNOWN;
secDesc->dsNext = nullptr;

Expand Down Expand Up @@ -7949,7 +7950,7 @@ void emitter::emitDataGenData(unsigned offs, const void* data, UNATIVE_OFFSET si

assert(emitDataSecCur->dsType == dataSection::data);

memcpy(emitDataSecCur->dsCont + offs, data, size);
memcpy(emitDataSecCur->Data() + offs, data, size);
}

/*****************************************************************************
Expand All @@ -7967,7 +7968,7 @@ void emitter::emitDataGenData(unsigned index, BasicBlock* label)

assert(emitDataSecCur->dsSize >= emittedElemSize * (index + 1));

((BasicBlock**)(emitDataSecCur->dsCont))[index] = label;
emitDataSecCur->Blocks()[index] = label;
}

/*****************************************************************************
Expand Down Expand Up @@ -8011,7 +8012,7 @@ UNATIVE_OFFSET emitter::emitDataGenFind(const void* cnsAddr, unsigned cnsSize, u
//
if ((secDesc->dsType == dataSection::data) && (secDesc->dsSize >= cnsSize) && ((curOffs % alignment) == 0))
{
if (memcmp(cnsAddr, secDesc->dsCont, cnsSize) == 0)
if (memcmp(cnsAddr, secDesc->Data(), cnsSize) == 0)
{
cnum = curOffs;

Expand Down Expand Up @@ -8393,7 +8394,7 @@ void emitter::emitOutputDataSec(dataSecDsc* sec, AllocMemChunk* chunks)
target_size_t* bDstRW = (target_size_t*)dstRW;
for (unsigned i = 0; i < numElems; i++)
{
BasicBlock* block = ((BasicBlock**)dsc->dsCont)[i];
BasicBlock* block = dsc->Blocks()[i];

// Convert the BasicBlock* value to an IG address
insGroup* lab = (insGroup*)emitCodeGetCookie(block);
Expand Down Expand Up @@ -8424,7 +8425,7 @@ void emitter::emitOutputDataSec(dataSecDsc* sec, AllocMemChunk* chunks)

for (unsigned i = 0; i < numElems; i++)
{
BasicBlock* block = ((BasicBlock**)dsc->dsCont)[i];
BasicBlock* block = dsc->Blocks()[i];

// Convert the BasicBlock* value to an IG address
insGroup* lab = (insGroup*)emitCodeGetCookie(block);
Expand All @@ -8444,7 +8445,7 @@ void emitter::emitOutputDataSec(dataSecDsc* sec, AllocMemChunk* chunks)
CORINFO_AsyncResumeInfo* aDstRW = (CORINFO_AsyncResumeInfo*)dstRW;
for (size_t i = 0; i < numElems; i++)
{
emitLocation* emitLoc = &((emitLocation*)dsc->dsCont)[i];
emitLocation* emitLoc = &dsc->Locations()[i];

// Async call may have been removed very late, after we have introduced suspension/resumption.
// In those cases just encode null.
Expand All @@ -8468,7 +8469,7 @@ void emitter::emitOutputDataSec(dataSecDsc* sec, AllocMemChunk* chunks)
// Simple binary data: copy the bytes to the target
assert(dsc->dsType == dataSection::data);

memcpy(dstRW, dsc->dsCont, dscSize);
memcpy(dstRW, dsc->Data(), dscSize);

#ifdef DEBUG
if (EMITVERBOSE)
Expand All @@ -8477,7 +8478,7 @@ void emitter::emitOutputDataSec(dataSecDsc* sec, AllocMemChunk* chunks)

for (size_t i = 0; i < dscSize; i++)
{
printf("%02x ", dsc->dsCont[i]);
printf("%02x ", dsc->Data()[i]);
if ((((i + 1) % 16) == 0) && (i + 1 != dscSize))
{
printf("\n\t\t\t\t\t");
Expand All @@ -8487,10 +8488,10 @@ void emitter::emitOutputDataSec(dataSecDsc* sec, AllocMemChunk* chunks)
{
case TYP_FLOAT:
printf(" ; float %9.6g",
FloatingPointUtils::convertToDouble(*reinterpret_cast<float*>(&dsc->dsCont)));
FloatingPointUtils::convertToDouble(*reinterpret_cast<float*>(dsc->Data())));
break;
case TYP_DOUBLE:
printf(" ; double %12.9g", *reinterpret_cast<double*>(&dsc->dsCont));
printf(" ; double %12.9g", *reinterpret_cast<double*>(dsc->Data()));
break;
default:
break;
Expand Down Expand Up @@ -8551,7 +8552,7 @@ void emitter::emitDispDataSec(dataSecDsc* section, AllocMemChunk* dataChunks)
printf(labelFormat, "");
}

BasicBlock* block = reinterpret_cast<BasicBlock**>(data->dsCont)[i];
BasicBlock* block = data->Blocks()[i];
insGroup* ig = static_cast<insGroup*>(emitCodeGetCookie(block));

const char* blockLabel = emitLabelString(ig);
Expand Down Expand Up @@ -8617,7 +8618,7 @@ void emitter::emitDispDataSec(dataSecDsc* section, AllocMemChunk* dataChunks)
printf(labelFormat, label);
}

emitLocation* emitLoc = &((emitLocation*)data->dsCont)[i];
emitLocation* emitLoc = &data->Locations()[i];

printf("\tdq\t%s\n", resumeStubName);

Expand Down Expand Up @@ -8668,9 +8669,9 @@ void emitter::emitDispDataSec(dataSecDsc* section, AllocMemChunk* dataChunks)
{
printf("\t<Unexpected data size %d (expected >= 4)\n", data->dsSize);
}
printf("\tdd\t%08llXh\t", (UINT64) * reinterpret_cast<uint32_t*>(&data->dsCont[i]));
printf("\tdd\t%08llXh\t", (UINT64) * reinterpret_cast<uint32_t*>(&data->Data()[i]));
printf("\t; %9.6g",
FloatingPointUtils::convertToDouble(*reinterpret_cast<float*>(&data->dsCont[i])));
FloatingPointUtils::convertToDouble(*reinterpret_cast<float*>(&data->Data()[i])));
i += 4;
break;

Expand All @@ -8679,21 +8680,21 @@ void emitter::emitDispDataSec(dataSecDsc* section, AllocMemChunk* dataChunks)
{
printf("\t<Unexpected data size %d (expected >= 8)\n", data->dsSize);
}
printf("\tdq\t%016llXh", *reinterpret_cast<uint64_t*>(&data->dsCont[i]));
printf("\t; %12.9g", *reinterpret_cast<double*>(&data->dsCont[i]));
printf("\tdq\t%016llXh", *reinterpret_cast<uint64_t*>(&data->Data()[i]));
printf("\t; %12.9g", *reinterpret_cast<double*>(&data->Data()[i]));
i += 8;
break;

default:
switch (elemSize)
{
case 1:
printf("\tdb\t%02Xh", *reinterpret_cast<uint8_t*>(&data->dsCont[i]));
printf("\tdb\t%02Xh", *reinterpret_cast<uint8_t*>(&data->Data()[i]));
for (j = 1; j < 16; j++)
{
if (i + j >= data->dsSize)
break;
printf(", %02Xh", *reinterpret_cast<uint8_t*>(&data->dsCont[i + j]));
printf(", %02Xh", *reinterpret_cast<uint8_t*>(&data->Data()[i + j]));
}
i += j;
break;
Expand All @@ -8703,12 +8704,12 @@ void emitter::emitDispDataSec(dataSecDsc* section, AllocMemChunk* dataChunks)
{
printf("\t<Unexpected data size %d (expected size%%2 == 0)\n", data->dsSize);
}
printf("\tdw\t%04Xh", *reinterpret_cast<uint16_t*>(&data->dsCont[i]));
printf("\tdw\t%04Xh", *reinterpret_cast<uint16_t*>(&data->Data()[i]));
for (j = 2; j < 24; j += 2)
{
if (i + j >= data->dsSize)
break;
printf(", %04Xh", *reinterpret_cast<uint16_t*>(&data->dsCont[i + j]));
printf(", %04Xh", *reinterpret_cast<uint16_t*>(&data->Data()[i + j]));
}
i += j;
break;
Expand All @@ -8719,12 +8720,12 @@ void emitter::emitDispDataSec(dataSecDsc* section, AllocMemChunk* dataChunks)
{
printf("\t<Unexpected data size %d (expected size%%4 == 0)\n", data->dsSize);
}
printf("\tdd\t%08Xh", *reinterpret_cast<uint32_t*>(&data->dsCont[i]));
printf("\tdd\t%08Xh", *reinterpret_cast<uint32_t*>(&data->Data()[i]));
for (j = 4; j < 24; j += 4)
{
if (i + j >= data->dsSize)
break;
printf(", %08Xh", *reinterpret_cast<uint32_t*>(&data->dsCont[i + j]));
printf(", %08Xh", *reinterpret_cast<uint32_t*>(&data->Data()[i + j]));
}
i += j;
break;
Expand All @@ -8737,12 +8738,12 @@ void emitter::emitDispDataSec(dataSecDsc* section, AllocMemChunk* dataChunks)
{
printf("\t<Unexpected data size %d (expected size%%8 == 0)\n", data->dsSize);
}
printf("\tdq\t%016llXh", *reinterpret_cast<uint64_t*>(&data->dsCont[i]));
printf("\tdq\t%016llXh", *reinterpret_cast<uint64_t*>(&data->Data()[i]));
for (j = 8; j < 64; j += 8)
{
if (i + j >= data->dsSize)
break;
printf(", %016llXh", *reinterpret_cast<uint64_t*>(&data->dsCont[i + j]));
printf(", %016llXh", *reinterpret_cast<uint64_t*>(&data->Data()[i + j]));
}
i += j;
break;
Expand Down
30 changes: 26 additions & 4 deletions src/coreclr/jit/emit.h
Original file line number Diff line number Diff line change
Expand Up @@ -3555,10 +3555,32 @@ class emitter
sectionType dsType;
var_types dsDataType;

// variable-sized array used to store the constant data, BasicBlock*
// array in the block cases, or emitLocation for the asyncResumeInfo
// case.
BYTE dsCont[0];
private:
union
{
BYTE* dsData; // for data blobs
BasicBlock** dsBlocks; // for block-based sections
emitLocation* dsLocations; // for async resume info
};

public:
BYTE*& Data()
{
assert(dsType == sectionType::data);
return dsData;
}

BasicBlock**& Blocks()
{
assert((dsType == sectionType::blockAbsoluteAddr) || (dsType == sectionType::blockRelative32));
return dsBlocks;
}

emitLocation*& Locations()
{
assert(dsType == sectionType::asyncResumeInfo);
return dsLocations;
}
};

/* These describe the entire initialized/uninitialized data sections */
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/emitarm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7326,7 +7326,7 @@ void emitter::emitDispInsHelp(
if (jdsc != nullptr && id->idIns() == INS_movt)
{
unsigned cnt = jdsc->dsSize / TARGET_POINTER_SIZE;
BasicBlock** bbp = (BasicBlock**)jdsc->dsCont;
BasicBlock** bbp = jdsc->Blocks();

bool isBound = (emitCodeGetCookie(*bbp) != nullptr);

Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/emitxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12347,7 +12347,7 @@ void emitter::emitDispAddrMode(instrDesc* id, bool noDetail) const
if (jdsc && !noDetail)
{
unsigned cnt = (jdsc->dsSize - 1) / TARGET_POINTER_SIZE;
BasicBlock** bbp = (BasicBlock**)jdsc->dsCont;
BasicBlock** bbp = jdsc->Blocks();

#ifdef TARGET_AMD64
#define SIZE_LETTER "Q"
Expand Down
Loading