diff options
author | Tim Northover <t.p.northover@gmail.com> | 2020-12-17 13:29:40 +0000 |
---|---|---|
committer | Tim Northover <t.p.northover@gmail.com> | 2020-12-18 18:58:22 +0000 |
commit | 36e0c08ed8ac0ab51608baaaad625266e603c11f (patch) | |
tree | 1c7df10fc7559db0d35a2a76bcf930d0b0a0a057 | |
parent | bdc0a1d6fda17a527fad86d5af7e49b4c0a9ad60 (diff) | |
download | llvm-cherry-pick-something.tar.gz |
Swift support: add __attribute__((swift_async_context)) to args.cherry-pick-something
This translates to "swiftasync" LLVM attribute.
-rw-r--r-- | clang/include/clang/AST/Attr.h | 2 | ||||
-rw-r--r-- | clang/include/clang/Basic/Attr.td | 5 | ||||
-rw-r--r-- | clang/include/clang/Basic/AttrDocs.td | 13 | ||||
-rw-r--r-- | clang/include/clang/Basic/Specifiers.h | 7 | ||||
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 1 | ||||
-rw-r--r-- | clang/lib/AST/TypePrinter.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGCall.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 11 | ||||
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGen/arm-swiftcall.c | 4 | ||||
-rw-r--r-- | clang/test/Misc/pragma-attribute-supported-attributes-list.test | 1 | ||||
-rw-r--r-- | clang/test/Sema/attr-swiftcall.c | 6 |
12 files changed, 59 insertions, 1 deletions
diff --git a/clang/include/clang/AST/Attr.h b/clang/include/clang/AST/Attr.h index ef578d6195dd..7795b4fd588c 100644 --- a/clang/include/clang/AST/Attr.h +++ b/clang/include/clang/AST/Attr.h @@ -194,6 +194,8 @@ public: switch (getKind()) { case attr::SwiftContext: return ParameterABI::SwiftContext; + case attr::SwiftAsyncContext: + return ParameterABI::SwiftAsyncContext; case attr::SwiftErrorResult: return ParameterABI::SwiftErrorResult; case attr::SwiftIndirectResult: diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 2e5e33c26af3..8b5ffa32798a 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -2332,6 +2332,11 @@ def SwiftContext : ParameterABIAttr { let Documentation = [SwiftContextDocs]; } +def SwiftAsyncContext : ParameterABIAttr { + let Spellings = [Clang<"swift_async_context">]; + let Documentation = [SwiftAsyncContextDocs]; +} + def SwiftErrorResult : ParameterABIAttr { let Spellings = [Clang<"swift_error_result">]; let Documentation = [SwiftErrorResultDocs]; diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index 9bc3ca287f3b..2b34ddbea5a9 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -4092,6 +4092,19 @@ A context parameter must have pointer or reference type. }]; } +def SwiftAsyncContextDocs : Documentation { + let Category = DocCatVariable; + let Content = [{ +The ``swift_async_context`` attribute marks a parameter as having the +special asynchronous context-parameter ABI treatment. + +This treatment generally passes the context value in a special register +which is normally callee-preserved. + +A context parameter must have pointer or reference type. + }]; +} + def SwiftErrorResultDocs : Documentation { let Category = DocCatVariable; let Content = [{ diff --git a/clang/include/clang/Basic/Specifiers.h b/clang/include/clang/Basic/Specifiers.h index fdd21f8d0a84..cfd0ded2e810 100644 --- a/clang/include/clang/Basic/Specifiers.h +++ b/clang/include/clang/Basic/Specifiers.h @@ -361,7 +361,12 @@ namespace clang { /// This parameter (which must have pointer type) uses the special /// Swift context-pointer ABI treatment. There can be at /// most one parameter on a given function that uses this treatment. - SwiftContext + SwiftContext, + + /// This parameter (which must have pointer type) uses the special + /// Swift asynchronous context-pointer ABI treatment. There can be at + /// most one parameter on a given function that uses this treatment. + SwiftAsyncContext, }; /// Assigned inheritance model for a class in the MS C++ ABI. Must match order diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index cea45d07714a..1495be236d86 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -2912,6 +2912,7 @@ CXXNameMangler::mangleExtParameterInfo(FunctionProtoType::ExtParameterInfo PI) { // All of these start with "swift", so they come before "ns_consumed". case ParameterABI::SwiftContext: + case ParameterABI::SwiftAsyncContext: case ParameterABI::SwiftErrorResult: case ParameterABI::SwiftIndirectResult: mangleVendorQualifier(getParameterABISpelling(PI.getABI())); diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp index a7c3f9b28317..8a07cde1c463 100644 --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -807,6 +807,8 @@ StringRef clang::getParameterABISpelling(ParameterABI ABI) { llvm_unreachable("asking for spelling of ordinary parameter ABI"); case ParameterABI::SwiftContext: return "swift_context"; + case ParameterABI::SwiftAsyncContext: + return "swift_async_context"; case ParameterABI::SwiftErrorResult: return "swift_error_result"; case ParameterABI::SwiftIndirectResult: diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index c66c39fc43a5..141ca34733b6 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -2283,6 +2283,10 @@ void CodeGenModule::ConstructAttributeList( case ParameterABI::SwiftContext: Attrs.addAttribute(llvm::Attribute::SwiftSelf); break; + + case ParameterABI::SwiftAsyncContext: + Attrs.addAttribute(llvm::Attribute::SwiftAsync); + break; } if (FI.getExtParameterInfo(ArgNo).isNoEscape()) diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index ae68bc70f6ba..a1627fd53a69 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -4795,6 +4795,14 @@ void Sema::AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, D->addAttr(::new (Context) SwiftContextAttr(Context, CI)); return; + case ParameterABI::SwiftAsyncContext: + if (!isValidSwiftContextType(type)) { + Diag(CI.getLoc(), diag::err_swift_abi_parameter_wrong_type) + << getParameterABISpelling(abi) << /*pointer to pointer */ 0 << type; + } + D->addAttr(::new (Context) SwiftAsyncContextAttr(Context, CI)); + return; + case ParameterABI::SwiftErrorResult: if (!isValidSwiftErrorResultType(type)) { Diag(CI.getLoc(), diag::err_swift_abi_parameter_wrong_type) @@ -7838,6 +7846,9 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, case ParsedAttr::AT_SwiftContext: S.AddParameterABIAttr(D, AL, ParameterABI::SwiftContext); break; + case ParsedAttr::AT_SwiftAsyncContext: + S.AddParameterABIAttr(D, AL, ParameterABI::SwiftAsyncContext); + break; case ParsedAttr::AT_SwiftErrorResult: S.AddParameterABIAttr(D, AL, ParameterABI::SwiftErrorResult); break; diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 7cef0aefb881..cf67f9844d11 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -2716,6 +2716,10 @@ static void checkExtParameterInfos(Sema &S, ArrayRef<QualType> paramTypes, checkForSwiftCC(paramIndex); continue; + case ParameterABI::SwiftAsyncContext: + // FIXME: might want to require swiftasynccc when it exists + continue; + // swift_error parameters must be preceded by a swift_context parameter. case ParameterABI::SwiftErrorResult: checkForSwiftCC(paramIndex); diff --git a/clang/test/CodeGen/arm-swiftcall.c b/clang/test/CodeGen/arm-swiftcall.c index 45f313d8250f..fc8012130ac1 100644 --- a/clang/test/CodeGen/arm-swiftcall.c +++ b/clang/test/CodeGen/arm-swiftcall.c @@ -6,6 +6,7 @@ #define OUT __attribute__((swift_indirect_result)) #define ERROR __attribute__((swift_error_result)) #define CONTEXT __attribute__((swift_context)) +#define ASYNC_CONTEXT __attribute__((swift_async_context)) /*****************************************************************************/ /****************************** PARAMETER ABIS *******************************/ @@ -53,6 +54,9 @@ void test_context_error_1() { SWIFTCALL void context_error_2(short s, CONTEXT int *self, ERROR float **error) {} // CHECK-LABEL: define {{.*}} void @context_error_2(i16{{.*}}, i32* swiftself{{.*}}, float** swifterror %0) +SWIFTCALL void async_context_1(ASYNC_CONTEXT void *self) {} +// CHECK-LABEL: define {{.*}} void @async_context_1(i8* swiftasync + /*****************************************************************************/ /********************************** LOWERING *********************************/ /*****************************************************************************/ diff --git a/clang/test/Misc/pragma-attribute-supported-attributes-list.test b/clang/test/Misc/pragma-attribute-supported-attributes-list.test index 68cc1d2bcd7e..e1327e3b6cab 100644 --- a/clang/test/Misc/pragma-attribute-supported-attributes-list.test +++ b/clang/test/Misc/pragma-attribute-supported-attributes-list.test @@ -147,6 +147,7 @@ // CHECK-NEXT: SetTypestate (SubjectMatchRule_function_is_member) // CHECK-NEXT: SpeculativeLoadHardening (SubjectMatchRule_function, SubjectMatchRule_objc_method) // CHECK-NEXT: SwiftAsync (SubjectMatchRule_function, SubjectMatchRule_objc_method) +// CHECK-NEXT: SwiftAsyncContext (SubjectMatchRule_variable_is_parameter) // CHECK-NEXT: SwiftAsyncName (SubjectMatchRule_objc_method, SubjectMatchRule_function) // CHECK-NEXT: SwiftBridgedTypedef (SubjectMatchRule_type_alias) // CHECK-NEXT: SwiftContext (SubjectMatchRule_variable_is_parameter) diff --git a/clang/test/Sema/attr-swiftcall.c b/clang/test/Sema/attr-swiftcall.c index 0323f059bab5..b2c8f6dd1899 100644 --- a/clang/test/Sema/attr-swiftcall.c +++ b/clang/test/Sema/attr-swiftcall.c @@ -5,6 +5,7 @@ #define INDIRECT_RESULT __attribute__((swift_indirect_result)) #define ERROR_RESULT __attribute__((swift_error_result)) #define CONTEXT __attribute__((swift_context)) +#define ASYNC_CONTEXT __attribute__((swift_async_context)) int notAFunction SWIFTCALL; // expected-warning {{'swiftcall' only applies to function types; type here is 'int'}} void variadic(int x, ...) SWIFTCALL; // expected-error {{variadic function cannot use swiftcall calling convention}} @@ -29,3 +30,8 @@ void context_nonswift(CONTEXT void *context); // expected-error {{'swift_context void context_bad_type(CONTEXT int context) SWIFTCALL; // expected-error {{'swift_context' parameter must have pointer type; type here is 'int'}} void context_okay(CONTEXT void *context) SWIFTCALL; void context_okay2(CONTEXT void *context, void *selfType, char **selfWitnessTable) SWIFTCALL; + +void async_context_okay_for_now(ASYNC_CONTEXT void *context); +void async_context_bad_type(ASYNC_CONTEXT int context) SWIFTCALL; // expected-error {{'swift_async_context' parameter must have pointer type; type here is 'int'}} +void async_context_okay(ASYNC_CONTEXT void *context) SWIFTCALL; +void async_context_okay2(ASYNC_CONTEXT void *context, void *selfType, char **selfWitnessTable) SWIFTCALL; |