56 P4::ConvertEnums::EnumMapping *enumMap;
59 const IR::ToplevelBlock *toplevel =
nullptr;
63 P4::ConvertEnums::EnumMapping *enumMap)
68 corelib(P4::P4CoreLibrary::instance()),
71 refMap->setIsV1(options.isv1());
74 void serialize(std::ostream &out)
const {
json->toplevel->serialize(out); }
75 virtual void convert(
const IR::ToplevelBlock *block) = 0;
117class RenameUserMetadata :
public Transform {
119 const IR::Type_Struct *userMetaType;
123 bool renamed =
false;
126 RenameUserMetadata(
P4::ReferenceMap *refMap,
const IR::Type_Struct *userMetaType,
128 : refMap(refMap), userMetaType(userMetaType), namePrefix(namePrefix) {
129 setName(
"RenameUserMetadata");
131 visitDagOnce =
false;
134 const IR::Node *postorder(IR::Type_Struct *type)
override {
136 auto orig = getOriginal<IR::Type_Struct>();
137 if (userMetaType->name != orig->name)
return type;
140 LOG2(
"Creating clone of " << orig);
142 auto clone = type->clone();
143 clone->name = namePrefix;
144 vec->push_back(clone);
148 for (
auto f : type->fields) {
149 auto anno = f->getAnnotation(IR::Annotation::nameAnnotation);
150 cstring suffix = cstring::empty;
151 if (anno !=
nullptr) suffix = anno->getName();
152 if (suffix.startsWith(
".")) {
155 fields.push_back(f->clone());
159 if (!suffix.isNullOrEmpty())
160 suffix =
"."_cs + suffix;
162 suffix =
"."_cs + f->name;
163 cstring newName = namePrefix + suffix;
164 LOG2(
"Renaming " << f <<
" to " << newName);
165 auto field =
new IR::StructField(
166 f->srcInfo, f->name, IR::Annotations::setNameAnnotation(f->annotations, newName),
168 fields.push_back(field);
172 new IR::Type_Struct(type->srcInfo, type->name, type->annotations, std::move(fields));
173 vec->push_back(annotated);
177 const IR::Node *preorder(IR::Type_Name *type)
override {
179 auto decl = refMap->getDeclaration(type->path);
180 if (decl == userMetaType)
181 type->path =
new IR::Path(type->path->srcInfo,
IR::ID(type->path->srcInfo, namePrefix));
182 LOG2(
"Replacing reference with " << type);
186 void end_apply(
const IR::Node *)
override {
187 BUG_CHECK(renamed,
"Could not identify user metadata type declaration %1%", userMetaType);