mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 12:32:20 +02:00
Fixed some alignment differences between LLVM and BeefBE
This commit is contained in:
parent
0ae14f5a5d
commit
1ca01864bb
12 changed files with 73 additions and 21 deletions
|
@ -1829,12 +1829,16 @@ void BeCOFFObject::InitSect(BeCOFFSection& sect, const StringImpl& name, int cha
|
|||
MarkSectionUsed(sect, makeSectSymbol);
|
||||
}
|
||||
|
||||
void BeCOFFObject::WriteConst(BeCOFFSection& sect, BeConstant* constVal)
|
||||
{
|
||||
void BeCOFFObject::AlignConst(BeCOFFSection& sect, BeConstant* constVal)
|
||||
{
|
||||
auto beType = constVal->GetType();
|
||||
sect.mAlign = BF_MAX(sect.mAlign, beType->mAlign);
|
||||
sect.mData.Align(beType->mAlign);
|
||||
}
|
||||
|
||||
void BeCOFFObject::WriteConst(BeCOFFSection& sect, BeConstant* constVal)
|
||||
{
|
||||
auto beType = constVal->GetType();
|
||||
if (auto globalVar = BeValueDynCast<BeGlobalVariable>(constVal))
|
||||
{
|
||||
auto sym = GetSymbol(globalVar);
|
||||
|
@ -1881,14 +1885,7 @@ void BeCOFFObject::WriteConst(BeCOFFSection& sect, BeConstant* constVal)
|
|||
}
|
||||
else
|
||||
BF_FATAL("Invalid StructConst type");
|
||||
}
|
||||
else if (auto constArr = BeValueDynCast<BeStructConstant>(constVal))
|
||||
{
|
||||
for (auto member : constArr->mMemberValues)
|
||||
{
|
||||
WriteConst(sect, member);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (auto constStr = BeValueDynCast<BeStringConstant>(constVal))
|
||||
{
|
||||
sect.mData.Write((void*)constStr->mString.c_str(), (int)constStr->mString.length() + 1);
|
||||
|
@ -1995,7 +1992,7 @@ void BeCOFFObject::Generate(BeModule* module)
|
|||
sym->mIsStatic = globalVar->mLinkageType == BfIRLinkageType_Internal;
|
||||
sym->mSymKind = BeMCSymbolKind_External;
|
||||
sym->mIdx = (int)mSymbols.size() - 1;
|
||||
sym->mIsTLS = globalVar->mIsTLS;
|
||||
sym->mIsTLS = globalVar->mIsTLS;
|
||||
|
||||
globalVarSyms.push_back(sym);
|
||||
mSymbolMap[globalVar] = sym;
|
||||
|
@ -2013,6 +2010,11 @@ void BeCOFFObject::Generate(BeModule* module)
|
|||
|
||||
BF_ASSERT(globalVar->mAlign != -1);
|
||||
|
||||
if (globalVar->mName == "sBfTypeData._J")
|
||||
{
|
||||
NOP;
|
||||
}
|
||||
|
||||
if (globalVar->mIsConstant)
|
||||
{
|
||||
auto constVal = BeValueDynCast<BeConstant>(globalVar->mInitializer);
|
||||
|
@ -2021,9 +2023,9 @@ void BeCOFFObject::Generate(BeModule* module)
|
|||
sym->mSectionNum = mRDataSect.mSectionIdx + 1;
|
||||
mRDataSect.mData.Align(globalVar->mAlign);
|
||||
mRDataSect.mAlign = BF_MAX(mRDataSect.mAlign, globalVar->mAlign);
|
||||
sym->mValue = mRDataSect.mData.GetSize();
|
||||
//mRDataSect.mSizeOverride += globalVar->mType->mSize;
|
||||
|
||||
AlignConst(mRDataSect, constVal);
|
||||
sym->mValue = mRDataSect.mData.GetSize();
|
||||
WriteConst(mRDataSect, constVal);
|
||||
}
|
||||
else if (globalVar->mIsTLS)
|
||||
|
|
|
@ -272,6 +272,7 @@ public:
|
|||
void DbgEndLineBlock(BeDbgFunction* dbgFunc, const Array<BeDbgCodeEmission>& emissions, int blockStartPos, int emissionStartIdx, int lineCount);
|
||||
void DbgGenerateModuleInfo();
|
||||
void InitSect(BeCOFFSection& sect, const StringImpl& name, int characteristics, bool addNow, bool makeSectSymbol);
|
||||
void AlignConst(BeCOFFSection& sect, BeConstant* constVal);
|
||||
void WriteConst(BeCOFFSection& sect, BeConstant* constVal);
|
||||
|
||||
void Generate(BeModule* module);
|
||||
|
|
|
@ -108,7 +108,10 @@ void BeContext::SetStructBody(BeStructType* structType, const SizedArrayImpl<BeT
|
|||
member.mType = beType;
|
||||
member.mByteOffset = dataPos;
|
||||
dataPos += beType->mSize;
|
||||
structType->mAlign = std::max(structType->mAlign, beType->mAlign);
|
||||
if (packed)
|
||||
structType->mAlign = 1;
|
||||
else
|
||||
structType->mAlign = std::max(structType->mAlign, beType->mAlign);
|
||||
structType->mMembers.push_back(member);
|
||||
}
|
||||
if (!packed)
|
||||
|
|
|
@ -131,7 +131,7 @@ public:
|
|||
{
|
||||
BF_ASSERT(mTypeCode < BeTypeCode_Struct);
|
||||
hashCtx.Mixin(mTypeCode);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class BeStructMember
|
||||
|
|
|
@ -634,7 +634,7 @@ void BeIRCodeGen::Read(BeValue*& beValue)
|
|||
globalVariable->mName = name;
|
||||
globalVariable->mIsTLS = isTLS;
|
||||
globalVariable->mAlign = varType->mAlign;
|
||||
globalVariable->mUnnamedAddr = false;
|
||||
globalVariable->mUnnamedAddr = false;
|
||||
BF_ASSERT(varType->mAlign > 0);
|
||||
|
||||
SetResult(streamId, globalVariable);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue