diff options
author | Bob Wilson <bob.wilson@apple.com> | 2010-11-16 00:32:18 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2010-11-16 00:32:18 +0000 |
commit | 57147a8615bca96e067975fe931baf5d741876a4 (patch) | |
tree | a3b0cb37331791b1f18881ce21effcaab1d10603 /lib/CodeGen/Mangle.cpp | |
parent | 56affbcaeff9a01caa70b2a237f7e6ac31c8ded6 (diff) |
Change CXXNameMangler::mangleNeonVectorType to require the vector type to be
one of the special Neon types. We'll check for invalid Neon vectors when
they are created, so there's no point in handling them when mangling.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119299 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Mangle.cpp')
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 316ab7111a..602c5f065f 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -235,7 +235,7 @@ private: void mangleType(TemplateName); void mangleBareFunctionType(const FunctionType *T, bool MangleReturnType); - bool mangleNeonVectorType(const VectorType *T); + void mangleNeonVectorType(const VectorType *T); void mangleIntegerLiteral(QualType T, const llvm::APSInt &Value); void mangleMemberExpr(const Expr *Base, bool IsArrow, @@ -1404,19 +1404,17 @@ void CXXNameMangler::mangleType(const ComplexType *T) { } // ARM's ABI for Neon vector types specifies that they should be mangled as -// if they are structs (to match ARM's initial implementation). If the -// vector type is not one of the special types predefined by ARM, return false -// so it will be mangled as an ordinary vector type. -bool CXXNameMangler::mangleNeonVectorType(const VectorType *T) { +// if they are structs (to match ARM's initial implementation). The +// vector type must be one of the special types predefined by ARM. +void CXXNameMangler::mangleNeonVectorType(const VectorType *T) { QualType EltType = T->getElementType(); - if (!EltType->isBuiltinType()) - return false; + assert(EltType->isBuiltinType() && "Neon vector element not a BuiltinType"); const char *EltName = 0; if (T->getVectorKind() == VectorType::NeonPolyVector) { switch (cast<BuiltinType>(EltType)->getKind()) { case BuiltinType::SChar: EltName = "poly8_t"; break; case BuiltinType::Short: EltName = "poly16_t"; break; - default: return false; + default: llvm_unreachable("unexpected Neon polynomial vector element type"); } } else { switch (cast<BuiltinType>(EltType)->getKind()) { @@ -1429,7 +1427,7 @@ bool CXXNameMangler::mangleNeonVectorType(const VectorType *T) { case BuiltinType::LongLong: EltName = "int64_t"; break; case BuiltinType::ULongLong: EltName = "uint64_t"; break; case BuiltinType::Float: EltName = "float32_t"; break; - default: return false; + default: llvm_unreachable("unexpected Neon vector element type"); } } const char *BaseName = 0; @@ -1437,13 +1435,12 @@ bool CXXNameMangler::mangleNeonVectorType(const VectorType *T) { getASTContext().getTypeSize(EltType)); if (BitSize == 64) BaseName = "__simd64_"; - else if (BitSize == 128) + else { + assert(BitSize == 128 && "Neon vector type not 64 or 128 bits"); BaseName = "__simd128_"; - else - return false; + } Out << strlen(BaseName) + strlen(EltName); Out << BaseName << EltName; - return true; } // GNU extension: vector types @@ -1455,9 +1452,10 @@ bool CXXNameMangler::mangleNeonVectorType(const VectorType *T) { // ::= p # AltiVec vector pixel void CXXNameMangler::mangleType(const VectorType *T) { if ((T->getVectorKind() == VectorType::NeonVector || - T->getVectorKind() == VectorType::NeonPolyVector) && - mangleNeonVectorType(T)) + T->getVectorKind() == VectorType::NeonPolyVector)) { + mangleNeonVectorType(T); return; + } Out << "Dv" << T->getNumElements() << '_'; if (T->getVectorKind() == VectorType::AltiVecPixel) Out << 'p'; |