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:
parent
989f9e6019
commit
6878183873
9 changed files with 61 additions and 7 deletions
|
@ -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++)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue