mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
Expanded const aggregate compatibility
This commit is contained in:
parent
13b943855e
commit
f665388e91
17 changed files with 452 additions and 134 deletions
|
@ -978,7 +978,7 @@ CeOperand CeBuilder::GetOperand(BeValue* value, bool allowAlloca, bool allowImme
|
|||
BF_ASSERT(ptrType->mElementType->mTypeCode == BeTypeCode_SizedArray);
|
||||
auto arrayType = (BeSizedArrayType*)ptrType->mElementType;
|
||||
elementType = arrayType->mElementType;
|
||||
byteOffset = gepConstant->mIdx1 * elementType->mSize;
|
||||
byteOffset = gepConstant->mIdx1 * elementType->GetStride();
|
||||
}
|
||||
|
||||
auto elementPtrType = mCeMachine->GetBeContext()->GetPointerTo(elementType);
|
||||
|
@ -987,13 +987,7 @@ CeOperand CeBuilder::GetOperand(BeValue* value, bool allowAlloca, bool allowImme
|
|||
EmitFrameOffset(result);
|
||||
EmitFrameOffset(mcVal);
|
||||
Emit(&byteOffset, mPtrSize);
|
||||
|
||||
// result = AllocRelativeVirtualReg(elementPtrType, result, GetImmediate(byteOffset), 1);
|
||||
// // The def is primary to create a single 'master location' for the GEP vreg to become legalized before use
|
||||
// auto vregInfo = GetVRegInfo(result);
|
||||
// vregInfo->mDefOnFirstUse = true;
|
||||
// result.mKind = CeOperandKind_VReg;
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
break;
|
||||
|
@ -1843,9 +1837,12 @@ void CeBuilder::Build()
|
|||
if (castedInst->mRetValue != NULL)
|
||||
{
|
||||
auto mcVal = GetOperand(castedInst->mRetValue);
|
||||
BF_ASSERT(mReturnVal.mKind == CeOperandKind_AllocaAddr);
|
||||
EmitSizedOp(CeOp_Move_8, mcVal, NULL, true);
|
||||
Emit((int32)mReturnVal.mFrameOfs);
|
||||
if (mcVal.mType->mSize > 0)
|
||||
{
|
||||
BF_ASSERT(mReturnVal.mKind == CeOperandKind_AllocaAddr);
|
||||
EmitSizedOp(CeOp_Move_8, mcVal, NULL, true);
|
||||
Emit((int32)mReturnVal.mFrameOfs);
|
||||
}
|
||||
}
|
||||
|
||||
if (instType == BeRetInst::TypeId)
|
||||
|
@ -1974,7 +1971,7 @@ void CeBuilder::Build()
|
|||
Emit((CeOp)(CeOp_AddConst_I32));
|
||||
EmitFrameOffset(result);
|
||||
EmitFrameOffset(ceVal);
|
||||
Emit((int32)(ceIdx1.mImmediate * arrayType->mElementType->mSize));
|
||||
Emit((int32)(ceIdx1.mImmediate * arrayType->mElementType->GetStride()));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -2012,7 +2009,7 @@ void CeBuilder::Build()
|
|||
auto mcElementSize = FrameAlloc(mIntPtrType);
|
||||
Emit(CeOp_Const_32);
|
||||
EmitFrameOffset(mcElementSize);
|
||||
Emit((int32)arrayType->mElementType->mSize);
|
||||
Emit((int32)arrayType->mElementType->GetStride());
|
||||
|
||||
auto ofsValue = FrameAlloc(mIntPtrType);
|
||||
Emit(CeOp_Mul_I32);
|
||||
|
@ -2030,7 +2027,7 @@ void CeBuilder::Build()
|
|||
auto mcElementSize = FrameAlloc(mIntPtrType);
|
||||
Emit(CeOp_Const_64);
|
||||
EmitFrameOffset(mcElementSize);
|
||||
Emit((int64)arrayType->mElementType->mSize);
|
||||
Emit((int64)arrayType->mElementType->GetStride());
|
||||
|
||||
auto ofsValue = FrameAlloc(mIntPtrType);
|
||||
Emit(CeOp_Mul_I64);
|
||||
|
@ -2064,13 +2061,13 @@ void CeBuilder::Build()
|
|||
{
|
||||
auto arrayType = (BeSizedArrayType*)ptrType->mElementType;
|
||||
elementType = arrayType->mElementType;
|
||||
byteOffset = ceIdx1.mImmediate * elementType->mSize;
|
||||
byteOffset = ceIdx1.mImmediate * elementType->GetStride();
|
||||
}
|
||||
else if (ptrType->mElementType->mTypeCode == BeTypeCode_Vector)
|
||||
{
|
||||
auto arrayType = (BeVectorType*)ptrType->mElementType;
|
||||
elementType = arrayType->mElementType;
|
||||
byteOffset = ceIdx1.mImmediate * elementType->mSize;
|
||||
byteOffset = ceIdx1.mImmediate * elementType->GetStride();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2099,7 +2096,7 @@ void CeBuilder::Build()
|
|||
int relScale = 1;
|
||||
if (ceIdx0.IsImmediate())
|
||||
{
|
||||
int byteOffset = ceIdx0.mImmediate * ptrType->mElementType->mSize;
|
||||
int byteOffset = ceIdx0.mImmediate * ptrType->mElementType->GetStride();
|
||||
if (byteOffset != 0)
|
||||
{
|
||||
result = FrameAlloc(ptrType);
|
||||
|
@ -2117,7 +2114,7 @@ void CeBuilder::Build()
|
|||
auto mcElementSize = FrameAlloc(mIntPtrType);
|
||||
Emit(CeOp_Const_32);
|
||||
EmitFrameOffset(mcElementSize);
|
||||
Emit((int32)ptrType->mElementType->mSize);
|
||||
Emit((int32)ptrType->mElementType->GetStride());
|
||||
|
||||
auto ofsValue = FrameAlloc(mIntPtrType);
|
||||
Emit(CeOp_Mul_I32);
|
||||
|
@ -2135,7 +2132,7 @@ void CeBuilder::Build()
|
|||
auto mcElementSize = FrameAlloc(mIntPtrType);
|
||||
Emit(CeOp_Const_64);
|
||||
EmitFrameOffset(mcElementSize);
|
||||
Emit((int64)ptrType->mElementType->mSize);
|
||||
Emit((int64)ptrType->mElementType->GetStride());
|
||||
|
||||
auto ofsValue = FrameAlloc(mIntPtrType);
|
||||
Emit(CeOp_Mul_I64);
|
||||
|
@ -2232,7 +2229,7 @@ void CeBuilder::Build()
|
|||
{
|
||||
auto sizedArray = (BeSizedArrayType*)aggType;
|
||||
memberType = sizedArray->mElementType;
|
||||
byteOffset = BF_ALIGN(memberType->mSize, memberType->mAlign) * castedInst->mIdx;
|
||||
byteOffset = memberType->GetStride() * castedInst->mIdx;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -3348,6 +3345,7 @@ BfIRValue CeContext::CreateConstant(BfModule* module, uint8* ptr, BfType* bfType
|
|||
{
|
||||
auto ceModule = mCeMachine->mCeModule;
|
||||
BfIRBuilder* irBuilder = module->mBfIRBuilder;
|
||||
int32 ptrSize = module->mSystem->mPtrSize;
|
||||
|
||||
uint8* memStart = mMemory.mVals;
|
||||
int memSize = mMemory.mSize;
|
||||
|
@ -3443,6 +3441,33 @@ BfIRValue CeContext::CreateConstant(BfModule* module, uint8* ptr, BfType* bfType
|
|||
CE_CREATECONST_CHECKPTR(charPtr, lenVal);
|
||||
String str(charPtr, lenVal);
|
||||
return module->GetStringObjectValue(str);
|
||||
|
||||
}
|
||||
|
||||
if (typeInst->IsInstanceOf(mCeMachine->mCompiler->mStringViewTypeDef))
|
||||
{
|
||||
char* charPtr = (char*)memStart + *(addr_ce*)(ptr);
|
||||
int32 lenVal = *(int32*)(ptr + ptrSize);
|
||||
|
||||
CE_CREATECONST_CHECKPTR(charPtr, lenVal);
|
||||
String str(charPtr, lenVal);
|
||||
|
||||
auto stringViewType = ceModule->ResolveTypeDef(mCeMachine->mCompiler->mStringViewTypeDef, BfPopulateType_Data)->ToTypeInstance();
|
||||
auto spanType = stringViewType->mBaseType;
|
||||
auto valueTypeType = spanType->mBaseType;
|
||||
|
||||
SizedArray<BfIRValue, 1> valueTypeValues;
|
||||
BfIRValue valueTypeVal = irBuilder->CreateConstAgg(irBuilder->MapType(valueTypeType, BfIRPopulateType_Full), valueTypeValues);
|
||||
|
||||
SizedArray<BfIRValue, 3> spanValues;
|
||||
spanValues.Add(valueTypeVal);
|
||||
spanValues.Add(module->GetStringCharPtr(str));
|
||||
spanValues.Add(irBuilder->CreateConst(BfTypeCode_IntPtr, lenVal));
|
||||
BfIRValue spanVal = irBuilder->CreateConstAgg(irBuilder->MapType(spanType, BfIRPopulateType_Full), spanValues);
|
||||
|
||||
SizedArray<BfIRValue, 1> stringViewValues;
|
||||
stringViewValues.Add(spanVal);
|
||||
return irBuilder->CreateConstAgg(irBuilder->MapType(stringViewType, BfIRPopulateType_Full), stringViewValues);
|
||||
}
|
||||
|
||||
SizedArray<BfIRValue, 8> fieldVals;
|
||||
|
@ -3499,13 +3524,7 @@ BfIRValue CeContext::CreateConstant(BfModule* module, uint8* ptr, BfType* bfType
|
|||
Fail(StrFormat("Reference type '%s' return value not allowed", module->TypeToString(typeInst).c_str()));
|
||||
return BfIRValue();
|
||||
}
|
||||
|
||||
if (typeInst->IsPointer())
|
||||
{
|
||||
Fail(StrFormat("Pointer type '%s' return value not allowed", module->TypeToString(typeInst).c_str()));
|
||||
return BfIRValue();
|
||||
}
|
||||
|
||||
|
||||
if (typeInst->mBaseType != NULL)
|
||||
{
|
||||
auto result = CreateConstant(module, instData, typeInst->mBaseType);
|
||||
|
@ -3513,7 +3532,7 @@ BfIRValue CeContext::CreateConstant(BfModule* module, uint8* ptr, BfType* bfType
|
|||
return BfIRValue();
|
||||
fieldVals.Add(result);
|
||||
}
|
||||
|
||||
|
||||
for (int fieldIdx = 0; fieldIdx < typeInst->mFieldInstances.size(); fieldIdx++)
|
||||
{
|
||||
auto& fieldInstance = typeInst->mFieldInstances[fieldIdx];
|
||||
|
@ -3526,7 +3545,7 @@ BfIRValue CeContext::CreateConstant(BfModule* module, uint8* ptr, BfType* bfType
|
|||
if (fieldInstance.mResolvedType->IsInteger())
|
||||
fieldVals.Add(irBuilder->CreatePtrToInt(vdataPtr, ((BfPrimitiveType*)fieldInstance.mResolvedType)->mTypeDef->mTypeCode));
|
||||
else
|
||||
fieldVals.Add(vdataPtr);
|
||||
fieldVals.Add(vdataPtr);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -3535,19 +3554,48 @@ BfIRValue CeContext::CreateConstant(BfModule* module, uint8* ptr, BfType* bfType
|
|||
return BfIRValue();
|
||||
|
||||
if (fieldInstance.mDataIdx == fieldVals.mSize)
|
||||
fieldVals.Add(result);
|
||||
{
|
||||
fieldVals.Add(result);
|
||||
}
|
||||
else
|
||||
{
|
||||
while (fieldInstance.mDataIdx >= fieldVals.mSize)
|
||||
fieldVals.Add(BfIRValue());
|
||||
fieldVals[fieldInstance.mDataIdx] = result;
|
||||
fieldVals[fieldInstance.mDataIdx] = result;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& fieldVal : fieldVals)
|
||||
{
|
||||
if (!fieldVal)
|
||||
fieldVal = irBuilder->CreateConstArrayZero(0);
|
||||
}
|
||||
|
||||
auto instResult = irBuilder->CreateConstAgg(irBuilder->MapTypeInst(typeInst, BfIRPopulateType_Full), fieldVals);
|
||||
return instResult;
|
||||
}
|
||||
|
||||
if (bfType->IsPointer())
|
||||
{
|
||||
Fail(StrFormat("Pointer type '%s' return value not allowed", module->TypeToString(bfType).c_str()));
|
||||
return BfIRValue();
|
||||
}
|
||||
|
||||
if ((bfType->IsSizedArray()) && (!bfType->IsUnknownSizedArrayType()))
|
||||
{
|
||||
SizedArray<BfIRValue, 8> values;
|
||||
auto sizedArrayType = (BfSizedArrayType*)bfType;
|
||||
for (int i = 0; i < sizedArrayType->mElementCount; i++)
|
||||
{
|
||||
auto elemValue = CreateConstant(module, ptr + i * sizedArrayType->mElementType->GetStride(), sizedArrayType->mElementType);
|
||||
if (!elemValue)
|
||||
return BfIRValue();
|
||||
values.Add(elemValue);
|
||||
}
|
||||
|
||||
return irBuilder->CreateConstAgg(irBuilder->MapType(sizedArrayType, BfIRPopulateType_Full), values);
|
||||
}
|
||||
|
||||
return BfIRValue();
|
||||
}
|
||||
|
||||
|
@ -6085,7 +6133,7 @@ CeErrorKind CeMachine::WriteConstant(CeConstStructData& data, BeConstant* constV
|
|||
else if (globalVar->mType->mTypeCode == BeTypeCode_SizedArray)
|
||||
{
|
||||
auto arrayType = (BeSizedArrayType*)globalVar->mType;
|
||||
dataOfs = arrayType->mElementType->mSize * constGep->mIdx1;
|
||||
dataOfs = arrayType->mElementType->GetStride() * constGep->mIdx1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue