I'm writing a frontend and I'd like to be able to provide
names to struct types that mirror the names of the classes in
the source language. Unfortunately, some of these generated
structs are sometimes identical for distinct classes, and so
LLVM forces them to have the same type and same name.
This makes debugging kind of confusing. Is there some way to
get the behavior I want without having to add bogus extra
components to my structs to distinguish them?
I think you'd have to change VMCore to make that happen and it could
cause problems with linking, etc. LLVM counts structurally equivalent
types as identical and I think violating that premise would break
things. This is probably a question best answered by Chris. He'll be
back tomorrow.
LLVM uses structural equivalence to distinguish types, so there's no direct way to retain multiple types with identical contents. The C++ front-end generates a single struct for two such classes, and simply initializes their vtables differently to get the right function pointers. You would need some hack like you said to create distinct structs, which may be ok if you use it only for debugging.
(For those who are interested, this is a technical limitation because we lose some precision in analyses like pointer analysis, compared with a compiler that tracked distinct source types.)
LLVM uses structural equivalence to distinguish types, so there's no direct way to retain multiple types with identical contents. The C++ front-end generates a single struct for two such classes, and simply initializes their vtables differently to get the right function pointers. You would need some hack like you said to create distinct structs, which may be ok if you use it only for debugging.
Yup, as others have said, there isn't a great way to do this. The basic deal is that names in LLVM (except for globals) are purely "best effort to make compiler debugging easier", they have no guarantees.
(For those who are interested, this is a technical limitation because we lose some precision in analyses like pointer analysis, compared with a compiler that tracked distinct source types.)
Hrm, that issue is much bigger than just structural vs named equivalence, but I guess it is tangentially related.
I'm writing a frontend and I'd like to be able to provide
names to struct types that mirror the names of the classes in
the source language. Unfortunately, some of these generated
structs are sometimes identical for distinct classes, and so
LLVM forces them to have the same type and same name.
This makes debugging kind of confusing. Is there some way to
get the behavior I want without having to add bogus extra
components to my structs to distinguish them?