diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2013-09-13 09:40:55 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2013-09-13 09:40:55 +0000 |
| commit | 9d0bb9d2ba0b5b0a66cb3188b1880e23049d95c6 (patch) | |
| tree | cac6edeaef9239507acfe47b024710c686f58ce5 | |
| parent | 015ed028cf6922059f3da337a7fbfeb874a51051 (diff) | |
| download | bcm5719-llvm-9d0bb9d2ba0b5b0a66cb3188b1880e23049d95c6.tar.gz bcm5719-llvm-9d0bb9d2ba0b5b0a66cb3188b1880e23049d95c6.zip | |
[-cxx-abi microsoft] Mangle user defined entry points properly
Summary:
Functions named "main", "wmain", "WinMain", "wWinMain", and "DllMain"
are never mangled regardless of linkage, even when compiling for kernel
mode.
Depends on D1655
Reviewers: timurrrr, pcc, rnk, whunt
CC: cfe-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D1670
llvm-svn: 190675
| -rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 27 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/mangle-ms.cpp | 20 |
2 files changed, 45 insertions, 2 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index e082759cb92..9cea06187e2 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/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,29 @@ static const FunctionDecl *getStructor(const FunctionDecl *fn) { return fn; } +// The 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. +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 +254,7 @@ bool MicrosoftMangleContext::shouldMangleDeclName(const NamedDecl *D) { 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 diff --git a/clang/test/CodeGenCXX/mangle-ms.cpp b/clang/test/CodeGenCXX/mangle-ms.cpp index e7450d8fb0f..8b7aa4223d9 100644 --- a/clang/test/CodeGenCXX/mangle-ms.cpp +++ b/clang/test/CodeGenCXX/mangle-ms.cpp @@ -255,3 +255,23 @@ extern "C" inline void extern_c_func() { void call_extern_c_func() { extern_c_func(); } + +int main() { return 0; } +// CHECK-DAG: @main +// X64-DAG: @main + +int wmain() { return 0; } +// CHECK-DAG: @wmain +// X64-DAG: @wmain + +int WinMain() { return 0; } +// CHECK-DAG: @WinMain +// X64-DAG: @WinMain + +int wWinMain() { return 0; } +// CHECK-DAG: @wWinMain +// X64-DAG: @wWinMain + +int DllMain() { return 0; } +// CHECK-DAG: @DllMain +// X64-DAG: @DllMain |

