[cfe-commits] r62721 - in /cfe/trunk: Driver/clang.cpp include/clang/Basic/LangOptions.h lib/CodeGen/CGObjCMac.cpp lib/CodeGen/CGObjCRuntime.h lib/CodeGen/CodeGenModule.cpp
Daniel Dunbar
daniel at zuster.org
Wed Jan 21 14:17:40 PST 2009
Nice! One request: can the name be something other than "modern" ABI.
Whats modern today isn't tomorrow.
My understanding is that this was being referred to as the
"Objective-C 2 ABI" (different from Objective-C 2.0). Or would it be
reasonable to call it the Objective-C 64-bit API?
- Daniel
On Wed, Jan 21, 2009 at 2:04 PM, Fariborz Jahanian <fjahanian at apple.com> wrote:
> Author: fjahanian
> Date: Wed Jan 21 16:04:16 2009
> New Revision: 62721
>
> URL: http://llvm.org/viewvc/llvm-project?rev=62721&view=rev
> Log:
> Refactoring ObjC Next's runtime classes in preparation for
> the new ObjC's abi.
>
> Modified:
> cfe/trunk/Driver/clang.cpp
> cfe/trunk/include/clang/Basic/LangOptions.h
> cfe/trunk/lib/CodeGen/CGObjCMac.cpp
> cfe/trunk/lib/CodeGen/CGObjCRuntime.h
> cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>
> Modified: cfe/trunk/Driver/clang.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/clang.cpp?rev=62721&r1=62720&r2=62721&view=diff
>
> ==============================================================================
> --- cfe/trunk/Driver/clang.cpp (original)
> +++ cfe/trunk/Driver/clang.cpp Wed Jan 21 16:04:16 2009
> @@ -483,6 +483,9 @@
> static llvm::cl::opt<bool>
> EnableBlocks("fblocks", llvm::cl::desc("enable the 'blocks' language feature"));
>
> +static llvm::cl::opt<bool>
> +ObjCModernABI("fobjc-modern-abi", llvm::cl::desc("enable objective-c's modern abi"));
> +
>
> // FIXME: This (and all GCC -f options) really come in -f... and
> // -fno-... forms, and additionally support automagic behavior when
> @@ -614,6 +617,9 @@
> Options.NeXTRuntime = 1;
> else if (GNURuntime)
> Options.NeXTRuntime = 0;
> +
> + if (ObjCModernABI)
> + Options.ObjCModernABI = 1;
> }
>
> static llvm::cl::opt<bool>
>
> Modified: cfe/trunk/include/clang/Basic/LangOptions.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=62721&r1=62720&r2=62721&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/LangOptions.h (original)
> +++ cfe/trunk/include/clang/Basic/LangOptions.h Wed Jan 21 16:04:16 2009
> @@ -38,6 +38,7 @@
>
> unsigned ObjC1 : 1; // Objective-C 1 support enabled.
> unsigned ObjC2 : 1; // Objective-C 2 support enabled.
> + unsigned ObjCModernABI : 1; // Objective-C modern abi enabled
>
> unsigned PascalStrings : 1; // Allow Pascal strings
> unsigned Boolean : 1; // Allow bool/true/false
> @@ -62,7 +63,7 @@
> Trigraphs = BCPLComment = DollarIdents = AsmPreprocessor = 0;
> ImplicitInt = Digraphs = 0;
> HexFloats = 0;
> - GC = ObjC1 = ObjC2 = 0;
> + GC = ObjC1 = ObjC2 = ObjCModernABI = 0;
> C99 = Microsoft = CPlusPlus = CPlusPlus0x = NoExtensions = 0;
> CXXOperatorNames = PascalStrings = Boolean = WritableStrings = 0;
> LaxVectorConversions = Exceptions = NeXTRuntime = 0;
>
> Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=62721&r1=62720&r2=62721&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Wed Jan 21 16:04:16 2009
> @@ -35,20 +35,14 @@
> // FIXME: We should find a nicer way to make the labels for
> // metadata, string concatenation is lame.
>
> -/// ObjCTypesHelper - Helper class that encapsulates lazy
> -/// construction of varies types used during ObjC generation.
> -class ObjCTypesHelper {
> -private:
> - CodeGen::CodeGenModule &CGM;
> +class ObjCCommonTypesHelper {
> +protected:
> + CodeGen::CodeGenModule &CGM;
>
> - llvm::Function *MessageSendFn, *MessageSendStretFn, *MessageSendFpretFn;
> - llvm::Function *MessageSendSuperFn, *MessageSendSuperStretFn,
> - *MessageSendSuperFpretFn;
> -
> public:
> const llvm::Type *ShortTy, *IntTy, *LongTy;
> const llvm::Type *Int8PtrTy;
> -
> +
> /// ObjectPtrTy - LLVM type for object handles (typeof(id))
> const llvm::Type *ObjectPtrTy;
>
> @@ -60,17 +54,31 @@
> /// ProtocolPtrTy - LLVM type for external protocol handles
> /// (typeof(Protocol))
> const llvm::Type *ExternalProtocolPtrTy;
> -
> +
> // SuperCTy - clang type for struct objc_super.
> QualType SuperCTy;
> // SuperPtrCTy - clang type for struct objc_super *.
> QualType SuperPtrCTy;
> -
> +
> /// SuperTy - LLVM type for struct objc_super.
> const llvm::StructType *SuperTy;
> /// SuperPtrTy - LLVM type for struct objc_super *.
> const llvm::Type *SuperPtrTy;
> +
> + ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm);
> + ~ObjCCommonTypesHelper(){}
> +};
>
> +/// ObjCTypesHelper - Helper class that encapsulates lazy
> +/// construction of varies types used during ObjC generation.
> +class ObjCTypesHelper : public ObjCCommonTypesHelper {
> +private:
> +
> + llvm::Function *MessageSendFn, *MessageSendStretFn, *MessageSendFpretFn;
> + llvm::Function *MessageSendSuperFn, *MessageSendSuperStretFn,
> + *MessageSendSuperFpretFn;
> +
> +public:
> /// SymtabTy - LLVM type for struct objc_symtab.
> const llvm::StructType *SymtabTy;
> /// SymtabPtrTy - LLVM type for struct objc_symtab *.
> @@ -183,7 +191,7 @@
>
> public:
> ObjCTypesHelper(CodeGen::CodeGenModule &cgm);
> - ~ObjCTypesHelper();
> + ~ObjCTypesHelper() {}
>
>
> llvm::Function *getSendFn(bool IsSuper) {
> @@ -199,13 +207,20 @@
> }
> };
>
> -class CGObjCMac : public CodeGen::CGObjCRuntime {
> -private:
> - CodeGen::CodeGenModule &CGM;
> - ObjCTypesHelper ObjCTypes;
> - /// ObjCABI - FIXME: Not sure yet.
> +/// ObjCModernTypesHelper - will have all types needed by objective-c's
> +/// modern abi
> +class ObjCModernTypesHelper : public ObjCCommonTypesHelper {
> +public:
> + ObjCModernTypesHelper(CodeGen::CodeGenModule &cgm);
> + ~ObjCModernTypesHelper(){}
> +};
> +
> +class CGObjCCommonMac : public CodeGen::CGObjCRuntime {
> +protected:
> + CodeGen::CodeGenModule &CGM;
> + // FIXME! May not be needing this after all.
> unsigned ObjCABI;
> -
> +
> /// LazySymbols - Symbols to generate a lazy reference for. See
> /// DefinedSymbols and FinishModule().
> std::set<IdentifierInfo*> LazySymbols;
> @@ -215,49 +230,57 @@
> /// special linker symbols which ensure that Objective-C modules are
> /// linked properly.
> std::set<IdentifierInfo*> DefinedSymbols;
> -
> +
> /// ClassNames - uniqued class names.
> llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> ClassNames;
> -
> +
> /// MethodVarNames - uniqued method variable names.
> llvm::DenseMap<Selector, llvm::GlobalVariable*> MethodVarNames;
> -
> +
> /// MethodVarTypes - uniqued method type signatures. We have to use
> /// a StringMap here because have no other unique reference.
> llvm::StringMap<llvm::GlobalVariable*> MethodVarTypes;
> -
> +
> /// MethodDefinitions - map of methods which have been defined in
> /// this translation unit.
> llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*> MethodDefinitions;
> -
> +
> /// PropertyNames - uniqued method variable names.
> llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> PropertyNames;
> -
> +
> /// ClassReferences - uniqued class references.
> llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> ClassReferences;
> -
> +
> /// SelectorReferences - uniqued selector references.
> llvm::DenseMap<Selector, llvm::GlobalVariable*> SelectorReferences;
> -
> +
> /// Protocols - Protocols for which an objc_protocol structure has
> /// been emitted. Forward declarations are handled by creating an
> /// empty structure whose initializer is filled in when/if defined.
> llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> Protocols;
> -
> +
> /// DefinedProtocols - Protocols which have actually been
> /// defined. We should not need this, see FIXME in GenerateProtocol.
> llvm::DenseSet<IdentifierInfo*> DefinedProtocols;
> -
> +
> /// DefinedClasses - List of defined classes.
> std::vector<llvm::GlobalValue*> DefinedClasses;
> -
> +
> /// DefinedCategories - List of defined categories.
> std::vector<llvm::GlobalValue*> DefinedCategories;
> -
> +
> /// UsedGlobals - List of globals to pack into the llvm.used metadata
> /// to prevent them from being clobbered.
> std::vector<llvm::GlobalVariable*> UsedGlobals;
>
> +public:
> + CGObjCCommonMac(CodeGen::CodeGenModule &cgm) : CGM(cgm)
> + { }
> +};
> +
> +class CGObjCMac : public CGObjCCommonMac {
> +private:
> + ObjCTypesHelper ObjCTypes;
> /// EmitImageInfo - Emit the image info marker used to encode some module
> /// level information.
> void EmitImageInfo();
> @@ -467,6 +490,14 @@
> virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
> llvm::Value *src, llvm::Value *dest);
> };
> +
> +class CGObjCModernMac : public CGObjCCommonMac {
> +private:
> + ObjCModernTypesHelper ObjCTypes;
> +public:
> + CGObjCModernMac(CodeGen::CodeGenModule &cgm);
> +};
> +
> } // end anonymous namespace
>
> /* *** Helper Functions *** */
> @@ -484,15 +515,10 @@
>
> /* *** CGObjCMac Public Interface *** */
>
> -CGObjCMac::CGObjCMac(CodeGen::CodeGenModule &cgm)
> - : CGM(cgm),
> - ObjCTypes(cgm),
> - ObjCABI(1)
> +CGObjCMac::CGObjCMac(CodeGen::CodeGenModule &cgm) : CGObjCCommonMac(cgm),
> + ObjCTypes(cgm)
> {
> - // FIXME: How does this get set in GCC? And what does it even mean?
> - if (ObjCTypes.LongTy != CGM.getTypes().ConvertType(CGM.getContext().IntTy))
> - ObjCABI = 2;
> -
> + ObjCABI = 1;
> EmitImageInfo();
> }
>
> @@ -2229,14 +2255,21 @@
> CGM.getModule().appendModuleInlineAsm(s.str());
> }
>
> +CGObjCModernMac::CGObjCModernMac(CodeGen::CodeGenModule &cgm)
> + : CGObjCCommonMac(cgm),
> + ObjCTypes(cgm)
> +{
> + ObjCABI = 2;
> +}
> +
> /* *** */
>
> -ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
> - : CGM(cgm)
> +ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
> +: CGM(cgm)
> {
> CodeGen::CodeGenTypes &Types = CGM.getTypes();
> ASTContext &Ctx = CGM.getContext();
> -
> +
> ShortTy = Types.ConvertType(Ctx.ShortTy);
> IntTy = Types.ConvertType(Ctx.IntTy);
> LongTy = Types.ConvertType(Ctx.LongTy);
> @@ -2250,7 +2283,41 @@
> // that the IR comes out a bit cleaner.
> const llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType());
> ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T);
> +
> + // I'm not sure I like this. The implicit coordination is a bit
> + // gross. We should solve this in a reasonable fashion because this
> + // is a pretty common task (match some runtime data structure with
> + // an LLVM data structure).
> +
> + // FIXME: This is leaked.
> + // FIXME: Merge with rewriter code?
> +
> + // struct _objc_super {
> + // id self;
> + // Class cls;
> + // }
> + RecordDecl *RD = RecordDecl::Create(Ctx, TagDecl::TK_struct, 0,
> + SourceLocation(),
> + &Ctx.Idents.get("_objc_super"));
> + RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), 0,
> + Ctx.getObjCIdType(), 0, false));
> + RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), 0,
> + Ctx.getObjCClassType(), 0, false));
> + RD->completeDefinition(Ctx);
> +
> + SuperCTy = Ctx.getTagDeclType(RD);
> + SuperPtrCTy = Ctx.getPointerType(SuperCTy);
> +
> + SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
> + SuperPtrTy = llvm::PointerType::getUnqual(SuperTy);
> +}
>
> +ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
> + : ObjCCommonTypesHelper(cgm)
> +{
> + CodeGen::CodeGenTypes &Types = CGM.getTypes();
> + ASTContext &Ctx = CGM.getContext();
> +
> // struct _objc_method_description {
> // SEL name;
> // char *types;
> @@ -2326,10 +2393,11 @@
> llvm::PATypeHolder ProtocolTyHolder = llvm::OpaqueType::get();
> llvm::PATypeHolder ProtocolListTyHolder = llvm::OpaqueType::get();
>
> - T = llvm::StructType::get(llvm::PointerType::getUnqual(ProtocolListTyHolder),
> - LongTy,
> - llvm::ArrayType::get(ProtocolTyHolder, 0),
> - NULL);
> + const llvm::Type *T =
> + llvm::StructType::get(llvm::PointerType::getUnqual(ProtocolListTyHolder),
> + LongTy,
> + llvm::ArrayType::get(ProtocolTyHolder, 0),
> + NULL);
> cast<llvm::OpaqueType>(ProtocolListTyHolder.get())->refineAbstractTypeTo(T);
>
> // struct _objc_protocol {
> @@ -2458,33 +2526,6 @@
> NULL);
> CGM.getModule().addTypeName("struct._objc_category", CategoryTy);
>
> - // I'm not sure I like this. The implicit coordination is a bit
> - // gross. We should solve this in a reasonable fashion because this
> - // is a pretty common task (match some runtime data structure with
> - // an LLVM data structure).
> -
> - // FIXME: This is leaked.
> - // FIXME: Merge with rewriter code?
> -
> - // struct _objc_super {
> - // id self;
> - // Class cls;
> - // }
> - RecordDecl *RD = RecordDecl::Create(Ctx, TagDecl::TK_struct, 0,
> - SourceLocation(),
> - &Ctx.Idents.get("_objc_super"));
> - RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), 0,
> - Ctx.getObjCIdType(), 0, false));
> - RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), 0,
> - Ctx.getObjCClassType(), 0, false));
> - RD->completeDefinition(Ctx);
> -
> - SuperCTy = Ctx.getTagDeclType(RD);
> - SuperPtrCTy = Ctx.getPointerType(SuperCTy);
> -
> - SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
> - SuperPtrTy = llvm::PointerType::getUnqual(SuperTy);
> -
> // Global metadata structures
>
> // struct _objc_symtab {
> @@ -2711,7 +2752,9 @@
>
> }
>
> -ObjCTypesHelper::~ObjCTypesHelper() {
> +ObjCModernTypesHelper::ObjCModernTypesHelper(CodeGen::CodeGenModule &cgm)
> +: ObjCCommonTypesHelper(cgm)
> +{
> }
>
> /* *** */
> @@ -2720,3 +2763,9 @@
> CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) {
> return new CGObjCMac(CGM);
> }
> +
> +CodeGen::CGObjCRuntime *
> +CodeGen::CreateMacModernObjCRuntime(CodeGen::CodeGenModule &CGM) {
> + return 0;
> + // return new CGObjCModernMac(CGM);
> +}
>
> Modified: cfe/trunk/lib/CodeGen/CGObjCRuntime.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.h?rev=62721&r1=62720&r2=62721&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGObjCRuntime.h (original)
> +++ cfe/trunk/lib/CodeGen/CGObjCRuntime.h Wed Jan 21 16:04:16 2009
> @@ -161,6 +161,7 @@
> //TODO: This should include some way of selecting which runtime to target.
> CGObjCRuntime *CreateGNUObjCRuntime(CodeGenModule &CGM);
> CGObjCRuntime *CreateMacObjCRuntime(CodeGenModule &CGM);
> +CGObjCRuntime *CreateMacModernObjCRuntime(CodeGenModule &CGM);
> }
> }
> #endif
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=62721&r1=62720&r2=62721&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Wed Jan 21 16:04:16 2009
> @@ -39,7 +39,8 @@
>
> if (Features.ObjC1) {
> if (Features.NeXTRuntime) {
> - Runtime = CreateMacObjCRuntime(*this);
> + Runtime = Features.ObjCModernABI ? CreateMacModernObjCRuntime(*this)
> + : CreateMacObjCRuntime(*this);
> } else {
> Runtime = CreateGNUObjCRuntime(*this);
> }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list