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
> 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