On Sun, Aug 28, 2011 at 7:01 AM, Pekka Enberg <penberg@xxxxxxxxxx> wrote: >> It's lack of PSEUDO_SYM support. I haven't quite figured out what kind of >> code to generate for that because, frankly, I'm not completely sure what >> it's all about. ;-) On Sun, Aug 28, 2011 at 7:54 PM, Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > So "PSEUDO_SYM" is just a "link-time constant". > > IOW, it's nothing but a pointer to an in-memory variable, and from a > code generation standpoint generating the symbol should be just about > the same as generating a constant, except rather than an actual value, > it's now a linker reference. > > Of course, what complicates them is that you also need to generate the > symbol definition itself (somewhere else). In particular, the > sym->initializer points to the initializer of a symbol, and they can > be *complicated*. Generating the output for some symbols can be a > major pain in the *ss, just think about a complex structure array > initializer. > > The PSEUDO_SYM you hit for the "hello world" program is trivial, > though. It's an unnamed symbol of type "char []", and it has a trivial > initializer (the string itself). So symbols can be hard to generate, > but there are simple cases. > > So for a PSUEDO_SYM, you need to look up "struct symbol" for it > (pseudo->sym), which then has: > > - name of the symbol (sym->ident). Of course, some symbols don't have > names, like the constant string example. > > - type/size/alignment information (sym->ctype) > > - initializer information (sym->initializer - which can be a really > complex expression). Of course, for external symbols - or symbols with > no initializer - this is just empty. > > There's way more to symbol types in sparse than that, but apart from > the initializer expression, most of the symbol complexity has been > handled by earlier stages (ie a *lot* of the front-end of sparse is > about symbols and their types). Right. Will the "link time constant" 'struct symbol' be part of the symbol_list? If it is, then we already do LLVMAddGlobal in output_data() on it and could probably just stash that into a ->priv member in 'struct symbol' and use that in pseudo_to_value(). -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html