diff options
author | Charles Davis <cdavis@mines.edu> | 2010-07-03 02:41:45 +0000 |
---|---|---|
committer | Charles Davis <cdavis@mines.edu> | 2010-07-03 02:41:45 +0000 |
commit | 77552766d93331e96632d7f6288a99453ff58e4f (patch) | |
tree | c183b807fd54780a5cd7d82083be880c7c640137 /clang/lib/CodeGen/MicrosoftCXXABI.cpp | |
parent | ca99012ac047e0ab8cf5811750482d0f36ffb66a (diff) | |
download | bcm5719-llvm-77552766d93331e96632d7f6288a99453ff58e4f.tar.gz bcm5719-llvm-77552766d93331e96632d7f6288a99453ff58e4f.zip |
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
Diffstat (limited to 'clang/lib/CodeGen/MicrosoftCXXABI.cpp')
-rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 31 |
1 files changed, 21 insertions, 10 deletions
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 '<unnamed-tag>'. + Out << "<unnamed-tag>"; 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) { // <function-type> ::= <this-cvr-qualifiers> <calling-convention> @@ -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); + } // <builtin-type> ::= Z # ellipsis if (Proto->isVariadic()) Out << 'Z'; |