зеркало из https://github.com/microsoft/clang-1.git
Add ARC support for the GNUstep runtime.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@134065 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
ded137fcab
Коммит
c7aed3b9fb
|
@ -392,6 +392,8 @@ private:
|
|||
/// Emits a reference to a class. This allows the linker to object if there
|
||||
/// is no class of the matching name.
|
||||
void EmitClassRef(const std::string &className);
|
||||
/// Emits a pointer to the named class
|
||||
llvm::Value *GetClassNamed(CGBuilderTy &Builder, const std::string &Name);
|
||||
protected:
|
||||
/// Looks up the method for sending a message to the specified object. This
|
||||
/// mechanism differs between the GCC and GNU runtimes, so this method must be
|
||||
|
@ -484,6 +486,7 @@ public:
|
|||
virtual llvm::Value *EmitIvarOffset(CodeGenFunction &CGF,
|
||||
const ObjCInterfaceDecl *Interface,
|
||||
const ObjCIvarDecl *Ivar);
|
||||
virtual llvm::Value *EmitNSAutoreleasePoolClassRef(CGBuilderTy &Builder);
|
||||
virtual llvm::Constant *BuildGCBlockLayout(CodeGenModule &CGM,
|
||||
const CGBlockInfo &blockInfo) {
|
||||
return NULLPtr;
|
||||
|
@ -772,16 +775,17 @@ CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion,
|
|||
}
|
||||
}
|
||||
|
||||
// This has to perform the lookup every time, since posing and related
|
||||
// techniques can modify the name -> class mapping.
|
||||
llvm::Value *CGObjCGNU::GetClass(CGBuilderTy &Builder,
|
||||
const ObjCInterfaceDecl *OID) {
|
||||
llvm::Value *ClassName = CGM.GetAddrOfConstantCString(OID->getNameAsString());
|
||||
llvm::Value *CGObjCGNU::GetClassNamed(CGBuilderTy &Builder,
|
||||
const std::string &Name) {
|
||||
llvm::Value *ClassName = CGM.GetAddrOfConstantCString(Name);
|
||||
// With the incompatible ABI, this will need to be replaced with a direct
|
||||
// reference to the class symbol. For the compatible nonfragile ABI we are
|
||||
// still performing this lookup at run time but emitting the symbol for the
|
||||
// class externally so that we can make the switch later.
|
||||
EmitClassRef(OID->getNameAsString());
|
||||
//
|
||||
// Libobjc2 contains an LLVM pass that replaces calls to objc_lookup_class
|
||||
// with memoized versions or with static references if it's safe to do so.
|
||||
EmitClassRef(Name);
|
||||
ClassName = Builder.CreateStructGEP(ClassName, 0);
|
||||
|
||||
llvm::Constant *ClassLookupFn =
|
||||
|
@ -790,6 +794,16 @@ llvm::Value *CGObjCGNU::GetClass(CGBuilderTy &Builder,
|
|||
return Builder.CreateCall(ClassLookupFn, ClassName);
|
||||
}
|
||||
|
||||
// This has to perform the lookup every time, since posing and related
|
||||
// techniques can modify the name -> class mapping.
|
||||
llvm::Value *CGObjCGNU::GetClass(CGBuilderTy &Builder,
|
||||
const ObjCInterfaceDecl *OID) {
|
||||
return GetClassNamed(Builder, OID->getNameAsString());
|
||||
}
|
||||
llvm::Value *CGObjCGNU::EmitNSAutoreleasePoolClassRef(CGBuilderTy &Builder) {
|
||||
return GetClassNamed(Builder, "NSAutoreleasePool");
|
||||
}
|
||||
|
||||
llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel,
|
||||
const std::string &TypeEncoding, bool lval) {
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче