[PATCH] [-cxx-abi microsoft] Mangle user defined entry points properly
David Majnemer
david.majnemer at gmail.com
Thu Sep 12 22:14:38 PDT 2013
Hi timurrrr, pcc, rnk, whunt,
Functions named "main", "wmain", "WinMain", "wWinMain", and "DllMain"
are never mangled regardless of linkage, even when compiling for kernel
mode.
Depends on D1655
http://llvm-reviews.chandlerc.com/D1670
Files:
lib/AST/MicrosoftMangle.cpp
test/CodeGenCXX/mangle-ms.cpp
Index: lib/AST/MicrosoftMangle.cpp
===================================================================
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -24,6 +24,7 @@
#include "clang/Basic/DiagnosticOptions.h"
#include "clang/Basic/TargetInfo.h"
#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/StringSwitch.h"
using namespace clang;
@@ -70,6 +71,22 @@
return fn;
}
+// Microsoft Visual C++ will never mangle some "standard" entry points
+// regardless of visibility or freestanding-ness.
+static bool isUserDefinedEntryPoint(const FunctionDecl *FD) {
+ if (!FD->getIdentifier())
+ return false;
+
+ return llvm::StringSwitch<bool>(FD->getName())
+ .Cases("main", // An ANSI console app
+ "wmain", // A Unicode console App
+ "WinMain", // An ANSI GUI app
+ "wWinMain", // A Unicode GUI app
+ "DllMain", // A DLL
+ true)
+ .Default(false);
+}
+
/// MicrosoftCXXNameMangler - Manage the mangling of a single name for the
/// Microsoft Visual C++ ABI.
class MicrosoftCXXNameMangler {
@@ -230,8 +247,7 @@
if (FD->hasAttr<OverloadableAttr>())
return true;
- // "main" is not mangled.
- if (FD->isMain())
+ if (isUserDefinedEntryPoint(FD))
return false;
// C++ functions and those whose names are not a simple identifier need
Index: test/CodeGenCXX/mangle-ms.cpp
===================================================================
--- test/CodeGenCXX/mangle-ms.cpp
+++ test/CodeGenCXX/mangle-ms.cpp
@@ -255,3 +255,28 @@
void call_extern_c_func() {
extern_c_func();
}
+
+int main() {
+}
+// CHECK-DAG: @main
+// X64-DAG: @main
+
+int wmain() {
+}
+// CHECK-DAG: @wmain
+// X64-DAG: @wmain
+
+int WinMain() {
+}
+// CHECK-DAG: @WinMain
+// X64-DAG: @WinMain
+
+int wWinMain() {
+}
+// CHECK-DAG: @wWinMain
+// X64-DAG: @wWinMain
+
+int DllMain() {
+}
+// CHECK-DAG: @DllMain
+// X64-DAG: @DllMain
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1670.1.patch
Type: text/x-patch
Size: 1963 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130912/63791fdb/attachment.bin>
More information about the cfe-commits
mailing list