diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/ASTContext.cpp | 5 | ||||
-rw-r--r-- | lib/AST/Type.cpp | 18 |
2 files changed, 20 insertions, 3 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 32a6c7d4c6..dec73182b8 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -725,7 +725,7 @@ QualType ASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) { // Check if we've already instantiated an address space qual'd type of this // type. llvm::FoldingSetNodeID ID; - ExtQualType::Profile(ID, T.getTypePtr(), AddressSpace); + ExtQualType::Profile(ID, T.getTypePtr(), AddressSpace, 0); void *InsertPos = 0; if (ExtQualType *EXTQy = ExtQualTypes.FindNodeOrInsertPos(ID, InsertPos)) return QualType(EXTQy, 0); @@ -741,7 +741,8 @@ QualType ASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) { assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP; } ExtQualType *New = new (*this, 8) ExtQualType(T.getTypePtr(), Canonical, - AddressSpace); + AddressSpace, 0, + ExtQualType::ASQUAL); ExtQualTypes.InsertNode(New, InsertPos); Types.push_back(New); return QualType(New, T.getCVRQualifiers()); diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index 0edc6ee7f7..6aec24fddd 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -1053,7 +1053,23 @@ void ComplexType::getAsStringInternal(std::string &S) const { } void ExtQualType::getAsStringInternal(std::string &S) const { - S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S; + bool space = false; + if (ExtQualTypeKind & ASQUAL) { + S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S; + space = true; + } + if (ExtQualTypeKind & GCQUAL) { + if (space) + S += ' '; + S += "__attribute__((objc_gc("; + ObjCGCAttr *gcattr = getGCAttr(); + ObjCGCAttr::GCAttrTypes attr = gcattr->getType(); + if (attr & ObjCGCAttr::Weak) + S += "weak"; + else + S += "strong"; + S += ")))"; + } BaseType->getAsStringInternal(S); } |