[llvm-dev] RFC: Refactor SubclassData
Ehud Katz via llvm-dev
llvm-dev at lists.llvm.org
Mon Dec 23 23:16:16 PST 2019
Hello devs,
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`.
Without increasing the size of the class, I can just add this flag to
`llvm::Value::SubclassData`. But this is not an easy task!
This is because the offsetes/sizes of the data stored in the
`SubclassData`, are hardcoded literals/enums.
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.
I offer a small set of macros which will take care of the whole
Subclass-Data.
It will work as follows:
struct A {
int SubclassData : 14;
DEFINE_SUBCLASS_DATA()
};
struct B : A {
BEGIN_SUBCLASS_DATA()
ADD_SUBCLASS_BITFIELD(int, 5, B1) // A::SubclassData bits [0,5)
ADD_SUBCLASS_BITFIELD(bool, 1, B2) // A::SubclassData bits [5,6)
ADD_SUBCLASS_BITFIELD(short, 6, B3) // A::SubclassData bits [6,12)
// ADD_SUBCLASS_BITFIELD(int, 6, B4) // A::SubclassData bits [12,18) -
triggers a static_assert, as it exceeds the 14 bits in A::SubclassData
END_SUBCLASS_DATA()
};
struct C : B {
BEGIN_SUBCLASS_DATA()
ADD_SUBCLASS_BITFIELD(bool, 1, C1) // A::SubclassData bits [12,13)
END_SUBCLASS_DATA()
};
I would appreciate your thoughts on the matter, before I submit a patch for
review.
Cheers,
Ehud.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191224/fa3bcd07/attachment.html>
More information about the llvm-dev
mailing list