7 #include <llvm/ADT/ilist_node.h>
8 #include <llvm/ADT/ilist.h>
9 #include <llvm/ADT/StringRef.h>
22 template <>
struct llvm::ilist_traits<Item> {
24 using instr_iterator = simple_ilist<Item>::iterator;
27 void deleteNode(Item *inst);
28 void addNodeToList(Item *inst);
29 void removeNodeFromList(Item *inst);
30 void transferNodesFromList(
42 class Item final :
public llvm::ilist_node_with_parent<Item, Atom> {
45 enum class Kind : uint8_t {
73 static Item *CreateInt8(int8_t val);
74 static Item *CreateInt16(int16_t val);
75 static Item *CreateInt32(int32_t val);
76 static Item *CreateInt64(int64_t val);
77 static Item *CreateFloat64(
double val);
78 static Item *CreateSpace(
unsigned val);
79 static Item *CreateExpr32(
Expr *val);
80 static Item *CreateExpr64(
Expr *val);
81 static Item *CreateString(
const std::string_view str);
84 void removeFromParent();
86 void eraseFromParent();
104 size_t GetSize()
const;
107 int8_t GetInt8()
const { assert(kind_ ==
Kind::INT8);
return int8val_; }
108 int16_t GetInt16()
const { assert(kind_ ==
Kind::INT16);
return int16val_; }
109 int32_t GetInt32()
const { assert(kind_ ==
Kind::INT32);
return int32val_; }
110 int64_t GetInt64()
const { assert(kind_ ==
Kind::INT64);
return int64val_; }
115 double GetFloat64()
const
138 const Expr *GetExpr()
const;
142 const Expr *AsExpr()
const;
146 Item(Kind kind) : kind_(kind), parent_(nullptr) {}
149 friend struct llvm::ilist_traits<
Item>;
151 void setParent(
Atom *parent) { parent_ = parent; }
166 std::string stringVal_;