Index: cfe/trunk/lib/AST/ItaniumMangle.cpp =================================================================== --- cfe/trunk/lib/AST/ItaniumMangle.cpp +++ cfe/trunk/lib/AST/ItaniumMangle.cpp @@ -592,6 +592,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) Index: cfe/trunk/test/CodeGenCXX/mangle-mingw.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/mangle-mingw.cpp +++ cfe/trunk/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