As I said on the libobjc2 bug report, please file a clang bug and assign it to me.
David > On 14 Sep 2016, at 20:53, Lobron, David via cfe-dev <cfe-...@lists.llvm.org> > wrote: > > Hello cfe-users, > > I'm working to get my the libobjc2 Objective-C runtime working on Linux with > clang-3.8.0. I'm running into a problem with a library of mine that does > class introspection. My ObjC code does type introspection by looping through > the ivars of an object and calling ivar_getTypeEncoding on each to get the > type of the ivar. When I compile with gcc, the ivar type for non-primitive > variables comes through as @"NSString", @"NSDictionary", etc. This also > works with clang on my Mac. But when I compile with clang on Linux, I only > get the @ character. I verified that the call to class_copyIvarList on Linux > does return a list of Ivar objects, but when I call ivar_getTypeEncoding on > those objects on Linux, I only get @, rather than the class name. I've > copied my library's ObjC code below. > > I talked this over with the owners of libobjc2, and we were wondering if > there is a flag I can pass to clang to instruct it to emit this class data. > I looked at lib/CodeGen/CGObjCGNU.cpp in the clang source tree, but it wasn't > immediately clear what flag I could pass here. It's possible that there's no > such flag, and the non-Apple clang simply doesn't emit this data, but I'd be > somewhat surprised if Apple had diverged that much. > > Thanks in advance for any help you can give, > > David > > My library's introspection code, with a debug print statement: > > Ivar *ivarList = class_copyIvarList(c, &ivarCount); > for (i = 0; i < ivarCount; i++) { > Ivar ivar = ivarList[i]; > const char *ivarCname = ivar_getName(ivar); > if (ivarCname != 0 && ivarCname[0] != '_') { > NSString *ivarName = [NSString stringWithUTF8String:ivarCname]; > const char *ivarType = ivar_getTypeEncoding(ivar); > if (ivarType[0] == '@' && ivarType[1] == '"') { > NSString *className = [[[NSString alloc] initWithBytes: &ivarType[2] > length: strlen(&ivarType[2])-1 > encoding: NSUTF8StringEncoding] autorelease]; > Class c = NSClassFromString(className); > if (c == nil) { > NSLog(@"WARNING: unknown class name \"%@\" in declaration of %@", > className, [self class]); > } else { > NSLog(@"DBG: Deduced class %@ from className %@", c, className); > > With gcc and clang on the Mac, I get messages like this: > > 2016-09-14 19:29:21.950 archiveserver[1015:1015] DBG: Deduced class NSSet > from className NSSet > 2016-09-14 19:29:21.950 archiveserver[1015:1015] DBG: Deduced class NSString > from className NSString > 2016-09-14 19:29:21.950 archiveserver[1015:1015] DBG: Deduced class NSString > from className NSString > 2016-09-14 19:29:21.950 archiveserver[1015:1015] DBG: Deduced class NSString > from className NSString > 2016-09-14 19:29:21.950 archiveserver[1015:1015] DBG: Deduced class > NSDictionary from className NSDictionary > 2016-09-14 19:29:21.950 archiveserver[1015:1015] DBG: Deduced class > NSDictionary from className NSDictionary > 2016-09-14 19:29:21.950 archiveserver[1015:1015] DBG: Deduced class NSArray > from className NSArray > > With clang on Linux, nothing is printed, because ivarType[1] is not a double > quote, so the second if evaluates to false. > > > > _______________________________________________ > cfe-dev mailing list > cfe-...@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
smime.p7s
Description: S/MIME cryptographic signature
_______________________________________________ cfe-users mailing list cfe-users@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users