|
@@ -1829,12 +1829,16 @@ void BeCOFFObject::InitSect(BeCOFFSection& sect, const StringImpl& name, int cha
|
|
MarkSectionUsed(sect, makeSectSymbol);
|
|
MarkSectionUsed(sect, makeSectSymbol);
|
|
}
|
|
}
|
|
|
|
|
|
-void BeCOFFObject::WriteConst(BeCOFFSection& sect, BeConstant* constVal)
|
|
|
|
-{
|
|
|
|
|
|
+void BeCOFFObject::AlignConst(BeCOFFSection& sect, BeConstant* constVal)
|
|
|
|
+{
|
|
auto beType = constVal->GetType();
|
|
auto beType = constVal->GetType();
|
|
sect.mAlign = BF_MAX(sect.mAlign, beType->mAlign);
|
|
sect.mAlign = BF_MAX(sect.mAlign, beType->mAlign);
|
|
sect.mData.Align(beType->mAlign);
|
|
sect.mData.Align(beType->mAlign);
|
|
|
|
+}
|
|
|
|
|
|
|
|
+void BeCOFFObject::WriteConst(BeCOFFSection& sect, BeConstant* constVal)
|
|
|
|
+{
|
|
|
|
+ auto beType = constVal->GetType();
|
|
if (auto globalVar = BeValueDynCast<BeGlobalVariable>(constVal))
|
|
if (auto globalVar = BeValueDynCast<BeGlobalVariable>(constVal))
|
|
{
|
|
{
|
|
auto sym = GetSymbol(globalVar);
|
|
auto sym = GetSymbol(globalVar);
|
|
@@ -1881,14 +1885,7 @@ void BeCOFFObject::WriteConst(BeCOFFSection& sect, BeConstant* constVal)
|
|
}
|
|
}
|
|
else
|
|
else
|
|
BF_FATAL("Invalid StructConst type");
|
|
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))
|
|
else if (auto constStr = BeValueDynCast<BeStringConstant>(constVal))
|
|
{
|
|
{
|
|
sect.mData.Write((void*)constStr->mString.c_str(), (int)constStr->mString.length() + 1);
|
|
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->mIsStatic = globalVar->mLinkageType == BfIRLinkageType_Internal;
|
|
sym->mSymKind = BeMCSymbolKind_External;
|
|
sym->mSymKind = BeMCSymbolKind_External;
|
|
sym->mIdx = (int)mSymbols.size() - 1;
|
|
sym->mIdx = (int)mSymbols.size() - 1;
|
|
- sym->mIsTLS = globalVar->mIsTLS;
|
|
|
|
|
|
+ sym->mIsTLS = globalVar->mIsTLS;
|
|
|
|
|
|
globalVarSyms.push_back(sym);
|
|
globalVarSyms.push_back(sym);
|
|
mSymbolMap[globalVar] = sym;
|
|
mSymbolMap[globalVar] = sym;
|
|
@@ -2013,6 +2010,11 @@ void BeCOFFObject::Generate(BeModule* module)
|
|
|
|
|
|
BF_ASSERT(globalVar->mAlign != -1);
|
|
BF_ASSERT(globalVar->mAlign != -1);
|
|
|
|
|
|
|
|
+ if (globalVar->mName == "sBfTypeData._J")
|
|
|
|
+ {
|
|
|
|
+ NOP;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (globalVar->mIsConstant)
|
|
if (globalVar->mIsConstant)
|
|
{
|
|
{
|
|
auto constVal = BeValueDynCast<BeConstant>(globalVar->mInitializer);
|
|
auto constVal = BeValueDynCast<BeConstant>(globalVar->mInitializer);
|
|
@@ -2021,9 +2023,9 @@ void BeCOFFObject::Generate(BeModule* module)
|
|
sym->mSectionNum = mRDataSect.mSectionIdx + 1;
|
|
sym->mSectionNum = mRDataSect.mSectionIdx + 1;
|
|
mRDataSect.mData.Align(globalVar->mAlign);
|
|
mRDataSect.mData.Align(globalVar->mAlign);
|
|
mRDataSect.mAlign = BF_MAX(mRDataSect.mAlign, 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);
|
|
WriteConst(mRDataSect, constVal);
|
|
}
|
|
}
|
|
else if (globalVar->mIsTLS)
|
|
else if (globalVar->mIsTLS)
|