Skip to content

Commit

Permalink
[MinGW] Automatically mangle Windows-specific entry points as C
Browse files Browse the repository at this point in the history
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.

Differential Revision: https://reviews.llvm.org/D49354

llvm-svn: 337146
  • Loading branch information
mstorsjo committed Jul 16, 2018
1 parent bc46bca commit 92e2661
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
12 changes: 12 additions & 0 deletions clang/lib/AST/ItaniumMangle.cpp
Expand Up @@ -592,6 +592,18 @@ bool ItaniumMangleContextImpl::shouldMangleCXXName(const NamedDecl *D) {
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)
Expand Down
19 changes: 19 additions & 0 deletions clang/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

0 comments on commit 92e2661

Please sign in to comment.