Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions include/swift/AST/DiagnosticsSIL.def
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,10 @@ ERROR(deserialize_function_type_mismatch,Fatal,
"type mismatch of function '%0', declared as %1 but used in a swift module as %2",
(StringRef, Type, Type))

ERROR(deserialize_function_linkage_mismatch,Fatal,
"linkage mismatch of function '%0', declared as %1 but expected as %2",
(StringRef, StringRef, StringRef))

ERROR(without_actually_escaping_on_isolated_any,none,
"withoutActuallyEscaping is currently unimplemented for '@isolated(any)' "
"function values", ())
Expand Down
3 changes: 3 additions & 0 deletions include/swift/SIL/SILLinkage.h
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,9 @@ inline bool fixmeWitnessHasLinkageThatNeedsToBePublic(SILDeclRef witness,
(!hasSharedVisibility(witnessLinkage) || !witness.isSerialized());
}

// Defined in SILPrinter
StringRef getLinkageString(SILLinkage linkage);

} // end swift namespace

#endif
24 changes: 12 additions & 12 deletions lib/SIL/IR/SILPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3505,18 +3505,18 @@ void SILFunction::dump(const char *FileName) const {
print(os);
}

static StringRef getLinkageString(SILLinkage linkage) {
StringRef swift::getLinkageString(SILLinkage linkage) {
switch (linkage) {
case SILLinkage::Public: return "public ";
case SILLinkage::PublicNonABI: return "non_abi ";
case SILLinkage::Package: return "package ";
case SILLinkage::PackageNonABI: return "package_non_abi ";
case SILLinkage::Hidden: return "hidden ";
case SILLinkage::Shared: return "shared ";
case SILLinkage::Private: return "private ";
case SILLinkage::PublicExternal: return "public_external ";
case SILLinkage::PackageExternal: return "package_external ";
case SILLinkage::HiddenExternal: return "hidden_external ";
case SILLinkage::Public: return "public";
case SILLinkage::PublicNonABI: return "non_abi";
case SILLinkage::Package: return "package";
case SILLinkage::PackageNonABI: return "package_non_abi";
case SILLinkage::Hidden: return "hidden";
case SILLinkage::Shared: return "shared";
case SILLinkage::Private: return "private";
case SILLinkage::PublicExternal: return "public_external";
case SILLinkage::PackageExternal: return "package_external";
case SILLinkage::HiddenExternal: return "hidden_external";
}
llvm_unreachable("bad linkage");
}
Expand All @@ -3527,7 +3527,7 @@ static void printLinkage(llvm::raw_ostream &OS, SILLinkage linkage,
(!isDefinition && linkage == SILLinkage::DefaultForDeclaration))
return;

OS << getLinkageString(linkage);
OS << getLinkageString(linkage) << ' ';
}


Expand Down
23 changes: 21 additions & 2 deletions lib/SILOptimizer/UtilityPasses/Link.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
//
//===----------------------------------------------------------------------===//

#include "swift/AST/DiagnosticsSIL.h"
#include "swift/AST/ProtocolConformance.h"
#include "swift/Demangling/Demangle.h"
#include "swift/SILOptimizer/PassManager/Passes.h"
#include "swift/SILOptimizer/PassManager/Transforms.h"
#include "swift/SIL/SILModule.h"
Expand Down Expand Up @@ -158,8 +160,25 @@ linkEmbeddedRuntimeFunctionByName(#NAME, EFFECT, StringRef(#CC) == "C_CC"); \
if (auto *Fn = M.lookUpFunction(name, byAsmName)) return Fn;

SILFunction *Fn =
M.getSILLoader()->lookupSILFunction(name, Linkage, byAsmName);
if (!Fn) return nullptr;
M.getSILLoader()->lookupSILFunction(name, Linkage,byAsmName);

if (!Fn) {
SILFunction *fnWithWrongLinkage =
M.getSILLoader()->lookupSILFunction(name, {}, byAsmName);

if (fnWithWrongLinkage) {
auto fnName = Demangle::demangleSymbolAsString(name,
Demangle::DemangleOptions::SimplifiedUIDemangleOptions());
auto &diags = getModule()->getASTContext().Diags;
diags.diagnose(fnWithWrongLinkage->getLocation().getSourceLoc(),
diag::deserialize_function_linkage_mismatch,
fnName, getLinkageString(fnWithWrongLinkage->getLinkage()),
getLinkageString(*Linkage));
diags.flushConsumers();
exit(1);
}
return nullptr;
}

if (M.linkFunction(Fn, LinkMode))
invalidateAnalysis(Fn, SILAnalysis::InvalidationKind::Everything);
Expand Down