From: Charles Davis Date: Sat, 3 Jul 2010 02:41:45 +0000 (+0000) Subject: Fix mangling of array parameters for functions in the Microsoft C++ Mangler. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4f0a3376a5e5c9028b0c736ac935895aabdb5fcd;p=clang Fix mangling of array parameters for functions in the Microsoft C++ Mangler. Only actual functions get mangled correctly; I don't know how to fix it for function pointers yet. Thanks to John McCall for the hint. Also, mangle anonymous tag types. I don't have a suitable testcase yet; I have a feeling that that's going to need support for static locals, and I haven't figured out exactly how MSVC's scheme for mangling those works. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107561 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 1360d522ce..a8fd0b0c2d 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -69,7 +69,8 @@ private: #include "clang/AST/TypeNodes.def" void mangleType(const TagType*); - void mangleType(const FunctionType *T, bool IsStructor, bool IsInstMethod); + void mangleType(const FunctionType *T, const FunctionDecl *D, + bool IsStructor, bool IsInstMethod); void mangleType(const ArrayType *T, bool IsGlobal); void mangleExtraDimensions(QualType T); void mangleFunctionClass(const FunctionDecl *FD); @@ -218,7 +219,7 @@ void MicrosoftCXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) { // First, the function class. mangleFunctionClass(FD); - mangleType(FT, InStructor, InInstMethod); + mangleType(FT, FD, InStructor, InInstMethod); } void MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) { @@ -339,8 +340,9 @@ MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND, break; } - // TODO: How does VC mangle anonymous structs? - assert(false && "Don't know how to mangle anonymous types yet!"); + // When VC encounters an anonymous type with no tag and no typedef, + // it literally emits ''. + Out << ""; break; } @@ -756,13 +758,14 @@ void MicrosoftCXXNameMangler::mangleType(const FunctionProtoType *T) { // structor type. // I'll probably have mangleType(MemberPointerType) call the mangleType() // method directly. - mangleType(T, false, false); + mangleType(T, NULL, false, false); } void MicrosoftCXXNameMangler::mangleType(const FunctionNoProtoType *T) { llvm_unreachable("Can't mangle K&R function prototypes"); } void MicrosoftCXXNameMangler::mangleType(const FunctionType *T, + const FunctionDecl *D, bool IsStructor, bool IsInstMethod) { // ::= @@ -789,11 +792,19 @@ void MicrosoftCXXNameMangler::mangleType(const FunctionType *T, if (Proto->getNumArgs() == 0 && !Proto->isVariadic()) { Out << 'X'; } else { - for (FunctionProtoType::arg_type_iterator Arg = Proto->arg_type_begin(), - ArgEnd = Proto->arg_type_end(); - Arg != ArgEnd; ++Arg) - mangleType(*Arg); - + if (D) { + // If we got a decl, use the "types-as-written" to make sure arrays + // get mangled right. + for (FunctionDecl::param_const_iterator Parm = D->param_begin(), + ParmEnd = D->param_end(); + Parm != ParmEnd; ++Parm) + mangleType((*Parm)->getTypeSourceInfo()->getType()); + } else { + for (FunctionProtoType::arg_type_iterator Arg = Proto->arg_type_begin(), + ArgEnd = Proto->arg_type_end(); + Arg != ArgEnd; ++Arg) + mangleType(*Arg); + } // ::= Z # ellipsis if (Proto->isVariadic()) Out << 'Z'; diff --git a/test/CodeGenCXX/mangle-ms.cpp b/test/CodeGenCXX/mangle-ms.cpp index 6f1f95ccd0..47dedfe27a 100644 --- a/test/CodeGenCXX/mangle-ms.cpp +++ b/test/CodeGenCXX/mangle-ms.cpp @@ -80,4 +80,4 @@ void delta(int * const a, const long &) {} // Array mangling. (It should be mangled as a const pointer, but that needs // to be fixed in Sema.) void epsilon(int a[][10][20]) {} -// CHECK: @"\01?epsilon@@YAXPAY19BD@H@Z" +// CHECK: @"\01?epsilon@@YAXQAY19BD@H@Z"