diff options
author | David Chisnall <csdavec@swan.ac.uk> | 2012-10-16 15:11:55 +0000 |
---|---|---|
committer | David Chisnall <csdavec@swan.ac.uk> | 2012-10-16 15:11:55 +0000 |
commit | a5f5941374532ebb2fceedac5a708d6f9b4eedf6 (patch) | |
tree | c5059ce6db4b93e199bb07bf3946eb6d265e4c37 /clang/lib/CodeGen/CGObjCGNU.cpp | |
parent | 48081cad0d23f72c1b341ed465b561eab4c30049 (diff) | |
download | bcm5719-llvm-a5f5941374532ebb2fceedac5a708d6f9b4eedf6.tar.gz bcm5719-llvm-a5f5941374532ebb2fceedac5a708d6f9b4eedf6.zip |
GNUstep runtime version default to 1.6, generate correct property attribute
metadata.
llvm-svn: 166023
Diffstat (limited to 'clang/lib/CodeGen/CGObjCGNU.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGObjCGNU.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp index 26da76525d7..80fa2afcd41 100644 --- a/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/clang/lib/CodeGen/CGObjCGNU.cpp @@ -224,6 +224,25 @@ protected: llvm::ArrayType *ArrayTy = llvm::ArrayType::get(Ty, V.size()); return MakeGlobal(ArrayTy, V, Name, linkage); } + /// Returns a property name and encoding string. + llvm::Constant *MakePropertyEncodingString(const ObjCPropertyDecl *PD, + const Decl *Container) { + ObjCRuntime R = CGM.getLangOpts().ObjCRuntime; + if ((R.getKind() == ObjCRuntime::GNUstep) && + (R.getVersion() >= VersionTuple(1, 6))) { + std::string NameAndAttributes; + std::string TypeStr; + CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container, TypeStr); + NameAndAttributes += '\0'; + NameAndAttributes += TypeStr.length() + 3; + NameAndAttributes += TypeStr; + NameAndAttributes += '\0'; + NameAndAttributes += PD->getNameAsString(); + return llvm::ConstantExpr::getGetElementPtr( + CGM.GetAddrOfConstantString(NameAndAttributes), Zeros); + } + return MakeConstantString(PD->getNameAsString()); + } /// Ensures that the value has the required type, by inserting a bitcast if /// required. This function lets us avoid inserting bitcasts that are /// redundant. @@ -1691,7 +1710,9 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) { std::vector<llvm::Constant*> Fields; ObjCPropertyDecl *property = *iter; - Fields.push_back(MakeConstantString(property->getNameAsString())); + + Fields.push_back(MakePropertyEncodingString(property, PD)); + Fields.push_back(llvm::ConstantInt::get(Int8Ty, property->getPropertyAttributes())); Fields.push_back(llvm::ConstantInt::get(Int8Ty, 0)); @@ -1944,7 +1965,7 @@ llvm::Constant *CGObjCGNU::GeneratePropertyList(const ObjCImplementationDecl *OI bool isSynthesized = (propertyImpl->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize); - Fields.push_back(MakeConstantString(property->getNameAsString())); + Fields.push_back(MakePropertyEncodingString(property, OID)); Fields.push_back(llvm::ConstantInt::get(Int8Ty, property->getPropertyAttributes())); Fields.push_back(llvm::ConstantInt::get(Int8Ty, isSynthesized)); |