1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00
Beef/IDEHelper/Backend/BeContext.cpp
Brian Fiete a367b8165f Win32 debugging fixes, more work on custom compile commands
Fixed working dir for 'launch'
Fixed attaching to process - stack trace wasn't updating properly
Fixed more custom compile stuff, and BeefySysLib bin destination
Fixed linking issues related to Bfp* and Bp* exports in both BeefRT and BeefySysLib
Fixed a crash with conditional breakpoints
Fixed release mode IDE issues (related to hot swap breakpoints)
Fixed hotswapping type data with LLVM builds
Fixed 'Pause' state processing Running_ToTempBreakpoint for ScriptManager
Fixed Win32 step out when there's an ESP adjustment at the return site
Made step-out skip over "unimportant" instructions at return site
2019-08-29 14:19:07 -07:00

176 lines
4.3 KiB
C++

#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;
}