@@ -278,9 +278,27 @@ llvm::Constant *irgen::emitConstantObject(IRGenModule &IGM, ObjectInst *OI,
278278 }
279279 }
280280 // Construct the object header.
281- llvm::Type *ObjectHeaderTy = sTy ->getElementType (0 );
282- assert (ObjectHeaderTy->isStructTy ());
283- elts[0 ] = llvm::Constant::getNullValue (ObjectHeaderTy);
281+ llvm::StructType *ObjectHeaderTy = cast<llvm::StructType>(sTy ->getElementType (0 ));
282+
283+ if (IGM.canMakeStaticObjectsReadOnly ()) {
284+ if (!IGM.swiftImmortalRefCount ) {
285+ auto *var = new llvm::GlobalVariable (IGM.Module , IGM.Int8Ty ,
286+ /* constant*/ true , llvm::GlobalValue::ExternalLinkage,
287+ /* initializer*/ nullptr , " _swiftImmortalRefCount" );
288+ IGM.swiftImmortalRefCount = var;
289+ }
290+ if (!IGM.swiftStaticArrayMetadata ) {
291+ auto *var = new llvm::GlobalVariable (IGM.Module , IGM.TypeMetadataStructTy ,
292+ /* constant*/ true , llvm::GlobalValue::ExternalLinkage,
293+ /* initializer*/ nullptr , " _swiftStaticArrayMetadata" );
294+ IGM.swiftStaticArrayMetadata = var;
295+ }
296+ elts[0 ] = llvm::ConstantStruct::get (ObjectHeaderTy, {
297+ IGM.swiftStaticArrayMetadata ,
298+ llvm::ConstantExpr::getPtrToInt (IGM.swiftImmortalRefCount , IGM.IntPtrTy )});
299+ } else {
300+ elts[0 ] = llvm::Constant::getNullValue (ObjectHeaderTy);
301+ }
284302 insertPadding (elts, sTy );
285303 return llvm::ConstantStruct::get (sTy , elts);
286304}
0 commit comments