forked from OSchip/llvm-project
Make mangling work with anonymous tag types. Doug, please review
llvm-svn: 66353
This commit is contained in:
parent
c808fc34b3
commit
4ed74dd6b7
|
@ -43,6 +43,7 @@ namespace {
|
|||
void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity);
|
||||
void mangleCVQualifiers(unsigned Quals);
|
||||
void mangleType(QualType T);
|
||||
void mangleType(const TypedefType *T);
|
||||
void mangleType(const BuiltinType *T);
|
||||
void mangleType(const FunctionType *T);
|
||||
void mangleBareFunctionType(const FunctionType *T, bool MangleReturnType);
|
||||
|
@ -329,16 +330,15 @@ void CXXNameMangler::mangleCVQualifiers(unsigned Quals) {
|
|||
}
|
||||
|
||||
void CXXNameMangler::mangleType(QualType T) {
|
||||
// Only operate on the canonical type!
|
||||
T = Context.getCanonicalType(T);
|
||||
|
||||
// FIXME: Should we have a TypeNodes.def to make this easier? (YES!)
|
||||
|
||||
// <type> ::= <CV-qualifiers> <type>
|
||||
mangleCVQualifiers(T.getCVRQualifiers());
|
||||
|
||||
if (const TypedefType *TT = dyn_cast<TypedefType>(T.getTypePtr()))
|
||||
mangleType(TT);
|
||||
// ::= <builtin-type>
|
||||
if (const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
|
||||
else if (const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
|
||||
mangleType(BT);
|
||||
// ::= <function-type>
|
||||
else if (const FunctionType *FT = dyn_cast<FunctionType>(T.getTypePtr()))
|
||||
|
@ -382,13 +382,27 @@ void CXXNameMangler::mangleType(QualType T) {
|
|||
} else if (const ObjCInterfaceType *IT =
|
||||
dyn_cast<ObjCInterfaceType>(T.getTypePtr())) {
|
||||
mangleType(IT);
|
||||
}
|
||||
}
|
||||
// FIXME: ::= G <type> # imaginary (C 2000)
|
||||
// FIXME: ::= U <source-name> <type> # vendor extended type qualifier
|
||||
else
|
||||
assert(false && "Cannot mangle unknown type");
|
||||
}
|
||||
|
||||
void CXXNameMangler::mangleType(const TypedefType *T) {
|
||||
QualType DeclTy = T->getDecl()->getUnderlyingType();
|
||||
|
||||
if (const TagType *TT = dyn_cast<TagType>(DeclTy)) {
|
||||
// If the tag type is anonymous, use the name of the typedef.
|
||||
if (!TT->getDecl()->getIdentifier()) {
|
||||
mangleName(T->getDecl());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
mangleType(DeclTy);
|
||||
}
|
||||
|
||||
void CXXNameMangler::mangleType(const BuiltinType *T) {
|
||||
// <builtin-type> ::= v # void
|
||||
// ::= w # wchar_t
|
||||
|
|
|
@ -1,9 +1,21 @@
|
|||
// RUN: clang -emit-llvm %s -o - | grep _ZplRK1YRA100_P1X
|
||||
// RUN: clang -emit-llvm %s -o %t &&
|
||||
|
||||
// FIXME: This test is intentionally trivial, because we can't yet
|
||||
// CodeGen anything real in C++.
|
||||
struct X { };
|
||||
struct Y { };
|
||||
|
||||
|
||||
// RUN: grep _ZplRK1YRA100_P1X %t | count 1 &&
|
||||
bool operator+(const Y&, X* (&xs)[100]) { return false; }
|
||||
|
||||
// RUN: grep _Z1f1s %t | count 1 &&
|
||||
typedef struct { int a; } s;
|
||||
void f(s) { }
|
||||
|
||||
// RUN: grep _Z1f1e %t| count 1 &&
|
||||
typedef enum { foo } e;
|
||||
void f(e) { }
|
||||
|
||||
// RUN: grep _Z1f1u %t | count 1
|
||||
typedef union { int a; } u;
|
||||
void f(u) { }
|
||||
|
|
Loading…
Reference in New Issue