@@ -5951,8 +5951,9 @@ llvm::GlobalVariable *CGObjCNonFragileABIMac::BuildClassMetaData(
5951
5951
GV->setSection (" __DATA, __objc_data" );
5952
5952
GV->setAlignment (
5953
5953
CGM.getDataLayout ().getABITypeAlignment (ObjCTypes.ClassnfABITy ));
5954
- if (HiddenVisibility)
5955
- GV->setVisibility (llvm::GlobalValue::HiddenVisibility);
5954
+ if (!CGM.getTriple ().isOSBinFormatCOFF ())
5955
+ if (HiddenVisibility)
5956
+ GV->setVisibility (llvm::GlobalValue::HiddenVisibility);
5956
5957
return GV;
5957
5958
}
5958
5959
@@ -5977,18 +5978,42 @@ void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCImplementationDecl *OID,
5977
5978
InstanceStart = RL.getFieldOffset (0 ) / CGM.getContext ().getCharWidth ();
5978
5979
}
5979
5980
5981
+ static llvm::GlobalValue::DLLStorageClassTypes getStorage (CodeGenModule &CGM,
5982
+ StringRef Name) {
5983
+ IdentifierInfo &II = CGM.getContext ().Idents .get (Name);
5984
+ TranslationUnitDecl *TUDecl = CGM.getContext ().getTranslationUnitDecl ();
5985
+ DeclContext *DC = TranslationUnitDecl::castToDeclContext (TUDecl);
5986
+
5987
+ const VarDecl *VD = nullptr ;
5988
+ for (const auto &Result : DC->lookup (&II))
5989
+ if ((VD = dyn_cast<VarDecl>(Result)))
5990
+ break ;
5991
+
5992
+ if (!VD)
5993
+ return llvm::GlobalValue::DLLImportStorageClass;
5994
+ if (VD->hasAttr <DLLExportAttr>())
5995
+ return llvm::GlobalValue::DLLExportStorageClass;
5996
+ if (VD->hasAttr <DLLImportAttr>())
5997
+ return llvm::GlobalValue::DLLImportStorageClass;
5998
+ return llvm::GlobalValue::DefaultStorageClass;
5999
+ }
6000
+
5980
6001
void CGObjCNonFragileABIMac::GenerateClass (const ObjCImplementationDecl *ID) {
5981
6002
if (!ObjCEmptyCacheVar) {
5982
- ObjCEmptyCacheVar = new llvm::GlobalVariable (
5983
- CGM.getModule (), ObjCTypes.CacheTy , false ,
5984
- llvm::GlobalValue::ExternalLinkage, nullptr , " _objc_empty_cache" );
6003
+ ObjCEmptyCacheVar =
6004
+ new llvm::GlobalVariable (CGM.getModule (), ObjCTypes.CacheTy , false ,
6005
+ llvm::GlobalValue::ExternalLinkage, nullptr ,
6006
+ " _objc_empty_cache" );
6007
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
6008
+ ObjCEmptyCacheVar->setDLLStorageClass (getStorage (CGM, " _objc_empty_cache" ));
5985
6009
5986
6010
// Only OS X with deployment version <10.9 use the empty vtable symbol
5987
6011
const llvm::Triple &Triple = CGM.getTarget ().getTriple ();
5988
6012
if (Triple.isMacOSX () && Triple.isMacOSXVersionLT (10 , 9 ))
5989
- ObjCEmptyVtableVar = new llvm::GlobalVariable (
5990
- CGM.getModule (), ObjCTypes.ImpnfABITy , false ,
5991
- llvm::GlobalValue::ExternalLinkage, nullptr , " _objc_empty_vtable" );
6013
+ ObjCEmptyVtableVar =
6014
+ new llvm::GlobalVariable (CGM.getModule (), ObjCTypes.ImpnfABITy , false ,
6015
+ llvm::GlobalValue::ExternalLinkage, nullptr ,
6016
+ " _objc_empty_vtable" );
5992
6017
}
5993
6018
5994
6019
// FIXME: Is this correct (that meta class size is never computed)?
@@ -6004,7 +6029,9 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6004
6029
assert (CI && " CGObjCNonFragileABIMac::GenerateClass - class is 0" );
6005
6030
6006
6031
// Build the flags for the metaclass.
6007
- bool classIsHidden = CI->getVisibility () == HiddenVisibility;
6032
+ bool classIsHidden = (CGM.getTriple ().isOSBinFormatCOFF ())
6033
+ ? !CI->hasAttr <DLLExportAttr>()
6034
+ : CI->getVisibility () == HiddenVisibility;
6008
6035
if (classIsHidden)
6009
6036
flags |= NonFragileABI_Class_Hidden;
6010
6037
@@ -6013,7 +6040,7 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6013
6040
if (ID->hasNonZeroConstructors () || ID->hasDestructors ()) {
6014
6041
flags |= NonFragileABI_Class_HasCXXStructors;
6015
6042
if (!ID->hasNonZeroConstructors ())
6016
- flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6043
+ flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6017
6044
}
6018
6045
6019
6046
if (!CI->getSuperClass ()) {
@@ -6022,9 +6049,15 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6022
6049
6023
6050
SuperClassGV = GetClassGlobal ((getClassSymbolPrefix () + ClassName).str (),
6024
6051
CI->isWeakImported ());
6052
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
6053
+ if (CI->hasAttr <DLLImportAttr>())
6054
+ SuperClassGV->setDLLStorageClass (llvm::GlobalValue::DLLImportStorageClass);
6025
6055
6026
6056
IsAGV = GetClassGlobal ((getMetaclassSymbolPrefix () + ClassName).str (),
6027
6057
CI->isWeakImported ());
6058
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
6059
+ if (CI->hasAttr <DLLImportAttr>())
6060
+ IsAGV->setDLLStorageClass (llvm::GlobalValue::DLLImportStorageClass);
6028
6061
} else {
6029
6062
// Has a root. Current class is not a root.
6030
6063
const ObjCInterfaceDecl *Root = ID->getClassInterface ();
@@ -6037,11 +6070,17 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6037
6070
6038
6071
IsAGV = GetClassGlobal ((getMetaclassSymbolPrefix () + RootClassName).str (),
6039
6072
Root->isWeakImported ());
6073
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
6074
+ if (Root->hasAttr <DLLImportAttr>())
6075
+ IsAGV->setDLLStorageClass (llvm::GlobalValue::DLLImportStorageClass);
6040
6076
6041
6077
// work on super class metadata symbol.
6042
6078
SuperClassGV =
6043
6079
GetClassGlobal ((getMetaclassSymbolPrefix () + SuperClassName).str (),
6044
6080
Super->isWeakImported ());
6081
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
6082
+ if (Super->hasAttr <DLLImportAttr>())
6083
+ SuperClassGV->setDLLStorageClass (llvm::GlobalValue::DLLImportStorageClass);
6045
6084
}
6046
6085
6047
6086
llvm::GlobalVariable *CLASS_RO_GV =
@@ -6051,6 +6090,9 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6051
6090
BuildClassMetaData ((getMetaclassSymbolPrefix () + ClassName).str (), IsAGV,
6052
6091
SuperClassGV, CLASS_RO_GV, classIsHidden,
6053
6092
CI->isWeakImported ());
6093
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
6094
+ if (CI->hasAttr <DLLExportAttr>())
6095
+ MetaTClass->setDLLStorageClass (llvm::GlobalValue::DLLExportStorageClass);
6054
6096
DefinedMetaClasses.push_back (MetaTClass);
6055
6097
6056
6098
// Metadata for the class
@@ -6085,6 +6127,9 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6085
6127
SuperClassGV =
6086
6128
GetClassGlobal ((getClassSymbolPrefix () + SuperClassName).str (),
6087
6129
Super->isWeakImported ());
6130
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
6131
+ if (Super->hasAttr <DLLImportAttr>())
6132
+ SuperClassGV->setDLLStorageClass (llvm::GlobalValue::DLLImportStorageClass);
6088
6133
}
6089
6134
6090
6135
GetClassSizeInfo (ID, InstanceStart, InstanceSize);
@@ -6095,6 +6140,9 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6095
6140
BuildClassMetaData ((getClassSymbolPrefix () + ClassName).str (), MetaTClass,
6096
6141
SuperClassGV, CLASS_RO_GV, classIsHidden,
6097
6142
CI->isWeakImported ());
6143
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
6144
+ if (CI->hasAttr <DLLExportAttr>())
6145
+ ClassMD->setDLLStorageClass (llvm::GlobalValue::DLLExportStorageClass);
6098
6146
DefinedClasses.push_back (ClassMD);
6099
6147
ImplementedClasses.push_back (CI);
6100
6148
@@ -6312,18 +6360,28 @@ CGObjCNonFragileABIMac::EmitMethodList(Twine Name, StringRef Section,
6312
6360
llvm::GlobalVariable *
6313
6361
CGObjCNonFragileABIMac::ObjCIvarOffsetVariable (const ObjCInterfaceDecl *ID,
6314
6362
const ObjCIvarDecl *Ivar) {
6315
-
6316
6363
const ObjCInterfaceDecl *Container = Ivar->getContainingInterface ();
6317
6364
llvm::SmallString<64 > Name (" OBJC_IVAR_$_" );
6318
6365
Name += Container->getObjCRuntimeNameAsString ();
6319
6366
Name += " ." ;
6320
6367
Name += Ivar->getName ();
6321
- llvm::GlobalVariable *IvarOffsetGV =
6322
- CGM.getModule ().getGlobalVariable (Name);
6323
- if (!IvarOffsetGV)
6324
- IvarOffsetGV = new llvm::GlobalVariable (
6325
- CGM.getModule (), ObjCTypes.IvarOffsetVarTy , false ,
6326
- llvm::GlobalValue::ExternalLinkage, nullptr , Name.str ());
6368
+ llvm::GlobalVariable *IvarOffsetGV = CGM.getModule ().getGlobalVariable (Name);
6369
+ if (!IvarOffsetGV) {
6370
+ IvarOffsetGV =
6371
+ new llvm::GlobalVariable (CGM.getModule (), ObjCTypes.IvarOffsetVarTy ,
6372
+ false , llvm::GlobalValue::ExternalLinkage,
6373
+ nullptr , Name.str ());
6374
+ if (CGM.getTriple ().isOSBinFormatCOFF ()) {
6375
+ bool IsPrivateOrPackage =
6376
+ Ivar->getAccessControl () == ObjCIvarDecl::Private ||
6377
+ Ivar->getAccessControl () == ObjCIvarDecl::Package;
6378
+
6379
+ if (ID->hasAttr <DLLExportAttr>() && !IsPrivateOrPackage)
6380
+ IvarOffsetGV->setDLLStorageClass (llvm::GlobalValue::DLLExportStorageClass);
6381
+ else if (ID->hasAttr <DLLImportAttr>())
6382
+ IvarOffsetGV->setDLLStorageClass (llvm::GlobalValue::DLLImportStorageClass);
6383
+ }
6384
+ }
6327
6385
return IvarOffsetGV;
6328
6386
}
6329
6387
@@ -6337,14 +6395,17 @@ CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
6337
6395
IvarOffsetGV->setAlignment (
6338
6396
CGM.getDataLayout ().getABITypeAlignment (ObjCTypes.IvarOffsetVarTy ));
6339
6397
6340
- // FIXME: This matches gcc, but shouldn't the visibility be set on the use as
6341
- // well (i.e., in ObjCIvarOffsetVariable).
6342
- if (Ivar->getAccessControl () == ObjCIvarDecl::Private ||
6343
- Ivar->getAccessControl () == ObjCIvarDecl::Package ||
6344
- ID->getVisibility () == HiddenVisibility)
6345
- IvarOffsetGV->setVisibility (llvm::GlobalValue::HiddenVisibility);
6346
- else
6347
- IvarOffsetGV->setVisibility (llvm::GlobalValue::DefaultVisibility);
6398
+ if (!CGM.getTriple ().isOSBinFormatCOFF ()) {
6399
+ // FIXME: This matches gcc, but shouldn't the visibility be set on the use
6400
+ // as well (i.e., in ObjCIvarOffsetVariable).
6401
+ if (Ivar->getAccessControl () == ObjCIvarDecl::Private ||
6402
+ Ivar->getAccessControl () == ObjCIvarDecl::Package ||
6403
+ ID->getVisibility () == HiddenVisibility)
6404
+ IvarOffsetGV->setVisibility (llvm::GlobalValue::HiddenVisibility);
6405
+ else
6406
+ IvarOffsetGV->setVisibility (llvm::GlobalValue::DefaultVisibility);
6407
+ }
6408
+
6348
6409
IvarOffsetGV->setSection (" __DATA, __objc_ivar" );
6349
6410
return IvarOffsetGV;
6350
6411
}
@@ -7179,11 +7240,14 @@ CGObjCNonFragileABIMac::GetEHType(QualType T) {
7179
7240
// There's a particular fixed type info for 'id'.
7180
7241
if (T->isObjCIdType () || T->isObjCQualifiedIdType ()) {
7181
7242
auto *IDEHType = CGM.getModule ().getGlobalVariable (" OBJC_EHTYPE_id" );
7182
- if (!IDEHType)
7243
+ if (!IDEHType) {
7183
7244
IDEHType =
7184
7245
new llvm::GlobalVariable (CGM.getModule (), ObjCTypes.EHTypeTy , false ,
7185
7246
llvm::GlobalValue::ExternalLinkage, nullptr ,
7186
7247
" OBJC_EHTYPE_id" );
7248
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
7249
+ IDEHType->setDLLStorageClass (getStorage (CGM, " OBJC_EHTYPE_id" ));
7250
+ }
7187
7251
return IDEHType;
7188
7252
}
7189
7253
@@ -7238,23 +7302,34 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
7238
7302
7239
7303
// If this type (or a super class) has the __objc_exception__
7240
7304
// attribute, emit an external reference.
7241
- if (hasObjCExceptionAttribute (CGM.getContext (), ID))
7242
- return Entry =
7243
- new llvm::GlobalVariable (CGM.getModule (), ObjCTypes.EHTypeTy , false ,
7244
- llvm::GlobalValue::ExternalLinkage, nullptr ,
7245
- " OBJC_EHTYPE_$_" + ClassName);
7305
+ if (hasObjCExceptionAttribute (CGM.getContext (), ID)) {
7306
+ std::string EHTypeName = (" OBJC_EHTYPE_$_" + ClassName).str ();
7307
+ Entry = new llvm::GlobalVariable (CGM.getModule (), ObjCTypes.EHTypeTy ,
7308
+ false , llvm::GlobalValue::ExternalLinkage,
7309
+ nullptr , EHTypeName);
7310
+ if (CGM.getTriple ().isOSBinFormatCOFF ()) {
7311
+ if (ID->hasAttr <DLLExportAttr>())
7312
+ Entry->setDLLStorageClass (llvm::GlobalValue::DLLExportStorageClass);
7313
+ else if (ID->hasAttr <DLLImportAttr>())
7314
+ Entry->setDLLStorageClass (llvm::GlobalValue::DLLImportStorageClass);
7315
+ }
7316
+ return Entry;
7317
+ }
7246
7318
}
7247
7319
7248
7320
// Otherwise we need to either make a new entry or fill in the initializer.
7249
7321
assert ((!Entry || !Entry->hasInitializer ()) && " Duplicate EHType definition" );
7250
7322
7251
7323
std::string VTableName = " objc_ehtype_vtable" ;
7252
7324
auto *VTableGV = CGM.getModule ().getGlobalVariable (VTableName);
7253
- if (!VTableGV)
7325
+ if (!VTableGV) {
7254
7326
VTableGV =
7255
7327
new llvm::GlobalVariable (CGM.getModule (), ObjCTypes.Int8PtrTy , false ,
7256
7328
llvm::GlobalValue::ExternalLinkage, nullptr ,
7257
7329
VTableName);
7330
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
7331
+ VTableGV->setDLLStorageClass (getStorage (CGM, VTableName));
7332
+ }
7258
7333
7259
7334
llvm::Value *VTableIdx = llvm::ConstantInt::get (CGM.Int32Ty , 2 );
7260
7335
llvm::Constant *Values[] = {
@@ -7274,11 +7349,16 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
7274
7349
Entry =
7275
7350
new llvm::GlobalVariable (CGM.getModule (), ObjCTypes.EHTypeTy , false , L,
7276
7351
Init, (" OBJC_EHTYPE_$_" + ClassName).str ());
7352
+ if (CGM.getTriple ().isOSBinFormatCOFF ())
7353
+ if (hasObjCExceptionAttribute (CGM.getContext (), ID))
7354
+ if (ID->hasAttr <DLLExportAttr>())
7355
+ Entry->setDLLStorageClass (llvm::GlobalValue::DLLExportStorageClass);
7277
7356
}
7278
7357
assert (Entry->getLinkage () == L);
7279
7358
7280
- if (ID->getVisibility () == HiddenVisibility)
7281
- Entry->setVisibility (llvm::GlobalValue::HiddenVisibility);
7359
+ if (!CGM.getTriple ().isOSBinFormatCOFF ())
7360
+ if (ID->getVisibility () == HiddenVisibility)
7361
+ Entry->setVisibility (llvm::GlobalValue::HiddenVisibility);
7282
7362
7283
7363
const auto &DL = CGM.getDataLayout ();
7284
7364
Entry->setAlignment (DL.getABITypeAlignment (ObjCTypes.EHTypeTy ));
0 commit comments