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
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue