Hi,
for a current project I'm required to get the types of the template arguments key and value for std::map<K,V>. I've noticed that the STL implementation used by Clang defines the type of the map as
%"class.std::map" = type { %"class.std::_Rb_tree" }
which then is further defined and finally ends as
%"struct.std::_Rb_tree_node_base" = type {
i32,
%"struct.std::_Rb_tree_node_base"*,
%"struct.std::_Rb_tree_node_base"*
}
However, indifferent what K and V are and how many different maps are instantiated, it always ends at this definition. But, I also noticed, that
%"struct.std::pair" = type { i32, double }
is defined, which then provides the information I need.
Now the problem arises to connect %"class.std::map" to %"struct.std::pair" correctly. To solve this I looked at the IR and noticed, that the std::pair's are always defined in the reverse order of the definitions of std::map. So I think about using some index to find the correct std::pair.
From this idea two issues arise:
1. I feel that this approach is not that stable as it should be, for instance, I think that the ordering of instantiation I'm making use of may change.
2. I'm unable to retrieve all defined named types from the module. I know there is LLVMContextImpl but this class is a forward declaration and therefore I'm not able to access LLVMContextImpl::NamedStructTypes.
Thanks for any suggestions.
Best regards,
Sebastian