aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGObjCMac.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2009-03-04 18:21:39 +0000
committerDevang Patel <dpatel@apple.com>2009-03-04 18:21:39 +0000
commit7794bb8271d97bea5d0bf52f4f050fbfff1a7420 (patch)
tree4453a7d2efdee9dc57f8a85edddd8593acca0b1f /lib/CodeGen/CGObjCMac.cpp
parent2a998148a6823c44d67da347c95eb2ea21f6b986 (diff)
Refactor code.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66043 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGObjCMac.cpp')
-rw-r--r--lib/CodeGen/CGObjCMac.cpp36
1 files changed, 24 insertions, 12 deletions
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index bbbed3fe2b..63185e585e 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -381,7 +381,7 @@ protected:
// FIXME: This is a horrible name.
llvm::Constant *GetMethodVarType(const ObjCMethodDecl *D);
- llvm::Constant *GetMethodVarType(const std::string &Name);
+ llvm::Constant *GetMethodVarType(FieldDecl *D);
/// GetPropertyName - Return a unique constant for the given
/// name. The return value has type char *.
@@ -1696,9 +1696,7 @@ llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
Ivar[0] = GetMethodVarName(Field->getIdentifier());
else
Ivar[0] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
- std::string TypeStr;
- CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field);
- Ivar[1] = GetMethodVarType(TypeStr);
+ Ivar[1] = GetMethodVarType(Field);
Ivar[2] = llvm::ConstantInt::get(ObjCTypes.IntTy, Offset);
Ivars.push_back(llvm::ConstantStruct::get(ObjCTypes.IvarTy, Ivar));
}
@@ -2467,11 +2465,14 @@ llvm::Constant *CGObjCCommonMac::GetMethodVarName(const std::string &Name) {
return GetMethodVarName(&CGM.getContext().Idents.get(Name));
}
-llvm::Constant *CGObjCCommonMac::GetMethodVarType(const std::string &Name) {
- llvm::GlobalVariable *&Entry = MethodVarTypes[Name];
+llvm::Constant *CGObjCCommonMac::GetMethodVarType(FieldDecl *Field) {
+ std::string TypeStr;
+ CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field);
+
+ llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
if (!Entry) {
- llvm::Constant *C = llvm::ConstantArray::get(Name);
+ llvm::Constant *C = llvm::ConstantArray::get(TypeStr);
Entry =
new llvm::GlobalVariable(C->getType(), false,
llvm::GlobalValue::InternalLinkage,
@@ -2484,12 +2485,25 @@ llvm::Constant *CGObjCCommonMac::GetMethodVarType(const std::string &Name) {
return getConstantGEP(Entry, 0, 0);
}
-// FIXME: Merge into a single cstring creation function.
llvm::Constant *CGObjCCommonMac::GetMethodVarType(const ObjCMethodDecl *D) {
std::string TypeStr;
CGM.getContext().getObjCEncodingForMethodDecl(const_cast<ObjCMethodDecl*>(D),
TypeStr);
- return GetMethodVarType(TypeStr);
+
+ llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
+
+ if (!Entry) {
+ llvm::Constant *C = llvm::ConstantArray::get(TypeStr);
+ Entry =
+ new llvm::GlobalVariable(C->getType(), false,
+ llvm::GlobalValue::InternalLinkage,
+ C, "\01L_OBJC_METH_VAR_TYPE_",
+ &CGM.getModule());
+ Entry->setSection("__TEXT,__cstring,cstring_literals");
+ UsedGlobals.push_back(Entry);
+ }
+
+ return getConstantGEP(Entry, 0, 0);
}
// FIXME: Merge into a single cstring creation function.
@@ -4077,9 +4091,7 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
Ivar[1] = GetMethodVarName(Field->getIdentifier());
else
Ivar[1] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
- std::string TypeStr;
- CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field);
- Ivar[2] = GetMethodVarType(TypeStr);
+ Ivar[2] = GetMethodVarType(Field);
const llvm::Type *FieldTy =
CGM.getTypes().ConvertTypeForMem(Field->getType());
unsigned Size = CGM.getTargetData().getTypePaddedSize(FieldTy);