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

@ -2060,6 +2060,13 @@ void BeCOFFObject::Generate(BeModule* module)
mBSSSect.mSizeOverride += globalVar->mType->mSize;
}
}
if (globalVar->mStorageKind == BfIRStorageKind_Export)
{
mDirectives += " ";
mDirectives.Append("/EXPORT:");
mDirectives.Append(globalVar->mName);
}
}
for (int i = 0; i < mTLSSect.mSizeOverride; i++)

View file

@ -691,6 +691,7 @@ void BeIRCodeGen::Read(BeValue*& beValue)
globalVariable->mIsTLS = isTLS;
globalVariable->mAlign = varType->mAlign;
globalVariable->mUnnamedAddr = false;
globalVariable->mStorageKind = BfIRStorageKind_Normal;
if (initializer != NULL)
BF_ASSERT(varType->mAlign > 0);
@ -1782,6 +1783,7 @@ void BeIRCodeGen::HandleNextCmd()
globalVariable->mName = name;
globalVariable->mIsTLS = isTLS;
globalVariable->mUnnamedAddr = false;
globalVariable->mStorageKind = BfIRStorageKind_Normal;
if (initializer != NULL)
{
globalVariable->mAlign = varType->mAlign;
@ -1838,6 +1840,17 @@ void BeIRCodeGen::HandleNextCmd()
}
}
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:
{
CMD_PARAM(String, str);

View file

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

View file

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

View file

@ -385,6 +385,7 @@ public:
BfTypeDef* mInlineAttributeTypeDef;
BfTypeDef* mCLinkAttributeTypeDef;
BfTypeDef* mImportAttributeTypeDef;
BfTypeDef* mExportAttributeTypeDef;
BfTypeDef* mCReprAttributeTypeDef;
BfTypeDef* mUnderlyingArrayAttributeTypeDef;
BfTypeDef* mAlignAttributeTypeDef;
@ -406,7 +407,6 @@ public:
BfTypeDef* mIgnoreErrorsAttributeTypeDef;
BfTypeDef* mReflectAttributeTypeDef;
int mCurTypeId;
int mTypeInitCount;
String mOutputPath;

View file

@ -4395,6 +4395,12 @@ void BfIRBuilder::GlobalVar_SetAlignment(BfIRValue globalVar, int alignment)
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 retVal = WriteCmd(BfIRCmd_GlobalStringPtr, str);

View file

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

View file

@ -2199,6 +2199,13 @@ void BfIRCodeGen::HandleNextCmd()
((llvm::GlobalVariable*)val)->setAlignment(alignment);
}
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:
{
CMD_PARAM(String, str);

View file

@ -3508,7 +3508,13 @@ void BfModule::CreateStaticField(BfFieldInstance* fieldInstance, bool isThreadLo
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);
if (fieldInstance->mOwner->IsUnspecializedType())
@ -3532,6 +3538,8 @@ void BfModule::CreateStaticField(BfFieldInstance* fieldInstance, bool isThreadLo
staticVarName,
isThreadLocal);
mBfIRBuilder->GlobalVar_SetAlignment(globalVar, fieldType->mAlign);
if (storageKind != BfIRStorageKind_Normal)
mBfIRBuilder->GlobalVar_SetStorageKind(globalVar, storageKind);
BF_ASSERT(globalVar);
mStaticFieldRefs[fieldInstance] = globalVar;