summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/MicrosoftCXXABI.cpp
diff options
context:
space:
mode:
authorCharles Davis <cdavis@mines.edu>2010-07-03 02:41:45 +0000
committerCharles Davis <cdavis@mines.edu>2010-07-03 02:41:45 +0000
commit77552766d93331e96632d7f6288a99453ff58e4f (patch)
treec183b807fd54780a5cd7d82083be880c7c640137 /clang/lib/CodeGen/MicrosoftCXXABI.cpp
parentca99012ac047e0ab8cf5811750482d0f36ffb66a (diff)
downloadbcm5719-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.cpp31
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';
OpenPOWER on IntegriCloud