From 77552766d93331e96632d7f6288a99453ff58e4f Mon Sep 17 00:00:00 2001 From: Charles Davis Date: Sat, 3 Jul 2010 02:41:45 +0000 Subject: 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. llvm-svn: 107561 --- clang/lib/CodeGen/MicrosoftCXXABI.cpp | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'clang/lib/CodeGen/MicrosoftCXXABI.cpp') diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 1360d522ce7..a8fd0b0c2dd 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/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'; -- cgit v1.2.3