DHowett-MSFT created this revision. DHowett-MSFT added reviewers: rjmccall, theraven. DHowett-MSFT added a project: clang. Herald added a subscriber: cfe-commits.
Protocols that were being referenced but could not be fully realized were being emitted without `properties`/`optional_properties`. Since they're packed end-to-end, the lack of these fields is catastrophic for the runtime. As an example, the runtime cannot know here <https://github.com/gnustep/libobjc2/blob/master/protocol.c#L73> that `properties` and `optional_properties` are invalid if they overlap with another v3 protocol. Repository: rC Clang https://reviews.llvm.org/D45305 Files: lib/CodeGen/CGObjCGNU.cpp Index: lib/CodeGen/CGObjCGNU.cpp =================================================================== --- lib/CodeGen/CGObjCGNU.cpp +++ lib/CodeGen/CGObjCGNU.cpp @@ -1813,11 +1813,13 @@ llvm::ConstantInt::get(Int32Ty, ProtocolVersion), IdTy)); Elements.add(MakeConstantString(ProtocolName, ".objc_protocol_name")); - Elements.add(ProtocolList); - Elements.add(MethodList); - Elements.add(MethodList); - Elements.add(MethodList); - Elements.add(MethodList); + Elements.add(ProtocolList); /* .protocol_list */ + Elements.add(MethodList); /* .instance_methods */ + Elements.add(MethodList); /* .class_methods */ + Elements.add(MethodList); /* .optional_instance_methods */ + Elements.add(MethodList); /* .optional_class_methods */ + Elements.add(NULLPtr); /* .properties */ + Elements.add(NULLPtr); /* .optional_properties */ return Elements.finishAndCreateGlobal(".objc_protocol", CGM.getPointerAlign()); }
Index: lib/CodeGen/CGObjCGNU.cpp =================================================================== --- lib/CodeGen/CGObjCGNU.cpp +++ lib/CodeGen/CGObjCGNU.cpp @@ -1813,11 +1813,13 @@ llvm::ConstantInt::get(Int32Ty, ProtocolVersion), IdTy)); Elements.add(MakeConstantString(ProtocolName, ".objc_protocol_name")); - Elements.add(ProtocolList); - Elements.add(MethodList); - Elements.add(MethodList); - Elements.add(MethodList); - Elements.add(MethodList); + Elements.add(ProtocolList); /* .protocol_list */ + Elements.add(MethodList); /* .instance_methods */ + Elements.add(MethodList); /* .class_methods */ + Elements.add(MethodList); /* .optional_instance_methods */ + Elements.add(MethodList); /* .optional_class_methods */ + Elements.add(NULLPtr); /* .properties */ + Elements.add(NULLPtr); /* .optional_properties */ return Elements.finishAndCreateGlobal(".objc_protocol", CGM.getPointerAlign()); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits