[PATCH] D42768: AST: add an extension to support SwiftCC on MS ABI
Saleem Abdulrasool via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 31 22:02:14 PST 2018
compnerd updated this revision to Diff 132325.
compnerd added a comment.
Handle namespaces properly
Repository:
rC Clang
https://reviews.llvm.org/D42768
Files:
lib/AST/MicrosoftMangle.cpp
test/CodeGenCXX/msabi-swiftcall-cc.cpp
Index: test/CodeGenCXX/msabi-swiftcall-cc.cpp
===================================================================
--- /dev/null
+++ test/CodeGenCXX/msabi-swiftcall-cc.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -triple i686-unknown-windows-msvc -fdeclspec -emit-llvm %s -o - | FileCheck %s
+
+void __attribute__((__swiftcall__)) f() {}
+// CHECK-DAG: @"\01?f at __swift_cc@__Swift@@YAXXZ"
+
+void (__attribute__((__swiftcall__)) *p)();
+// CHECK-DAG: @"\01?p at __swift_cc@__Swift@@3P6AXXZA"
+
+namespace {
+void __attribute__((__swiftcall__)) __attribute__((__used__)) f() { }
+// CHECK-DAG: "\01?f@?A at __swift_cc@__Swift@@YAXXZ"
+}
+
+namespace __Swift { namespace __swift_cc {
+void __attribute__((__swiftcall__)) f() { }
+// CHECK-DAG: "\01?f at __swift_cc@__Swift at 12@YAXXZ"
+} }
+
+struct __declspec(dllexport) S {
+ S(const S &) = delete;
+ S & operator=(const S &) = delete;
+ void __attribute__((__swiftcall__)) m() { }
+ // CHECK-DAG: "\01?m at S@__swift_cc at __Swift@@QAAXXZ"
+};
Index: lib/AST/MicrosoftMangle.cpp
===================================================================
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -953,8 +953,17 @@
void MicrosoftCXXNameMangler::mangleNestedName(const NamedDecl *ND) {
// <postfix> ::= <unqualified-name> [<postfix>]
// ::= <substitution> [<postfix>]
- const DeclContext *DC = getEffectiveDeclContext(ND);
+ const Type *Ty = nullptr;
+
+ if (const auto *FD = dyn_cast<FunctionDecl>(ND))
+ Ty = FD->getType()->getAs<FunctionType>();
+
+ if (const auto *VD = dyn_cast<VarDecl>(ND))
+ if (VD->getType()->isPointerType())
+ Ty = VD->getType()->getPointeeType()->getAs<FunctionType>();
+
+ const DeclContext *DC = getEffectiveDeclContext(ND);
while (!DC->isTranslationUnit()) {
if (isa<TagDecl>(ND) || isa<VarDecl>(ND)) {
unsigned Disc;
@@ -1050,6 +1059,11 @@
}
DC = DC->getParent();
}
+
+ if (Ty)
+ if (Ty->getAs<FunctionType>()->getCallConv() == CC_Swift)
+ for (const char *NS : {"__swift_cc", "__Swift"})
+ mangleSourceName(NS);
}
void MicrosoftCXXNameMangler::mangleCXXDtorType(CXXDtorType T) {
@@ -1959,6 +1973,11 @@
mangleQualifiers(Quals, /*IsMember=*/false);
}
+ // We currently mangle the SwiftCC as `__Swift::__swift_cc` namespace on the
+ // decl in mangleNestedName.
+ if (CC == CC_Swift)
+ CC = CC_C;
+
mangleCallingConvention(CC);
// <return-type> ::= <type>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42768.132325.patch
Type: text/x-patch
Size: 2437 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180201/d9716242/attachment.bin>
More information about the cfe-commits
mailing list