I plan to use clang for some code analysis. Because of that, I was looking on how one can make clang use a custom ABI (overwrite some sizes, keep reasonable defaults for everything else).
But then I found Targets.cpp and now I got stuck.
The issue is as follows:
To get some instance of TargetInfo in which I can change things (lets say IntWidth), I need to derive from it. But then, I still cannot set the private member TargetOpts which is only set in CreateTargetInfo(). But this function I cannot use because I want to access protected fields. Not settings the pointer at all doesn't seem to be an option as well (asserts).
Is this intended and I am overseeing something? Or is there a way to do this?
Why is the TargetInfo stuff encapsulated that much anyway?
You are supposed to pass the target options to CreateTargetInfo. If you want the target info to have different option different, create a new one, with the “right” values for your types.
You can get a reference to target options with getTargetOpts to, and I do believe your can even modify the members of that and get the desired effect, but it’s not, as far as I understand, how it’s meant to work.
However, I have only worked on code dealing with targets and target options a tiny bit, so I could be wrong.
I get that this is the way its meant to be used. But still I wonder why its the only one.
What I get from CreateTargetInfo I cannot alter since the respective fields are protected. And in the TargetOpts I also can reference a certain ABI by name if clang provides it.
But since there are private fields in TargetInfo that cannot be set, I can't even create a working TargetInfo subclass.