[cfe-commits] r64233 - /cfe/trunk/lib/CodeGen/CGObjCMac.cpp
Fariborz Jahanian
fjahanian at apple.com
Tue Feb 10 12:21:06 PST 2009
Author: fjahanian
Date: Tue Feb 10 14:21:06 2009
New Revision: 64233
URL: http://llvm.org/viewvc/llvm-project?rev=64233&view=rev
Log:
Generate ir for ivar offset. This will pass
type-nsobject-attribute.m in the dejagnu test suite
in the nonfragile abi mode.
Modified:
cfe/trunk/lib/CodeGen/CGObjCMac.cpp
Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=64233&r1=64232&r2=64233&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Tue Feb 10 14:21:06 2009
@@ -633,7 +633,7 @@
/// IvarListnfABIPtrTy.
llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID);
- llvm::Constant *EmitIvarOffsetVar(const ObjCImplementationDecl *ID,
+ llvm::Constant *EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
const ObjCIvarDecl *Ivar,
unsigned long int offset);
@@ -673,6 +673,12 @@
llvm::Value *EmitMetaClassRef(CGBuilderTy &Builder,
const ObjCInterfaceDecl *ID);
+ /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
+ /// the given ivar.
+ ///
+ llvm::GlobalVariable * ObjCIvarOffsetVariable(std::string &Name,
+ const NamedDecl *IDName,
+ const ObjCIvarDecl *Ivar);
public:
CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm);
@@ -746,7 +752,6 @@
virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
ObjCInterfaceDecl *Interface,
const ObjCIvarDecl *Ivar);
- virtual bool LateBoundIVars() const { return true; }
};
} // end anonymous namespace
@@ -3907,11 +3912,34 @@
ObjCTypes.MethodListnfABIPtrTy);
}
+/// ObjCIvarOffsetVariable - Returns the ivar offset variable for
+/// the given ivar.
+///
+llvm::GlobalVariable * CGObjCNonFragileABIMac::ObjCIvarOffsetVariable(
+ std::string &Name,
+ const NamedDecl *IDName,
+ const ObjCIvarDecl *Ivar) {
+ Name += "\01_OBJC_IVAR_$_" + IDName->getNameAsString() + '.'
+ + Ivar->getNameAsString();
+ llvm::GlobalVariable *IvarOffsetGV =
+ CGM.getModule().getGlobalVariable(Name);
+ if (!IvarOffsetGV)
+ IvarOffsetGV =
+ new llvm::GlobalVariable(ObjCTypes.LongTy,
+ false,
+ llvm::GlobalValue::ExternalLinkage,
+ 0,
+ Name,
+ &CGM.getModule());
+ return IvarOffsetGV;
+}
+
llvm::Constant * CGObjCNonFragileABIMac::EmitIvarOffsetVar(
- const ObjCImplementationDecl *ID,
+ const ObjCInterfaceDecl *ID,
const ObjCIvarDecl *Ivar,
unsigned long int Offset) {
+ assert(ID && "EmitIvarOffsetVar - null interface decl.");
std::string ExternalName("\01_OBJC_IVAR_$_" + ID->getNameAsString() + '.'
+ Ivar->getNameAsString());
llvm::Constant *Init = llvm::ConstantInt::get(ObjCTypes.LongTy, Offset);
@@ -3943,9 +3971,8 @@
if (!globalVisibility)
IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
else
- if (const ObjCInterfaceDecl *OID = ID->getClassInterface())
- if (IsClassHidden(OID))
- IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
+ if (IsClassHidden(ID))
+ IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
IvarOffsetGV->setSection("__DATA, __objc_const");
UsedGlobals.push_back(IvarOffsetGV);
@@ -3994,7 +4021,7 @@
unsigned long offset = Layout->getElementOffset(CGM.getTypes().
getLLVMFieldNo(Field));
const ObjCIvarDecl *ivarDecl = *I++;
- Ivar[0] = EmitIvarOffsetVar(ID, ivarDecl, offset);
+ Ivar[0] = EmitIvarOffsetVar(ID->getClassInterface(), ivarDecl, offset);
if (Field->getIdentifier())
Ivar[1] = GetMethodVarName(Field->getIdentifier());
else
@@ -4268,21 +4295,9 @@
assert(ObjectTy->isObjCInterfaceType() &&
"CGObjCNonFragileABIMac::EmitObjCValueForIvar");
NamedDecl *ID = ObjectTy->getAsObjCInterfaceType()->getDecl();
- // NOTE. This name must match one in EmitIvarOffsetVar.
- // FIXME. Consolidate into one naming routine.
- std::string ExternalName("\01_OBJC_IVAR_$_" + ID->getNameAsString() + '.'
- + Ivar->getNameAsString());
-
- llvm::GlobalVariable *IvarOffsetGV =
- CGM.getModule().getGlobalVariable(ExternalName);
- if (!IvarOffsetGV)
- IvarOffsetGV =
- new llvm::GlobalVariable(ObjCTypes.LongTy,
- false,
- llvm::GlobalValue::ExternalLinkage,
- 0,
- ExternalName,
- &CGM.getModule());
+ std::string ExternalName;
+ llvm::GlobalVariable *IvarOffsetGV =
+ ObjCIvarOffsetVariable(ExternalName, ID, Ivar);
// (char *) BaseValue
llvm::Value *V = CGF.Builder.CreateBitCast(BaseValue,
@@ -4310,7 +4325,11 @@
CodeGen::CodeGenFunction &CGF,
ObjCInterfaceDecl *Interface,
const ObjCIvarDecl *Ivar) {
- return 0;
+ std::string ExternalName;
+ llvm::GlobalVariable *IvarOffsetGV =
+ ObjCIvarOffsetVariable(ExternalName, Interface, Ivar);
+
+ return CGF.Builder.CreateLoad(IvarOffsetGV, false, "ivar");
}
CodeGen::RValue CGObjCNonFragileABIMac::EmitMessageSend(
More information about the cfe-commits
mailing list