How to preserve struct member identifiers?

I'm working on a set of function libraries which I'd like to be as self-documenting as possible --- so that, for example, if only the bitcode were available to the end user, the end user could readily deduce how to use these functions.

I'd like to define some C structures to use as arguments. If I define a structure as follows:
  struct stringStructure {
    char *stringVariable;
  };
Clang produces the following IR:
  %struct.stringStructure = type { i8* }
...which represents everything in my structure definition except the variable identifier `stringVariable`.

I'd like to find some way to export the identifier into the generated LLVM IR, so that I can refer to it by name.

I've tried adding the `annotate` attribute, as follows:
    char *stringVariable __attribute__((annotate("stringVariable")));
...but the annotation doesn't seem to make it through (the structure is still just defined as type { i8* }, and the literal "stringVariable" still appears nowhere in the IR).

Why is this? Can I entice the `annotate` attribute on structure members to survive through to the generated IR, or is there some other way I can force structure member identifiers to be exposed? (I'd prefer not to have to include full debug info just to get this comparatively small piece.)

Thanks,
Steve

(Also posted on stackoverflow --- http://stackoverflow.com/questions/4918001 --- but I'm thinking cfe-dev might be a more appropriate forum.)

I'm working on a set of function libraries which I'd like to be as self-documenting as possible --- so that, for example, if only the bitcode were available to the end user, the end user could readily deduce how to use these functions.

Hi Steve,

This is a common area of confusion with LLVM IR. LLVM has a structural type system, so the names on the IR types don't actually mean anything.

I'd like to define some C structures to use as arguments. If I define a structure as follows:
  struct stringStructure {
    char *stringVariable;
  };
Clang produces the following IR:
  %struct.stringStructure = type { i8* }
...which represents everything in my structure definition except the variable identifier `stringVariable`.

Right, the name doesn't mean anything, LLVM will print any {i8*} type with the same name regardless of what it was named in the source.

I'd like to find some way to export the identifier into the generated LLVM IR, so that I can refer to it by name.

I've tried adding the `annotate` attribute, as follows:
   char *stringVariable __attribute__((annotate("stringVariable")));
...but the annotation doesn't seem to make it through (the structure is still just defined as type { i8* }, and the literal "stringVariable" still appears nowhere in the IR).

Why is this? Can I entice the `annotate` attribute on structure members to survive through to the generated IR, or is there some other way I can force structure member identifiers to be exposed? (I'd prefer not to have to include full debug info just to get this comparatively small piece.)

There isn't a good answer to this right now. OTOH, for LLVM 3.0 I do plan to completely revise the LLVM IR type system (for other reasons), which will fix this :slight_smile:

-Chris