123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- #include "BeContext.h"
- USING_NS_BF;
- BeContext::BeContext()
- {
- mPointerSize = 8;
- for (int primIdx = 0; primIdx < (int)BeTypeCode_COUNT; primIdx++)
- mPrimitiveTypes[primIdx] = NULL;
- }
- void BeContext::NotImpl()
- {
- BF_FATAL("Not implemented");
- }
- BeType* BeContext::GetPrimitiveType(BeTypeCode typeCode)
- {
- if (typeCode == BeTypeCode_NullPtr)
- {
- return GetPointerTo(GetPrimitiveType(BeTypeCode_None));
- }
- if (mPrimitiveTypes[(int)typeCode] != NULL)
- return mPrimitiveTypes[(int)typeCode];
- BeType* primType = mTypes.Alloc<BeType>();
- primType->mTypeCode = typeCode;
- switch (typeCode)
- {
- case BeTypeCode_None:
- primType->mSize = 0;
- primType->mAlign = 0;
- break;
- case BeTypeCode_NullPtr:
- primType->mSize = primType->mAlign = mPointerSize;
- break;
- case BeTypeCode_Boolean:
- primType->mSize = primType->mAlign = 1;
- break;
- case BeTypeCode_Int8:
- primType->mSize = primType->mAlign = 1;
- break;
- case BeTypeCode_Int16:
- primType->mSize = primType->mAlign = 2;
- break;
- case BeTypeCode_Int32:
- primType->mSize = primType->mAlign = 4;
- break;
- case BeTypeCode_Int64:
- primType->mSize = primType->mAlign = 8;
- break;
- case BeTypeCode_Float:
- primType->mSize = primType->mAlign = 4;
- break;
- case BeTypeCode_Double:
- primType->mSize = primType->mAlign = 8;
- break;
- }
- mPrimitiveTypes[(int)typeCode] = primType;
- return primType;
- }
- BeStructType* BeContext::CreateStruct(const StringImpl& name)
- {
- BeStructType* structType = mTypes.Alloc<BeStructType>();
- structType->mContext = this;
- structType->mTypeCode = BeTypeCode_Struct;
- structType->mName = name;
- structType->mIsOpaque = true;
- return structType;
- }
- BePointerType* BeContext::GetPointerTo(BeType* beType)
- {
- if (beType->mPointerType == NULL)
- {
- BePointerType* pointerType = mTypes.Alloc<BePointerType>();
- pointerType->mTypeCode = BeTypeCode_Pointer;
- pointerType->mElementType = beType;
- pointerType->mSize = mPointerSize;
- pointerType->mAlign = mPointerSize;
- beType->mPointerType = pointerType;
- /*if (beType->IsSizedArray())
- {
- auto sizedArrayType = (BeSizedArrayType*)beType;
- pointerType->mElementType = sizedArrayType->mElementType;
- }*/
- }
- return beType->mPointerType;
- }
- void BeContext::SetStructBody(BeStructType* structType, const SizedArrayImpl<BeType*>& types, bool packed)
- {
- BF_ASSERT(structType->mMembers.IsEmpty());
- int dataPos = 0;
- for (auto& beType : types)
- {
- if (!packed)
- {
- int alignSize = beType->mAlign;
- dataPos = (dataPos + (alignSize - 1)) & ~(alignSize - 1);
- }
- BF_ASSERT(beType->mSize >= 0);
- BeStructMember member;
- member.mType = beType;
- member.mByteOffset = dataPos;
- dataPos += beType->mSize;
- structType->mAlign = std::max(structType->mAlign, beType->mAlign);
- structType->mMembers.push_back(member);
- }
- if (!packed)
- {
- int alignSize = structType->mAlign;
- dataPos = (dataPos + (alignSize - 1)) & ~(alignSize - 1);
- }
- structType->mSize = dataPos;
- structType->mIsPacked = packed;
- structType->mIsOpaque = false;
- }
- BeSizedArrayType* BeContext::CreateSizedArrayType(BeType* type, int length)
- {
- auto arrayType = mTypes.Alloc<BeSizedArrayType>();
- arrayType->mContext = this;
- arrayType->mTypeCode = BeTypeCode_SizedArray;
- arrayType->mElementType = type;
- arrayType->mLength = length;
- arrayType->mSize = type->mSize * length;
- arrayType->mAlign = type->mAlign;
- return arrayType;
- }
- BeFunctionType* BeContext::CreateFunctionType(BeType* returnType, const SizedArrayImpl<BeType*>& paramTypes, bool isVarArg)
- {
- auto funcType = mTypes.Alloc<BeFunctionType>();
- funcType->mTypeCode = BeTypeCode_Function;
- funcType->mReturnType = returnType;
- for (auto& paramType : paramTypes)
- {
- BeFunctionTypeParam funcParam;
- funcParam.mType = paramType;
- funcType->mParams.push_back(funcParam);
- }
- funcType->mIsVarArg = isVarArg;
- return funcType;
- }
- bool BeContext::AreTypesEqual(BeType* lhs, BeType* rhs)
- {
- if (lhs == rhs)
- return true;
-
- if (lhs->mTypeCode != rhs->mTypeCode)
- return false;
- switch (lhs->mTypeCode)
- {
- case BeTypeCode_None:
- case BeTypeCode_NullPtr:
- case BeTypeCode_Boolean:
- case BeTypeCode_Int8:
- case BeTypeCode_Int16:
- case BeTypeCode_Int32:
- case BeTypeCode_Int64:
- case BeTypeCode_Float:
- case BeTypeCode_Double:
- return true;
- case BeTypeCode_Pointer:
- return AreTypesEqual(((BePointerType*)lhs)->mElementType, ((BePointerType*)rhs)->mElementType);
- }
- return false;
- }
|