[cfe-dev] Objective-C Code Generation
clattner at apple.com
Sun Feb 24 11:31:09 PST 2008
>>> I imagine the easiest way of getting this working is to
>>> transform the Objective-C AST into a pure-C AST with calls to the
>>> relevant runtime libraries.
>> This is the way that GCC works, but I don't think it is really the
>> best way. I'd much rather have the clang codegen module directly
>> produce the LLVM IR for the constructs it needs. I don't anticipate
>> that this will be a problem for metadata or other objc constructs.
> I am not completely sure what would be gained by doing this. Unlike
> +, every Objective-C construct maps cleanly to a C construct.
> Objective-C objects are C structures, Objective-C message sends are C
> function calls (and methods are just C functions with their pointers
> added to the class structure), and so on.
And all of them map onto LLVM IR :)
> If work has already been
> done to transform these C constructs into LLVM IR then it seems like
> there would be some significant code duplication to do the same for
> I don't mind generating LLVM IR (I've already written code which
> generates code targeting the GNU runtime from GNU Lightning), but I'm
> not sure what the benefit would be.
Please see Fariborz's response, it is exactly right. If nothing else,
multiple levels of translation slow down compile time.
> @"foo" is actually decidedly non-trivial from a code-generation
> perspective. It needs to be expanded to an object, which is a
> structure of the form:
> Class isa;
> char * c_string;
> unsigned int length;
Ok, but it isn't hard to generate any of this in LLVM IR. It's
probably less code than setting up all the C AST types etc.
> Where the class pointed to by isa is determined at compile-time and
> resolved at runtime (both GNUstep and Cocoa define this as their own
> constant string representation (an NSString subclass). It's hard to
> get something like this right until you have classes being generated
> correctly, which is probably where I'll start.
Ok! If it's easier to start with defining simple interfaces, go for
that, starting with @"foo" was just a suggestion,
More information about the cfe-dev