4343#include " clang/AST/DeclObjC.h"
4444#include " clang/Basic/CharInfo.h"
4545#include " clang/Basic/SourceManager.h"
46+ #include " SwiftToClangInteropContext.h"
4647
4748using namespace swift ;
4849using namespace swift ::objc_translation;
@@ -937,6 +938,28 @@ class DeclAndTypePrinter::Implementation
937938 StringRef symbolName;
938939 };
939940
941+ // Converts the array of ABIAdditionalParam into an array of AdditionalParam
942+ void convertABIAdditionalParams (
943+ AbstractFunctionDecl *FD, Type resultTy,
944+ llvm::SmallVector<IRABIDetailsProvider::ABIAdditionalParam, 1 > ABIparams,
945+ llvm::SmallVector<DeclAndTypeClangFunctionPrinter::AdditionalParam, 2 >
946+ ¶ms) {
947+ for (auto param : ABIparams) {
948+ if (param.role ==
949+ IRABIDetailsProvider::ABIAdditionalParam::ABIParameterRole::Self)
950+ params.push_back (
951+ {DeclAndTypeClangFunctionPrinter::AdditionalParam::Role::Self,
952+ resultTy->getASTContext ().getOpaquePointerType (),
953+ /* isIndirect=*/
954+ isa<FuncDecl>(FD) ? cast<FuncDecl>(FD)->isMutating () : false });
955+ if (param.role ==
956+ IRABIDetailsProvider::ABIAdditionalParam::ABIParameterRole::Error)
957+ params.push_back (
958+ {DeclAndTypeClangFunctionPrinter::AdditionalParam::Role::Error,
959+ resultTy->getASTContext ().getOpaquePointerType ()});
960+ }
961+ }
962+
940963 // Print out the extern C Swift ABI function signature.
941964 FuncionSwiftABIInformation printSwiftABIFunctionSignatureAsCxxFunction (
942965 AbstractFunctionDecl *FD, Optional<FunctionType *> givenFuncType = None,
@@ -962,7 +985,9 @@ class DeclAndTypePrinter::Implementation
962985 DeclAndTypeClangFunctionPrinter funcPrinter (os, owningPrinter.prologueOS ,
963986 owningPrinter.typeMapping ,
964987 owningPrinter.interopContext );
965- llvm::SmallVector<DeclAndTypeClangFunctionPrinter::AdditionalParam, 1 >
988+ auto ABIparams = owningPrinter.interopContext .getIrABIDetails ()
989+ .getFunctionABIAdditionalParams (FD);
990+ llvm::SmallVector<DeclAndTypeClangFunctionPrinter::AdditionalParam, 2 >
966991 additionalParams;
967992 if (selfTypeDeclContext && !isa<ConstructorDecl>(FD)) {
968993 additionalParams.push_back (
@@ -971,14 +996,19 @@ class DeclAndTypePrinter::Implementation
971996 /* isIndirect=*/
972997 isa<FuncDecl>(FD) ? cast<FuncDecl>(FD)->isMutating () : false });
973998 }
999+ if (funcTy->isThrowing () && !ABIparams.empty ())
1000+ convertABIAdditionalParams (FD, resultTy, ABIparams, additionalParams);
1001+
9741002 funcPrinter.printFunctionSignature (
9751003 FD, funcABI.getSymbolName (), resultTy,
9761004 DeclAndTypeClangFunctionPrinter::FunctionSignatureKind::CFunctionProto,
9771005 additionalParams);
9781006 // Swift functions can't throw exceptions, we can only
9791007 // throw them from C++ when emitting C++ inline thunks for the Swift
9801008 // functions.
981- os << " SWIFT_NOEXCEPT" ;
1009+ // FIXME: Support throwing exceptions for Swift errors.
1010+ if (!funcTy->isThrowing ())
1011+ os << " SWIFT_NOEXCEPT" ;
9821012 if (!funcABI.useCCallingConvention ())
9831013 os << " SWIFT_CALL" ;
9841014 printAvailability (FD);
@@ -1013,16 +1043,25 @@ class DeclAndTypePrinter::Implementation
10131043 DeclAndTypeClangFunctionPrinter funcPrinter (os, owningPrinter.prologueOS ,
10141044 owningPrinter.typeMapping ,
10151045 owningPrinter.interopContext );
1046+ llvm::SmallVector<DeclAndTypeClangFunctionPrinter::AdditionalParam, 2 >
1047+ additionalParams;
1048+ auto ABIparams = owningPrinter.interopContext .getIrABIDetails ()
1049+ .getFunctionABIAdditionalParams (FD);
1050+ if (funcTy->isThrowing () && !ABIparams.empty ())
1051+ convertABIAdditionalParams (FD, resultTy, ABIparams, additionalParams);
1052+
10161053 funcPrinter.printFunctionSignature (
10171054 FD, FD->getName ().getBaseIdentifier ().get (), resultTy,
10181055 DeclAndTypeClangFunctionPrinter::FunctionSignatureKind::CxxInlineThunk);
10191056 // FIXME: Support throwing exceptions for Swift errors.
1020- os << " noexcept" ;
1057+ if (!funcTy->isThrowing ())
1058+ os << " noexcept" ;
10211059 printFunctionClangAttributes (FD, funcTy);
10221060 printAvailability (FD);
10231061 os << " {\n " ;
10241062 funcPrinter.printCxxThunkBody (funcABI.getSymbolName (), resultTy,
1025- FD->getParameters ());
1063+ FD->getParameters (), additionalParams,
1064+ funcTy->isThrowing ());
10261065 os << " }\n " ;
10271066 }
10281067
0 commit comments