[PATCH] D49354: [MinGW] Automatically mangle Windows-specific entry points as C

Martin Storsjö via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Jul 15 14:13:45 PDT 2018


mstorsjo created this revision.
mstorsjo added reviewers: majnemer, zturner, pcc, rnk, hans, compnerd, smeenai.

This mangles entry points wmain, WinMain, wWinMain or DllMain as C functions, to match the ABI for these functions.

We already did the same for these functions in MSVC mode, but we also should do the same in the Itanium ABI.

This fixes PR38124.


Repository:
  rC Clang

https://reviews.llvm.org/D49354

Files:
  lib/AST/ItaniumMangle.cpp
  test/CodeGenCXX/mangle-mingw.cpp


Index: test/CodeGenCXX/mangle-mingw.cpp
===================================================================
--- /dev/null
+++ test/CodeGenCXX/mangle-mingw.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-w64-mingw32 | FileCheck %s
+
+int func() { return 0; }
+// CHECK-DAG: @_Z4funcv
+
+int main() { return 0; }
+// CHECK-DAG: @main
+
+int wmain() { return 0; }
+// CHECK-DAG: @wmain
+
+int WinMain() { return 0; }
+// CHECK-DAG: @WinMain
+
+int wWinMain() { return 0; }
+// CHECK-DAG: @wWinMain
+
+int DllMain() { return 0; }
+// CHECK-DAG: @DllMain
Index: lib/AST/ItaniumMangle.cpp
===================================================================
--- lib/AST/ItaniumMangle.cpp
+++ lib/AST/ItaniumMangle.cpp
@@ -590,6 +590,18 @@
     if (FD->isMain())
       return false;
 
+    // The Windows ABI expects that we would never mangle "typical"
+    // user-defined entry points regardless of visibility or freestanding-ness.
+    //
+    // N.B. This is distinct from asking about "main".  "main" has a lot of
+    // special rules associated with it in the standard while these
+    // user-defined entry points are outside of the purview of the standard.
+    // For example, there can be only one definition for "main" in a standards
+    // compliant program; however nothing forbids the existence of wmain and
+    // WinMain in the same translation unit.
+    if (FD->isMSVCRTEntryPoint())
+      return false;
+
     // C++ functions and those whose names are not a simple identifier need
     // mangling.
     if (!FD->getDeclName().isIdentifier() || L == CXXLanguageLinkage)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49354.155598.patch
Type: text/x-patch
Size: 1615 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180715/aea4ead8/attachment.bin>


More information about the cfe-commits mailing list