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

Support for static field exporting

This commit is contained in:
Brian Fiete 2020-09-21 23:38:50 -07:00
parent 989f9e6019
commit 6878183873
9 changed files with 61 additions and 7 deletions

View file

@ -2057,8 +2057,15 @@ void BeCOFFObject::Generate(BeModule* module)
mBSSSect.mSizeOverride = (mBSSSect.mSizeOverride + globalVar->mAlign - 1) & ~(globalVar->mAlign - 1); mBSSSect.mSizeOverride = (mBSSSect.mSizeOverride + globalVar->mAlign - 1) & ~(globalVar->mAlign - 1);
mBSSSect.mAlign = BF_MAX(mBSSSect.mAlign, globalVar->mAlign); mBSSSect.mAlign = BF_MAX(mBSSSect.mAlign, globalVar->mAlign);
sym->mValue = mBSSSect.mSizeOverride; sym->mValue = mBSSSect.mSizeOverride;
mBSSSect.mSizeOverride += globalVar->mType->mSize; mBSSSect.mSizeOverride += globalVar->mType->mSize;
} }
}
if (globalVar->mStorageKind == BfIRStorageKind_Export)
{
mDirectives += " ";
mDirectives.Append("/EXPORT:");
mDirectives.Append(globalVar->mName);
} }
} }

View file

