Skip to content

Commit

Permalink
TableGen: BitInit and VarBitInit are typed
Browse files Browse the repository at this point in the history
Summary: Change-Id: I54e337a0b525e9649534bc5f90e5e07c0772e334

Reviewers: arsenm, craig.topper, tra, MartinO

Subscribers: wdng, llvm-commits

Differential Revision: https://reviews.llvm.org/D43560

Change-Id: I07f78e793192974c2b90690ce644589fe4891e41
llvm-svn: 325885
  • Loading branch information
nhaehnle committed Feb 23, 2018
1 parent aecb68b commit 6e2bf39
Showing 1 changed file with 19 additions and 7 deletions.
26 changes: 19 additions & 7 deletions llvm/include/llvm/TableGen/Record.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,8 +267,9 @@ class Init {
/// and IK_LastXXXInit be their own values, but that would degrade
/// readability for really no benefit.
enum InitKind : uint8_t {
IK_BitInit,
IK_First, // unused; silence a spurious warning
IK_FirstTypedInit,
IK_BitInit,
IK_BitsInit,
IK_CodeInit,
IK_DagInit,
Expand All @@ -284,9 +285,9 @@ class Init {
IK_StringInit,
IK_VarInit,
IK_VarListElementInit,
IK_VarBitInit,
IK_LastTypedInit,
IK_UnsetInit,
IK_VarBitInit
IK_UnsetInit
};

private:
Expand Down Expand Up @@ -451,10 +452,10 @@ class UnsetInit : public Init {
};

/// 'true'/'false' - Represent a concrete initializer for a bit.
class BitInit : public Init {
class BitInit final : public TypedInit {
bool Value;

explicit BitInit(bool V) : Init(IK_BitInit), Value(V) {}
explicit BitInit(bool V) : TypedInit(IK_BitInit, BitRecTy::get()), Value(V) {}

public:
BitInit(const BitInit &) = delete;
Expand All @@ -470,6 +471,11 @@ class BitInit : public Init {

Init *convertInitializerTo(RecTy *Ty) const override;

Init *resolveListElementReference(Record &R, const RecordVal *RV,
unsigned Elt) const override {
llvm_unreachable("Illegal element reference off bit");
}

Init *getBit(unsigned Bit) const override {
assert(Bit < 1 && "Bit index out of range!");
return const_cast<BitInit*>(this);
Expand Down Expand Up @@ -966,11 +972,12 @@ class VarInit : public TypedInit {
};

/// Opcode{0} - Represent access to one bit of a variable or field.
class VarBitInit : public Init {
class VarBitInit final : public TypedInit {
TypedInit *TI;
unsigned Bit;

VarBitInit(TypedInit *T, unsigned B) : Init(IK_VarBitInit), TI(T), Bit(B) {
VarBitInit(TypedInit *T, unsigned B)
: TypedInit(IK_VarBitInit, BitRecTy::get()), TI(T), Bit(B) {
assert(T->getType() &&
(isa<IntRecTy>(T->getType()) ||
(isa<BitsRecTy>(T->getType()) &&
Expand All @@ -996,6 +1003,11 @@ class VarBitInit : public Init {
std::string getAsString() const override;
Init *resolveReferences(Record &R, const RecordVal *RV) const override;

Init *resolveListElementReference(Record &R, const RecordVal *RV,
unsigned Elt) const override {
llvm_unreachable("Illegal element reference off bit");
}

Init *getBit(unsigned B) const override {
assert(B < 1 && "Bit index out of range!");
return const_cast<VarBitInit*>(this);
Expand Down

0 comments on commit 6e2bf39

Please sign in to comment.