1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00
Beef/IDEHelper/Backend/BeContext.h

294 lines
5.6 KiB
C
Raw Normal View History

2019-08-23 11:56:54 -07:00
#pragma once
#include "../Beef/BfCommon.h"
#include "../Compiler/BfCompiler.h"
#include "BeefySysLib/util/BumpAllocator.h"
NS_BF_BEGIN
class BePointerType;
class BeContext;
enum BeTypeCode
{
BeTypeCode_None,
BeTypeCode_NullPtr,
BeTypeCode_Boolean,
BeTypeCode_Int8,
BeTypeCode_Int16,
BeTypeCode_Int32,
BeTypeCode_Int64,
BeTypeCode_Float,
BeTypeCode_Double,
2020-08-23 05:42:42 -07:00
BeTypeCode_M128,
BeTypeCode_M256,
BeTypeCode_M512,
2019-08-23 11:56:54 -07:00
BeTypeCode_Struct,
BeTypeCode_Function,
BeTypeCode_Pointer,
BeTypeCode_SizedArray,
2020-08-23 05:42:42 -07:00
BeTypeCode_Vector,
2019-08-23 11:56:54 -07:00
BeTypeCode_CmpResult, // Psuedo
BeTypeCode_COUNT
};
class BeHashContext : public HashContext
{
public:
int mCurHashId;
BeHashContext()
{
mCurHashId = 1;
}
};
class BeHashble
{
public:
int mHashId;
BeHashble()
{
mHashId = -1;
}
virtual void HashContent(BeHashContext& hashCtx) = 0;
void HashReference(BeHashContext& hashCtx)
{
if (mHashId == -1)
{
mHashId = hashCtx.mCurHashId++;
hashCtx.Mixin(mHashId);
HashContent(hashCtx);
}
else
hashCtx.Mixin(mHashId);
}
};
class BeType : public BeHashble
{
public:
BeTypeCode mTypeCode;
BePointerType* mPointerType;
int mSize;
int mAlign;
public:
BeType()
{
mTypeCode = BeTypeCode_None;
mPointerType = NULL;
mSize = -1;
mAlign = -1;
}
virtual ~BeType()
{
}
2021-01-18 14:09:16 -08:00
int GetStride()
{
return BF_ALIGN(mSize, mAlign);
}
2019-08-23 11:56:54 -07:00
bool IsPointer()
{
return (mTypeCode == BeTypeCode_Pointer) || (mTypeCode == BeTypeCode_NullPtr);
}
bool IsInt()
{
return (mTypeCode >= BeTypeCode_Int8) && (mTypeCode <= BeTypeCode_Int64);
}
bool IsIntable()
{
return ((mTypeCode >= BeTypeCode_Boolean) && (mTypeCode <= BeTypeCode_Int64)) || (mTypeCode == BeTypeCode_Pointer);
}
bool IsIntegral()
{
return (mTypeCode >= BeTypeCode_Int8) && (mTypeCode <= BeTypeCode_Int64);
}
bool IsFloat()
{
return (mTypeCode == BeTypeCode_Float) || (mTypeCode == BeTypeCode_Double);
}
bool IsStruct()
{
return (mTypeCode == BeTypeCode_Struct);
}
bool IsSizedArray()
{
return (mTypeCode == BeTypeCode_SizedArray);
}
2020-08-23 05:42:42 -07:00
bool IsVector()
{
return (mTypeCode == BeTypeCode_Vector) || (mTypeCode == BeTypeCode_M128) || (mTypeCode == BeTypeCode_M256) || (mTypeCode == BeTypeCode_M512);
}
bool IsExplicitVectorType()
{
return (mTypeCode == BeTypeCode_Vector);
}
2020-08-27 10:11:42 -07:00
bool IsFloatOrVector()
{
return (mTypeCode == BeTypeCode_Float) || (mTypeCode == BeTypeCode_Double) ||
(mTypeCode == BeTypeCode_Vector) || (mTypeCode == BeTypeCode_M128) || (mTypeCode == BeTypeCode_M256) || (mTypeCode == BeTypeCode_M512);
}
2019-08-23 11:56:54 -07:00
bool IsComposite()
2020-08-23 05:42:42 -07:00
{
return (mTypeCode == BeTypeCode_Struct) || (mTypeCode == BeTypeCode_SizedArray) || (mTypeCode == BeTypeCode_Vector) || (mTypeCode == BeTypeCode_M128) || (mTypeCode == BeTypeCode_M256) || (mTypeCode == BeTypeCode_M512);
}
bool IsNonVectorComposite()
2019-08-23 11:56:54 -07:00
{
return (mTypeCode == BeTypeCode_Struct) || (mTypeCode == BeTypeCode_SizedArray);
}
virtual void HashContent(BeHashContext& hashCtx)
2022-07-27 12:26:36 -04:00
{
2019-08-23 11:56:54 -07:00
BF_ASSERT(mTypeCode < BeTypeCode_Struct);
hashCtx.Mixin(mTypeCode);
2022-07-27 12:26:36 -04:00
}
2019-08-23 11:56:54 -07:00
};
class BeStructMember
{
public:
BeType* mType;
int mByteOffset;
};
class BeStructType : public BeType
{
2022-07-27 12:26:36 -04:00
public:
2019-08-23 11:56:54 -07:00
BeContext* mContext;
String mName;
2022-07-27 12:26:36 -04:00
Array<BeStructMember> mMembers;
2019-08-23 11:56:54 -07:00
bool mIsPacked;
bool mIsOpaque;
2022-07-27 12:26:36 -04:00
2019-08-23 11:56:54 -07:00
virtual void HashContent(BeHashContext& hashCtx) override
2022-07-27 12:26:36 -04:00
{
2019-08-23 11:56:54 -07:00
hashCtx.MixinStr(mName);
hashCtx.Mixin(mMembers.size());
for (auto& member : mMembers)
{
member.mType->HashReference(hashCtx);
2022-07-27 12:26:36 -04:00
hashCtx.Mixin(member.mByteOffset);
2019-08-23 11:56:54 -07:00
}
hashCtx.Mixin(mIsPacked);
hashCtx.Mixin(mIsOpaque);
}
};
class BePointerType : public BeType
{
public:
BeType* mElementType;
virtual void HashContent(BeHashContext& hashCtx) override
{
hashCtx.Mixin(BeTypeCode_Pointer);
mElementType->HashReference(hashCtx);
}
};
class BeSizedArrayType : public BeType
{
public:
BeContext* mContext;
BeType* mElementType;
int mLength;
2022-07-27 12:26:36 -04:00
2019-08-23 11:56:54 -07:00
virtual void HashContent(BeHashContext& hashCtx) override
2022-07-27 12:26:36 -04:00
{
2019-08-23 11:56:54 -07:00
hashCtx.Mixin(BeTypeCode_SizedArray);
hashCtx.Mixin(mLength);
mElementType->HashReference(hashCtx);
}
};
2020-08-23 05:42:42 -07:00
class BeVectorType : public BeType
{
public:
BeContext* mContext;
BeType* mElementType;
int mLength;
virtual void HashContent(BeHashContext& hashCtx) override
{
hashCtx.Mixin(BeTypeCode_Vector);
hashCtx.Mixin(mLength);
mElementType->HashReference(hashCtx);
}
};
2019-08-23 11:56:54 -07:00
class BeFunctionTypeParam
{
public:
BeType* mType;
};
class BeFunctionType : public BeType
{
public:
String mName;
2022-07-27 12:26:36 -04:00
BeType* mReturnType;
Array<BeFunctionTypeParam> mParams;
2019-08-23 11:56:54 -07:00
bool mIsVarArg;
2022-07-27 12:26:36 -04:00
2019-08-23 11:56:54 -07:00
virtual void HashContent(BeHashContext& hashCtx) override
{
hashCtx.Mixin(BeTypeCode_Function);
hashCtx.MixinStr(mName);
2022-07-27 12:26:36 -04:00
mReturnType->HashReference(hashCtx);
2019-08-23 11:56:54 -07:00
hashCtx.Mixin(mParams.size());
for (auto& param : mParams)
{
param.mType->HashReference(hashCtx);
}
2022-07-27 12:26:36 -04:00
hashCtx.Mixin(mIsVarArg);
2019-08-23 11:56:54 -07:00
}
};
class BeContext
{
2022-07-27 12:26:36 -04:00
public:
2019-08-23 11:56:54 -07:00
int mPointerSize;
//BumpAllocator mAlloc;
BeType* mPrimitiveTypes[BeTypeCode_COUNT];
OwnedVector<BeType> mTypes;
Dictionary<Array<BeType*>, BeStructType*> mAnonymousStructMap;
2019-08-23 11:56:54 -07:00
public:
void NotImpl();
public:
2022-07-27 12:26:36 -04:00
BeContext();
BeType* GetPrimitiveType(BeTypeCode typeCode);
2020-12-19 14:19:33 -08:00
BeType* GetVoidPtrType();
2019-08-23 11:56:54 -07:00
BeStructType* CreateStruct(const StringImpl& name);
BeStructType* CreateStruct(const SizedArrayImpl<BeType*>& types);
2019-08-23 11:56:54 -07:00
BePointerType* GetPointerTo(BeType* beType);
void SetStructBody(BeStructType* structType, const SizedArrayImpl<BeType*>& types, bool packed);
BeSizedArrayType* CreateSizedArrayType(BeType* type, int length);
2020-08-23 05:42:42 -07:00
BeVectorType* CreateVectorType(BeType* type, int length);
2019-08-23 11:56:54 -07:00
BeFunctionType* CreateFunctionType(BeType* returnType, const SizedArrayImpl<BeType*>& paramTypes, bool isVarArg);
bool AreTypesEqual(BeType* lhs, BeType* rhs);
};
NS_BF_END