<div dir="ltr">Hello devs,<br><br>Recently I've been working on a bug that can probably be fixed with the addition of a simple flag to a class descendant of `llvm::Value`.<br>Without increasing the size of the class, I can just add this flag to `llvm::Value::SubclassData`. But this is not an easy task!<br><br>This is because the offsetes/sizes of the data stored in the `SubclassData`, are hardcoded literals/enums.<br>If you change but a single bit in one of those offsets/sizes in a base class, then all the classes derived, will have to be adjusted accordingly - which can be very tedious and error-prone.<br><br>I offer a small set of macros which will take care of the whole Subclass-Data.<br>It will work as follows:<br><br>struct A {<br>  int SubclassData : 14;<br>  <br>  DEFINE_SUBCLASS_DATA()<br>};<br><br>struct B : A {<br>  BEGIN_SUBCLASS_DATA()<br>    ADD_SUBCLASS_BITFIELD(int,   5, B1) // A::SubclassData bits [0,5)<br>     ADD_SUBCLASS_BITFIELD(bool,  1, B2) // A::SubclassData bits [5,6)<br>    ADD_SUBCLASS_BITFIELD(short, 6, B3) // A::SubclassData bits [6,12)<br> // ADD_SUBCLASS_BITFIELD(int,   6, B4) // A::SubclassData bits [12,18) - triggers a static_assert, as it exceeds the 14 bits in A::SubclassData<br>    END_SUBCLASS_DATA()<br>};<br><br>struct C : B {<br>  BEGIN_SUBCLASS_DATA()<br>    ADD_SUBCLASS_BITFIELD(bool, 1, C1) // A::SubclassData bits [12,13)<br>    END_SUBCLASS_DATA()<br>};<br><br><br>I would appreciate your thoughts on the matter, before I submit a patch for review.<br><br>Cheers,<br>Ehud.<br></div>