@ -691,6 +691,7 @@ void BeIRCodeGen::Read(BeValue*& beValue)
globalVariable->mIsTLS = isTLS; globalVariable->mIsTLS = isTLS;
globalVariable->mAlign = varType->mAlign; globalVariable->mAlign = varType->mAlign;
globalVariable->mUnnamedAddr = false; globalVariable->mUnnamedAddr = false;
globalVariable->mStorageKind = BfIRStorageKind_Normal;
if (initializer != NULL) if (initializer != NULL)
BF_ASSERT(varType->mAlign > 0); BF_ASSERT(varType->mAlign > 0);
@ -1782,6 +1783,7 @@ void BeIRCodeGen::HandleNextCmd()
globalVariable->mName = name; globalVariable->mName = name;
globalVariable->mIsTLS = isTLS; globalVariable->mIsTLS = isTLS;
globalVariable->mUnnamedAddr = false; globalVariable->mUnnamedAddr = false;
globalVariable->mStorageKind = BfIRStorageKind_Normal;
if (initializer != NULL) if (initializer != NULL)
{ {
globalVariable->mAlign = varType->mAlign; globalVariable->mAlign = varType->mAlign;
@ -1838,6 +1840,17 @@ void BeIRCodeGen::HandleNextCmd()
} }
} }
break; break;
case BfIRCmd_GlobalVar_SetStorageKind:
{
CMD_PARAM(BeValue*, val);
CMD_PARAM(int, storageKind);
BF_ASSERT(BeValueDynCast<BeGlobalVariable>(val) != NULL);
auto globalVariable = (BeGlobalVariable*)val;
globalVariable->mStorageKind = (BfIRStorageKind)storageKind;
}
break;
case BfIRCmd_GlobalStringPtr: case BfIRCmd_GlobalStringPtr:
{ {
CMD_PARAM(String, str); CMD_PARAM(String, str);

View file

@ -415,6 +415,7 @@ public:
String mName; String mName;
BeConstant* mInitializer; BeConstant* mInitializer;
BfIRLinkageType mLinkageType; BfIRLinkageType mLinkageType;
BfIRStorageKind mStorageKind;
bool mIsConstant; bool mIsConstant;
bool mIsTLS; bool mIsTLS;
int mAlign; int mAlign;
@ -429,6 +430,7 @@ public:
if (mInitializer != NULL) if (mInitializer != NULL)
mInitializer->HashReference(hashCtx); mInitializer->HashReference(hashCtx);
hashCtx.Mixin(mLinkageType); hashCtx.Mixin(mLinkageType);
hashCtx.Mixin(mStorageKind);
hashCtx.Mixin(mIsConstant); hashCtx.Mixin(mIsConstant);
hashCtx.Mixin(mIsTLS); hashCtx.Mixin(mIsTLS);
hashCtx.Mixin(mAlign); hashCtx.Mixin(mAlign);

View file

@ -381,6 +381,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly)
mClassVDataTypeDef = NULL; mClassVDataTypeDef = NULL;
mCLinkAttributeTypeDef = NULL; mCLinkAttributeTypeDef = NULL;
mImportAttributeTypeDef = NULL; mImportAttributeTypeDef = NULL;
mExportAttributeTypeDef = NULL;
mCReprAttributeTypeDef = NULL; mCReprAttributeTypeDef = NULL;
mUnderlyingArrayAttributeTypeDef = NULL; mUnderlyingArrayAttributeTypeDef = NULL;
mAlignAttributeTypeDef = NULL; mAlignAttributeTypeDef = NULL;
@ -6422,6 +6423,7 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
mClassVDataTypeDef = _GetRequiredType("System.ClassVData"); mClassVDataTypeDef = _GetRequiredType("System.ClassVData");
mCLinkAttributeTypeDef = _GetRequiredType("System.CLinkAttribute"); mCLinkAttributeTypeDef = _GetRequiredType("System.CLinkAttribute");
mImportAttributeTypeDef = _GetRequiredType("System.ImportAttribute"); mImportAttributeTypeDef = _GetRequiredType("System.ImportAttribute");
mExportAttributeTypeDef = _GetRequiredType("System.ExportAttribute");
mCReprAttributeTypeDef = _GetRequiredType("System.CReprAttribute"); mCReprAttributeTypeDef = _GetRequiredType("System.CReprAttribute");
mUnderlyingArrayAttributeTypeDef = _GetRequiredType("System.UnderlyingArrayAttribute"); mUnderlyingArrayAttributeTypeDef = _GetRequiredType("System.UnderlyingArrayAttribute");
mAlignAttributeTypeDef = _GetRequiredType("System.AlignAttribute"); mAlignAttributeTypeDef = _GetRequiredType("System.AlignAttribute");

View file

@ -385,6 +385,7 @@ public:
BfTypeDef* mInlineAttributeTypeDef; BfTypeDef* mInlineAttributeTypeDef;
BfTypeDef* mCLinkAttributeTypeDef; BfTypeDef* mCLinkAttributeTypeDef;
BfTypeDef* mImportAttributeTypeDef; BfTypeDef* mImportAttributeTypeDef;
BfTypeDef* mExportAttributeTypeDef;
BfTypeDef* mCReprAttributeTypeDef; BfTypeDef* mCReprAttributeTypeDef;
BfTypeDef* mUnderlyingArrayAttributeTypeDef; BfTypeDef* mUnderlyingArrayAttributeTypeDef;
BfTypeDef* mAlignAttributeTypeDef; BfTypeDef* mAlignAttributeTypeDef;
@ -404,8 +405,7 @@ public:
BfTypeDef* mErrorAttributeTypeDef; BfTypeDef* mErrorAttributeTypeDef;
BfTypeDef* mWarnAttributeTypeDef; BfTypeDef* mWarnAttributeTypeDef;
BfTypeDef* mIgnoreErrorsAttributeTypeDef; BfTypeDef* mIgnoreErrorsAttributeTypeDef;
BfTypeDef* mReflectAttributeTypeDef; BfTypeDef* mReflectAttributeTypeDef;
int mCurTypeId; int mCurTypeId;
int mTypeInitCount; int mTypeInitCount;

View file

@ -4395,6 +4395,12 @@ void BfIRBuilder::GlobalVar_SetAlignment(BfIRValue globalVar, int alignment)
NEW_CMD_INSERTED; NEW_CMD_INSERTED;
} }
void BfIRBuilder::GlobalVar_SetStorageKind(BfIRValue globalVar, BfIRStorageKind storageKind)
{
BfIRValue retVal = WriteCmd(BfIRCmd_GlobalVar_SetStorageKind, globalVar, (int)storageKind);
NEW_CMD_INSERTED;
}
BfIRValue BfIRBuilder::CreateGlobalStringPtr(const StringImpl& str) BfIRValue BfIRBuilder::CreateGlobalStringPtr(const StringImpl& str)
{ {
BfIRValue retVal = WriteCmd(BfIRCmd_GlobalStringPtr, str); BfIRValue retVal = WriteCmd(BfIRCmd_GlobalStringPtr, str);

View file

@ -233,6 +233,7 @@ enum BfIRCmd : uint8
BfIRCmd_GlobalVar_SetUnnamedAddr, BfIRCmd_GlobalVar_SetUnnamedAddr,
BfIRCmd_GlobalVar_SetInitializer, BfIRCmd_GlobalVar_SetInitializer,
BfIRCmd_GlobalVar_SetAlignment, BfIRCmd_GlobalVar_SetAlignment,
BfIRCmd_GlobalVar_SetStorageKind,
BfIRCmd_GlobalStringPtr, BfIRCmd_GlobalStringPtr,
BfIRCmd_CreateBlock, BfIRCmd_CreateBlock,
@ -464,6 +465,13 @@ enum BfIRAtomicOrdering : uint8
BfIRAtomicOrdering_ReturnModified = 0x10 // Generally atomic instructions return original value, this overrides that BfIRAtomicOrdering_ReturnModified = 0x10 // Generally atomic instructions return original value, this overrides that
}; };
enum BfIRStorageKind : uint8
{
BfIRStorageKind_Normal,
BfIRStorageKind_Import,
BfIRStorageKind_Export
};
//#define CHECK_CONSTHOLDER //#define CHECK_CONSTHOLDER
struct BfIRRawValue struct BfIRRawValue
@ -1164,6 +1172,7 @@ public:
void GlobalVar_SetUnnamedAddr(BfIRValue val, bool unnamedAddr); void GlobalVar_SetUnnamedAddr(BfIRValue val, bool unnamedAddr);
void GlobalVar_SetInitializer(BfIRValue globalVar, BfIRValue initVal); void GlobalVar_SetInitializer(BfIRValue globalVar, BfIRValue initVal);
void GlobalVar_SetAlignment(BfIRValue globalVar, int alignment); void GlobalVar_SetAlignment(BfIRValue globalVar, int alignment);
void GlobalVar_SetStorageKind(BfIRValue globalVar, BfIRStorageKind storageKind);
BfIRValue CreateGlobalStringPtr(const StringImpl& str); BfIRValue CreateGlobalStringPtr(const StringImpl& str);
BfIRBlock CreateBlock(const StringImpl& name, bool addNow = false); BfIRBlock CreateBlock(const StringImpl& name, bool addNow = false);

