From fc86d09f59d528e57ae3a8c40c20d076e1f03bdc Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Tue, 8 Jan 2019 13:37:39 -0800 Subject: [PATCH] IRGen: apply IR linkage to trivial property descriptors This ensures that the trivial property descriptors is externally accessible on targets like Windows which does not export symbols by default. Thanks to Joe Groff for the pointer about the global aliases for trivial property descriptors! --- lib/IRGen/GenKeyPath.cpp | 12 ++++++++---- test/IRGen/trivial-property-descriptors.swift | 10 ++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 test/IRGen/trivial-property-descriptors.swift diff --git a/lib/IRGen/GenKeyPath.cpp b/lib/IRGen/GenKeyPath.cpp index 851528cc872..40e7a720cfd 100644 --- a/lib/IRGen/GenKeyPath.cpp +++ b/lib/IRGen/GenKeyPath.cpp @@ -1269,14 +1269,18 @@ void IRGenModule::emitSILProperty(SILProperty *prop) { var->setConstant(true); var->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); var->setAlignment(4); - + TheTrivialPropertyDescriptor = var; } else { auto entity = LinkEntity::forPropertyDescriptor(prop->getDecl()); auto linkInfo = LinkInfo::get(*this, entity, ForDefinition); - llvm::GlobalAlias::create(linkInfo.getLinkage(), - linkInfo.getName(), - TheTrivialPropertyDescriptor); + auto *GA = llvm::GlobalAlias::create(linkInfo.getLinkage(), + linkInfo.getName(), + TheTrivialPropertyDescriptor); + ApplyIRLinkage({linkInfo.getLinkage(), + linkInfo.getVisibility(), + llvm::GlobalValue::DLLExportStorageClass}) + .to(GA); } return; } diff --git a/test/IRGen/trivial-property-descriptors.swift b/test/IRGen/trivial-property-descriptors.swift new file mode 100644 index 00000000000..931a36a17fc --- /dev/null +++ b/test/IRGen/trivial-property-descriptors.swift @@ -0,0 +1,10 @@ +// RUN: %swift -target x86_64-unknown-windows-msvc -parse-stdlib -module-name Swift -enable-resilience -S -emit-ir -o - %s | %FileCheck %s + +public struct S {} +extension S { + public var i: () { return () } + public var j: () { return () } +} + +// CHECK: @"$ss1SV1jytvpMV" = dllexport alias { i32 }, { i32 }* @"$ss1SV1iytvpMV" +