| 4767 | } |
| 4768 | |
| 4769 | BfIRValue CeContext::CreateConstant(BfModule* module, uint8* ptr, BfType* bfType, BfType** outType) |
| 4770 | { |
| 4771 | auto ceModule = mCeMachine->mCeModule; |
| 4772 | BfIRBuilder* irBuilder = module->mBfIRBuilder; |
| 4773 | int32 ptrSize = module->mSystem->mPtrSize; |
| 4774 | |
| 4775 | uint8* memStart = mMemory.mVals; |
| 4776 | int memSize = mMemory.mSize; |
| 4777 | |
| 4778 | if (bfType->IsPrimitiveType()) |
| 4779 | { |
| 4780 | auto primType = (BfPrimitiveType*)bfType; |
| 4781 | |
| 4782 | auto typeCode = primType->mTypeDef->mTypeCode; |
| 4783 | if (typeCode == BfTypeCode_IntPtr) |
| 4784 | typeCode = (ceModule->mCompiler->mSystem->mPtrSize == 4) ? BfTypeCode_Int32 : BfTypeCode_Int64; |
| 4785 | else if (typeCode == BfTypeCode_UIntPtr) |
| 4786 | typeCode = (ceModule->mCompiler->mSystem->mPtrSize == 4) ? BfTypeCode_UInt32 : BfTypeCode_UInt64; |
| 4787 | |
| 4788 | switch (typeCode) |
| 4789 | { |
| 4790 | case BfTypeCode_None: |
| 4791 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, 0); |
| 4792 | case BfTypeCode_Int8: |
| 4793 | CE_CREATECONST_CHECKPTR(ptr, sizeof(int8)); |
| 4794 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, *(int8*)ptr); |
| 4795 | case BfTypeCode_UInt8: |
| 4796 | case BfTypeCode_Boolean: |
| 4797 | case BfTypeCode_Char8: |
| 4798 | CE_CREATECONST_CHECKPTR(ptr, sizeof(uint8)); |
| 4799 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, *(uint8*)ptr); |
| 4800 | case BfTypeCode_Int16: |
| 4801 | CE_CREATECONST_CHECKPTR(ptr, sizeof(int16)); |
| 4802 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, *(int16*)ptr); |
| 4803 | case BfTypeCode_UInt16: |
| 4804 | case BfTypeCode_Char16: |
| 4805 | CE_CREATECONST_CHECKPTR(ptr, sizeof(uint16)); |
| 4806 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, *(uint16*)ptr); |
| 4807 | case BfTypeCode_Int32: |
| 4808 | CE_CREATECONST_CHECKPTR(ptr, sizeof(int32)); |
| 4809 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, *(int32*)ptr); |
| 4810 | case BfTypeCode_UInt32: |
| 4811 | case BfTypeCode_Char32: |
| 4812 | CE_CREATECONST_CHECKPTR(ptr, sizeof(uint32)); |
| 4813 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, (uint64) * (uint32*)ptr); |
| 4814 | case BfTypeCode_Int64: |
| 4815 | case BfTypeCode_UInt64: |
| 4816 | CE_CREATECONST_CHECKPTR(ptr, sizeof(int64)); |
| 4817 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, *(uint64*)ptr); |
| 4818 | case BfTypeCode_Float: |
| 4819 | CE_CREATECONST_CHECKPTR(ptr, sizeof(float)); |
| 4820 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, *(float*)ptr); |
| 4821 | case BfTypeCode_Double: |
| 4822 | CE_CREATECONST_CHECKPTR(ptr, sizeof(double)); |
| 4823 | return irBuilder->CreateConst(primType->mTypeDef->mTypeCode, *(double*)ptr); |
| 4824 | } |
| 4825 | |
| 4826 | return BfIRValue(); |
no test coverage detected