View file

@ -2199,6 +2199,13 @@ void BfIRCodeGen::HandleNextCmd()
((llvm::GlobalVariable*)val)->setAlignment(alignment); ((llvm::GlobalVariable*)val)->setAlignment(alignment);
} }
break; break;
case BfIRCmd_GlobalVar_SetStorageKind:
{
CMD_PARAM(llvm::Value*, val);
CMD_PARAM(int, storageKind);
((llvm::GlobalVariable*)val)->setDLLStorageClass((llvm::GlobalValue::DLLStorageClassTypes)storageKind);
}
break;
case BfIRCmd_GlobalStringPtr: case BfIRCmd_GlobalStringPtr:
{ {
CMD_PARAM(String, str); CMD_PARAM(String, str);

View file

@ -3508,7 +3508,13 @@ void BfModule::CreateStaticField(BfFieldInstance* fieldInstance, bool isThreadLo
fieldType = fieldType->GetUnderlyingType(); fieldType = fieldType->GetUnderlyingType();
} }
if (!field->mIsExtern) BfIRStorageKind storageKind = BfIRStorageKind_Normal;
if ((fieldInstance->mCustomAttributes != NULL) && (fieldInstance->mCustomAttributes->Get(mCompiler->mExportAttributeTypeDef)))
storageKind = BfIRStorageKind_Export;
else if ((fieldInstance->mCustomAttributes != NULL) && (fieldInstance->mCustomAttributes->Get(mCompiler->mImportAttributeTypeDef)))
storageKind = BfIRStorageKind_Import;
if ((!field->mIsExtern) && (storageKind != BfIRStorageKind_Import))
initValue = GetDefaultValue(fieldType); initValue = GetDefaultValue(fieldType);
if (fieldInstance->mOwner->IsUnspecializedType()) if (fieldInstance->mOwner->IsUnspecializedType())
@ -3531,8 +3537,10 @@ void BfModule::CreateStaticField(BfFieldInstance* fieldInstance, bool isThreadLo
initValue, initValue,
staticVarName, staticVarName,
isThreadLocal); isThreadLocal);
mBfIRBuilder->GlobalVar_SetAlignment(globalVar, fieldType->mAlign); mBfIRBuilder->GlobalVar_SetAlignment(globalVar, fieldType->mAlign);
if (storageKind != BfIRStorageKind_Normal)
mBfIRBuilder->GlobalVar_SetStorageKind(globalVar, storageKind);
BF_ASSERT(globalVar); BF_ASSERT(globalVar);
mStaticFieldRefs[fieldInstance] = globalVar; mStaticFieldRefs[fieldInstance] = globalVar;
} }