1e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===- Record.cpp - Record implementation ---------------------------------===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// The LLVM Compiler Infrastructure 401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// 53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source 63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===// 9e62c1185bee05facc25d1d725434f517261d308bChris Lattner// 10711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner// Implement the tablegen record classes. 11e62c1185bee05facc25d1d725434f517261d308bChris Lattner// 12e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 13e62c1185bee05facc25d1d725434f517261d308bChris Lattner 147c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Record.h" 15726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene#include "llvm/ADT/DenseMap.h" 16726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene#include "llvm/ADT/FoldingSet.h" 17c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth#include "llvm/ADT/Hashing.h" 18ca7fd3de360b266783438666054dba198ff77ba2David Greene#include "llvm/ADT/STLExtras.h" 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallVector.h" 2099ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner#include "llvm/ADT/StringExtras.h" 21d0e9d04ab04d862392cbc84543ad9d77c58eb966David Greene#include "llvm/ADT/StringMap.h" 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/DataTypes.h" 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h" 24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/Format.h" 25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/TableGen/Error.h" 266fb9a84e79212f550981b6545aa435e7ca0cd794Duraid Madina 272082ebe8b3a5db302748828ab4f79a36d239c1d9Chris Lattnerusing namespace llvm; 28e62c1185bee05facc25d1d725434f517261d308bChris Lattner 29e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 30cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene// std::string wrapper for DenseMap purposes 31cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene//===----------------------------------------------------------------------===// 32cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene 33c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruthnamespace llvm { 34c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth 35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// This is a wrapper for std::string suitable for using as a key to a DenseMap. 36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Because there isn't a particularly 37cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene/// good way to indicate tombstone or empty keys for strings, we want 38cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene/// to wrap std::string to indicate that this is a "special" string 39cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene/// not expected to take on certain values (those of the tombstone and 40cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene/// empty keys). This makes things a little safer as it clarifies 41cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene/// that DenseMap is really not appropriate for general strings. 42cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene 43cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greeneclass TableGenStringKey { 44cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greenepublic: 45cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene TableGenStringKey(const std::string &str) : data(str) {} 46cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene TableGenStringKey(const char *str) : data(str) {} 47cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene 48cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene const std::string &str() const { return data; } 49c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth 50c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth friend hash_code hash_value(const TableGenStringKey &Value) { 51c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth using llvm::hash_value; 52c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth return hash_value(Value.str()); 53c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth } 54cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greeneprivate: 55cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene std::string data; 56cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene}; 57cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene 58cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene/// Specialize DenseMapInfo for TableGenStringKey. 59cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greenetemplate<> struct DenseMapInfo<TableGenStringKey> { 60cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene static inline TableGenStringKey getEmptyKey() { 61cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene TableGenStringKey Empty("<<<EMPTY KEY>>>"); 62cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene return Empty; 63cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene } 64cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene static inline TableGenStringKey getTombstoneKey() { 65cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene TableGenStringKey Tombstone("<<<TOMBSTONE KEY>>>"); 66cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene return Tombstone; 67cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene } 68cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene static unsigned getHashValue(const TableGenStringKey& Val) { 69c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth using llvm::hash_value; 70c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth return hash_value(Val); 71cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene } 72cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene static bool isEqual(const TableGenStringKey& LHS, 73cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene const TableGenStringKey& RHS) { 74cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene return LHS.str() == RHS.str(); 75cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene } 76cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene}; 77cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene 78c78bd9ba6beaa42e2c1de14a3cc519cfdbfd593aChandler Carruth} // namespace llvm 79cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene 80cd0bc905d2c100edbf2f65ac7f1d58353fb1728cDavid Greene//===----------------------------------------------------------------------===// 81e62c1185bee05facc25d1d725434f517261d308bChris Lattner// Type implementations 82e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 83e62c1185bee05facc25d1d725434f517261d308bChris Lattner 8477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund OlesenBitRecTy BitRecTy::Shared; 85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarCodeRecTy CodeRecTy::Shared; 8677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund OlesenIntRecTy IntRecTy::Shared; 8777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund OlesenStringRecTy StringRecTy::Shared; 8877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund OlesenDagRecTy DagRecTy::Shared; 8977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_DUMP_METHOD void RecTy::dump() const { print(errs()); } 91e62c1185bee05facc25d1d725434f517261d308bChris Lattner 9277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund OlesenListRecTy *RecTy::getListTy() { 9377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen if (!ListTy) 946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ListTy.reset(new ListRecTy(this)); 956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return ListTy.get(); 9677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen} 9777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool RecTy::typeIsConvertibleTo(const RecTy *RHS) const { 996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(RHS && "NULL pointer"); 10037fda193d292d78c672b8019723c7907af312c43Sean Silva return Kind == RHS->getRecTyKind(); 10137fda193d292d78c672b8019723c7907af312c43Sean Silva} 10237fda193d292d78c672b8019723c7907af312c43Sean Silva 1036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool BitRecTy::typeIsConvertibleTo(const RecTy *RHS) const{ 1046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (RecTy::typeIsConvertibleTo(RHS) || RHS->getRecTyKind() == IntRecTyKind) 10537fda193d292d78c672b8019723c7907af312c43Sean Silva return true; 1066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (const BitsRecTy *BitsTy = dyn_cast<BitsRecTy>(RHS)) 10737fda193d292d78c672b8019723c7907af312c43Sean Silva return BitsTy->getNumBits() == 1; 10837fda193d292d78c672b8019723c7907af312c43Sean Silva return false; 10937fda193d292d78c672b8019723c7907af312c43Sean Silva} 11037fda193d292d78c672b8019723c7907af312c43Sean Silva 11177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund OlesenBitsRecTy *BitsRecTy::get(unsigned Sz) { 1126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static std::vector<std::unique_ptr<BitsRecTy>> Shared; 11377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen if (Sz >= Shared.size()) 11477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen Shared.resize(Sz + 1); 1156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<BitsRecTy> &Ty = Shared[Sz]; 11677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen if (!Ty) 1176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Ty.reset(new BitsRecTy(Sz)); 1186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Ty.get(); 11977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen} 12077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 12199ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattnerstd::string BitsRecTy::getAsString() const { 12299ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner return "bits<" + utostr(Size) + ">"; 12399ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner} 12499ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner 1256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool BitsRecTy::typeIsConvertibleTo(const RecTy *RHS) const { 1266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (RecTy::typeIsConvertibleTo(RHS)) //argument and the sender are same type 12737fda193d292d78c672b8019723c7907af312c43Sean Silva return cast<BitsRecTy>(RHS)->Size == Size; 12837fda193d292d78c672b8019723c7907af312c43Sean Silva RecTyKind kind = RHS->getRecTyKind(); 12937fda193d292d78c672b8019723c7907af312c43Sean Silva return (kind == BitRecTyKind && Size == 1) || (kind == IntRecTyKind); 13037fda193d292d78c672b8019723c7907af312c43Sean Silva} 13137fda193d292d78c672b8019723c7907af312c43Sean Silva 1326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool IntRecTy::typeIsConvertibleTo(const RecTy *RHS) const { 13337fda193d292d78c672b8019723c7907af312c43Sean Silva RecTyKind kind = RHS->getRecTyKind(); 13437fda193d292d78c672b8019723c7907af312c43Sean Silva return kind==BitRecTyKind || kind==BitsRecTyKind || kind==IntRecTyKind; 13537fda193d292d78c672b8019723c7907af312c43Sean Silva} 13637fda193d292d78c672b8019723c7907af312c43Sean Silva 1376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstd::string StringRecTy::getAsString() const { 1386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return "string"; 139e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 140e62c1185bee05facc25d1d725434f517261d308bChris Lattner 14199ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattnerstd::string ListRecTy::getAsString() const { 14299ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner return "list<" + Ty->getAsString() + ">"; 14399ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner} 14499ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner 1456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool ListRecTy::typeIsConvertibleTo(const RecTy *RHS) const { 1466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (const auto *ListTy = dyn_cast<ListRecTy>(RHS)) 1476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Ty->typeIsConvertibleTo(ListTy->getElementType()); 14837fda193d292d78c672b8019723c7907af312c43Sean Silva return false; 14937fda193d292d78c672b8019723c7907af312c43Sean Silva} 15037fda193d292d78c672b8019723c7907af312c43Sean Silva 1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstd::string DagRecTy::getAsString() const { 1526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return "dag"; 15330d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng} 15430d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng 15577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund OlesenRecordRecTy *RecordRecTy::get(Record *R) { 156736ceace11249da645ec4ed91b8714832193ead4Sean Silva return dyn_cast<RecordRecTy>(R->getDefInit()->getType()); 15777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen} 15877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 15999ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattnerstd::string RecordRecTy::getAsString() const { 16099ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner return Rec->getName(); 16199ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner} 16240f71134b9fef0ca06c516f033cc9403394a913cChris Lattner 1636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool RecordRecTy::typeIsConvertibleTo(const RecTy *RHS) const { 16437fda193d292d78c672b8019723c7907af312c43Sean Silva const RecordRecTy *RTy = dyn_cast<RecordRecTy>(RHS); 16537fda193d292d78c672b8019723c7907af312c43Sean Silva if (!RTy) 16637fda193d292d78c672b8019723c7907af312c43Sean Silva return false; 16737fda193d292d78c672b8019723c7907af312c43Sean Silva 1686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (RTy->getRecord() == Rec || Rec->isSubClassOf(RTy->getRecord())) 16993583c97f8d265b0e6bf8b561aae0c82dbf2bc06Bruno Cardoso Lopes return true; 17093583c97f8d265b0e6bf8b561aae0c82dbf2bc06Bruno Cardoso Lopes 171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (const auto &SCPair : RTy->getRecord()->getSuperClasses()) 172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Rec->isSubClassOf(SCPair.first)) 17393583c97f8d265b0e6bf8b561aae0c82dbf2bc06Bruno Cardoso Lopes return true; 17493583c97f8d265b0e6bf8b561aae0c82dbf2bc06Bruno Cardoso Lopes 17593583c97f8d265b0e6bf8b561aae0c82dbf2bc06Bruno Cardoso Lopes return false; 1767cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner} 1777cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 178e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid GreeneRecTy *llvm::resolveTypes(RecTy *T1, RecTy *T2) { 17957838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva if (T1->typeIsConvertibleTo(T2)) 18057838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva return T2; 18157838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva if (T2->typeIsConvertibleTo(T1)) 18257838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva return T1; 18357838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva 18457838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva // If one is a Record type, check superclasses 185736ceace11249da645ec4ed91b8714832193ead4Sean Silva if (RecordRecTy *RecTy1 = dyn_cast<RecordRecTy>(T1)) { 18657838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva // See if T2 inherits from a type T1 also inherits from 187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (const auto &SuperPair1 : RecTy1->getRecord()->getSuperClasses()) { 188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar RecordRecTy *SuperRecTy1 = RecordRecTy::get(SuperPair1.first); 18957838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva RecTy *NewType1 = resolveTypes(SuperRecTy1, T2); 1906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (NewType1) 19157838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva return NewType1; 19257838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva } 19357838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva } 194736ceace11249da645ec4ed91b8714832193ead4Sean Silva if (RecordRecTy *RecTy2 = dyn_cast<RecordRecTy>(T2)) { 19557838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva // See if T1 inherits from a type T2 also inherits from 196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (const auto &SuperPair2 : RecTy2->getRecord()->getSuperClasses()) { 197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar RecordRecTy *SuperRecTy2 = RecordRecTy::get(SuperPair2.first); 19857838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva RecTy *NewType2 = resolveTypes(T1, SuperRecTy2); 1996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (NewType2) 20057838db0a1cfcfbb8d1df59562dccd22208cd703Sean Silva return NewType2; 201e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 202e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 204e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene} 205e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 206e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 207e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 208e62c1185bee05facc25d1d725434f517261d308bChris Lattner// Initializer implementations 209e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 210e62c1185bee05facc25d1d725434f517261d308bChris Lattner 2112d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid Init::anchor() { } 212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_DUMP_METHOD void Init::dump() const { return print(errs()); } 213e62c1185bee05facc25d1d725434f517261d308bChris Lattner 21405bce0beee87512e52428d4b80f5a8e79a949576David GreeneUnsetInit *UnsetInit::get() { 21505bce0beee87512e52428d4b80f5a8e79a949576David Greene static UnsetInit TheInit; 216ba1ae182876762f17201b33c0b87ca8ede156cfcDavid Greene return &TheInit; 217dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 218dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 2196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit *UnsetInit::convertInitializerTo(RecTy *Ty) const { 2206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *BRT = dyn_cast<BitsRecTy>(Ty)) { 2216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar SmallVector<Init *, 16> NewBits(BRT->getNumBits()); 2226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (unsigned i = 0; i != BRT->getNumBits(); ++i) 2246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NewBits[i] = UnsetInit::get(); 2256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return BitsInit::get(NewBits); 2276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // All other types can just be returned. 2306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<UnsetInit *>(this); 2316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 2322d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 23305bce0beee87512e52428d4b80f5a8e79a949576David GreeneBitInit *BitInit::get(bool V) { 23405bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitInit True(true); 23505bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitInit False(false); 2360ffd167a01cc44e1c3bddf4d71d772a38834a30bDavid Greene 2370ffd167a01cc44e1c3bddf4d71d772a38834a30bDavid Greene return V ? &True : &False; 238dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 239dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 2406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit *BitInit::convertInitializerTo(RecTy *Ty) const { 2416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<BitRecTy>(Ty)) 2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<BitInit *>(this); 2436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<IntRecTy>(Ty)) 2456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return IntInit::get(getValue()); 2466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *BRT = dyn_cast<BitsRecTy>(Ty)) { 2486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Can only convert single bit. 2496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (BRT->getNumBits() == 1) 2506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return BitsInit::get(const_cast<BitInit *>(this)); 2516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 2546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 2556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 256726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greenestatic void 25705bce0beee87512e52428d4b80f5a8e79a949576David GreeneProfileBitsInit(FoldingSetNodeID &ID, ArrayRef<Init *> Range) { 258726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene ID.AddInteger(Range.size()); 259726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 2606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (Init *I : Range) 2616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ID.AddPointer(I); 262726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene} 263726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 26405bce0beee87512e52428d4b80f5a8e79a949576David GreeneBitsInit *BitsInit::get(ArrayRef<Init *> Range) { 2656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static FoldingSet<BitsInit> ThePool; 2666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static std::vector<std::unique_ptr<BitsInit>> TheActualPool; 267726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 268726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene FoldingSetNodeID ID; 269726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene ProfileBitsInit(ID, Range); 270726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 271dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void *IP = nullptr; 27205bce0beee87512e52428d4b80f5a8e79a949576David Greene if (BitsInit *I = ThePool.FindNodeOrInsertPos(ID, IP)) 273726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene return I; 274726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void *Mem = ::operator new (totalSizeToAlloc<Init *>(Range.size())); 276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar BitsInit *I = new (Mem) BitsInit(Range.size()); 277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::uninitialized_copy(Range.begin(), Range.end(), 278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar I->getTrailingObjects<Init *>()); 279726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene ThePool.InsertNode(I, IP); 2806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TheActualPool.push_back(std::unique_ptr<BitsInit>(I)); 281726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene return I; 282726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene} 283726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 284726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greenevoid BitsInit::Profile(FoldingSetNodeID &ID) const { 285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProfileBitsInit(ID, makeArrayRef(getTrailingObjects<Init *>(), NumBits)); 286dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 287dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 2886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit *BitsInit::convertInitializerTo(RecTy *Ty) const { 2896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<BitRecTy>(Ty)) { 2906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (getNumBits() != 1) return nullptr; // Only accept if just one bit! 2916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return getBit(0); 2926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *BRT = dyn_cast<BitsRecTy>(Ty)) { 2956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // If the number of bits is right, return it. Otherwise we need to expand 2966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // or truncate. 2976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (getNumBits() != BRT->getNumBits()) return nullptr; 2986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<BitsInit *>(this); 2996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 3006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 3016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<IntRecTy>(Ty)) { 3026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar int64_t Result = 0; 3036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (unsigned i = 0, e = getNumBits(); i != e; ++i) 3046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *Bit = dyn_cast<BitInit>(getBit(i))) 3056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Result |= static_cast<int64_t>(Bit->getValue()) << i; 3066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else 3076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return IntInit::get(Result); 3096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 3106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 3116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 3136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 31405bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit * 315f37dd02f7743ebd2424480361f5a7db510495c4fDavid GreeneBitsInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) const { 31605bce0beee87512e52428d4b80f5a8e79a949576David Greene SmallVector<Init *, 16> NewBits(Bits.size()); 317ca7fd3de360b266783438666054dba198ff77ba2David Greene 318e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Bits.size(); i != e; ++i) { 319ca7fd3de360b266783438666054dba198ff77ba2David Greene if (Bits[i] >= getNumBits()) 320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 321ca7fd3de360b266783438666054dba198ff77ba2David Greene NewBits[i] = getBit(Bits[i]); 322e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 323dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return BitsInit::get(NewBits); 324e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 325e62c1185bee05facc25d1d725434f517261d308bChris Lattner 3263aba4d39fd101238ac06871895c28f26736d80cbChris Lattnerstd::string BitsInit::getAsString() const { 3273aba4d39fd101238ac06871895c28f26736d80cbChris Lattner std::string Result = "{ "; 328e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = getNumBits(); i != e; ++i) { 3293aba4d39fd101238ac06871895c28f26736d80cbChris Lattner if (i) Result += ", "; 33005bce0beee87512e52428d4b80f5a8e79a949576David Greene if (Init *Bit = getBit(e-i-1)) 3313aba4d39fd101238ac06871895c28f26736d80cbChris Lattner Result += Bit->getAsString(); 33223ffa4a48820e58b411cf94a66b2a0d91173fbfaChris Lattner else 3333aba4d39fd101238ac06871895c28f26736d80cbChris Lattner Result += "*"; 334e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 3353aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return Result + " }"; 336e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 337e62c1185bee05facc25d1d725434f517261d308bChris Lattner 338307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao// Fix bit initializer to preserve the behavior that bit reference from a unset 339307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao// bits initializer will resolve into VarBitInit to keep the field name and bit 340307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao// number used in targets with fixed insn length. 341307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liaostatic Init *fixBitInit(const RecordVal *RV, Init *Before, Init *After) { 3426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (RV || !isa<UnsetInit>(After)) 343307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return After; 344307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return Before; 345307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao} 346307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 3479b929aa7495ee0b5d389370baeb332456632b2feChris Lattner// resolveReferences - If there are any field references that refer to fields 3489b929aa7495ee0b5d389370baeb332456632b2feChris Lattner// that have been filled in, we can propagate the values now. 3499b929aa7495ee0b5d389370baeb332456632b2feChris Lattner// 35005bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *BitsInit::resolveReferences(Record &R, const RecordVal *RV) const { 35128520c4b61ed71d6c47ce3f9bfc9e2ed659d51a5Chris Lattner bool Changed = false; 35205bce0beee87512e52428d4b80f5a8e79a949576David Greene SmallVector<Init *, 16> NewBits(getNumBits()); 35328520c4b61ed71d6c47ce3f9bfc9e2ed659d51a5Chris Lattner 354dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *CachedInit = nullptr; 355dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *CachedBitVar = nullptr; 356307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao bool CachedBitVarChanged = false; 357307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 358307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao for (unsigned i = 0, e = getNumBits(); i != e; ++i) { 359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Init *CurBit = getBit(i); 360307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao Init *CurBitVar = CurBit->getBitVar(); 361ade0de91236a5967e323a810b21bda4b0425642fChris Lattner 362ca7fd3de360b266783438666054dba198ff77ba2David Greene NewBits[i] = CurBit; 363307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 364307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao if (CurBitVar == CachedBitVar) { 365307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao if (CachedBitVarChanged) { 366307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao Init *Bit = CachedInit->getBit(CurBit->getBitNum()); 367307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao NewBits[i] = fixBitInit(RV, CurBit, Bit); 368307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 369307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao continue; 370307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 371307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao CachedBitVar = CurBitVar; 372307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao CachedBitVarChanged = false; 373307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 374307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao Init *B; 375307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao do { 376307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao B = CurBitVar; 377307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao CurBitVar = CurBitVar->resolveReferences(R, RV); 378307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao CachedBitVarChanged |= B != CurBitVar; 379307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao Changed |= B != CurBitVar; 380307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } while (B != CurBitVar); 381307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao CachedInit = CurBitVar; 382307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 383307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao if (CachedBitVarChanged) { 384307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao Init *Bit = CurBitVar->getBit(CurBit->getBitNum()); 385307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao NewBits[i] = fixBitInit(RV, CurBit, Bit); 386307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 38728520c4b61ed71d6c47ce3f9bfc9e2ed659d51a5Chris Lattner } 38828520c4b61ed71d6c47ce3f9bfc9e2ed659d51a5Chris Lattner 38928520c4b61ed71d6c47ce3f9bfc9e2ed659d51a5Chris Lattner if (Changed) 390dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return BitsInit::get(NewBits); 391ca7fd3de360b266783438666054dba198ff77ba2David Greene 39205bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<BitsInit *>(this); 39328520c4b61ed71d6c47ce3f9bfc9e2ed659d51a5Chris Lattner} 39428520c4b61ed71d6c47ce3f9bfc9e2ed659d51a5Chris Lattner 39505bce0beee87512e52428d4b80f5a8e79a949576David GreeneIntInit *IntInit::get(int64_t V) { 3966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static DenseMap<int64_t, std::unique_ptr<IntInit>> ThePool; 3972855b0f0730b1a31aa156ea667fee79f66be4b03David Greene 3986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<IntInit> &I = ThePool[V]; 3996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!I) I.reset(new IntInit(V)); 4006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return I.get(); 401dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 402dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 4033aba4d39fd101238ac06871895c28f26736d80cbChris Lattnerstd::string IntInit::getAsString() const { 4043aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return itostr(Value); 4053aba4d39fd101238ac06871895c28f26736d80cbChris Lattner} 4063aba4d39fd101238ac06871895c28f26736d80cbChris Lattner 4076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic bool canFitInBitfield(int64_t Value, unsigned NumBits) { 4086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // For example, with NumBits == 4, we permit Values from [-7 .. 15]. 4096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return (NumBits >= sizeof(Value) * 8) || 4106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar (Value >> NumBits == 0) || (Value >> (NumBits-1) == -1); 4116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 4126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit *IntInit::convertInitializerTo(RecTy *Ty) const { 4146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<IntRecTy>(Ty)) 4156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<IntInit *>(this); 4166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<BitRecTy>(Ty)) { 4186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar int64_t Val = getValue(); 4196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Val != 0 && Val != 1) return nullptr; // Only accept 0 or 1 for a bit! 4206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return BitInit::get(Val != 0); 4216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *BRT = dyn_cast<BitsRecTy>(Ty)) { 4246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar int64_t Value = getValue(); 4256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Make sure this bitfield is large enough to hold the integer value. 4266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!canFitInBitfield(Value, BRT->getNumBits())) 4276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 4286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar SmallVector<Init *, 16> NewBits(BRT->getNumBits()); 4306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (unsigned i = 0; i != BRT->getNumBits(); ++i) 4316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NewBits[i] = BitInit::get(Value & (1LL << i)); 4326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return BitsInit::get(NewBits); 4346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 4376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 4386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 43905bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit * 440f37dd02f7743ebd2424480361f5a7db510495c4fDavid GreeneIntInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) const { 44105bce0beee87512e52428d4b80f5a8e79a949576David Greene SmallVector<Init *, 16> NewBits(Bits.size()); 442e62c1185bee05facc25d1d725434f517261d308bChris Lattner 443e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Bits.size(); i != e; ++i) { 444ca7fd3de360b266783438666054dba198ff77ba2David Greene if (Bits[i] >= 64) 445dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 446ca7fd3de360b266783438666054dba198ff77ba2David Greene 447dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene NewBits[i] = BitInit::get(Value & (INT64_C(1) << Bits[i])); 448d4a9066c93da9a5aab47ca228d82e796fdec70c0David Greene } 449dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return BitsInit::get(NewBits); 450dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 451dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarCodeInit *CodeInit::get(StringRef V) { 453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static StringMap<std::unique_ptr<CodeInit>> ThePool; 454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<CodeInit> &I = ThePool[V]; 456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!I) I.reset(new CodeInit(V)); 457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return I.get(); 458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 460ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund OlesenStringInit *StringInit::get(StringRef V) { 4616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static StringMap<std::unique_ptr<StringInit>> ThePool; 462d0e9d04ab04d862392cbc84543ad9d77c58eb966David Greene 4636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<StringInit> &I = ThePool[V]; 4646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!I) I.reset(new StringInit(V)); 4656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return I.get(); 4666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 4676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit *StringInit::convertInitializerTo(RecTy *Ty) const { 4696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<StringRecTy>(Ty)) 4706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<StringInit *>(this); 4716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 473dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 474dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarInit *CodeInit::convertInitializerTo(RecTy *Ty) const { 476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (isa<CodeRecTy>(Ty)) 477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return const_cast<CodeInit *>(this); 478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return nullptr; 480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 482aad4c9fc37b38cae21343173084c81d789535446David Greenestatic void ProfileListInit(FoldingSetNodeID &ID, 48305bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init *> Range, 484aad4c9fc37b38cae21343173084c81d789535446David Greene RecTy *EltTy) { 485aad4c9fc37b38cae21343173084c81d789535446David Greene ID.AddInteger(Range.size()); 486aad4c9fc37b38cae21343173084c81d789535446David Greene ID.AddPointer(EltTy); 487aad4c9fc37b38cae21343173084c81d789535446David Greene 4886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (Init *I : Range) 4896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ID.AddPointer(I); 490aad4c9fc37b38cae21343173084c81d789535446David Greene} 491aad4c9fc37b38cae21343173084c81d789535446David Greene 49205bce0beee87512e52428d4b80f5a8e79a949576David GreeneListInit *ListInit::get(ArrayRef<Init *> Range, RecTy *EltTy) { 4936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static FoldingSet<ListInit> ThePool; 494dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static std::vector<std::unique_ptr<ListInit>> TheActualPool; 495aad4c9fc37b38cae21343173084c81d789535446David Greene 496aad4c9fc37b38cae21343173084c81d789535446David Greene FoldingSetNodeID ID; 497aad4c9fc37b38cae21343173084c81d789535446David Greene ProfileListInit(ID, Range, EltTy); 498aad4c9fc37b38cae21343173084c81d789535446David Greene 499dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void *IP = nullptr; 50005bce0beee87512e52428d4b80f5a8e79a949576David Greene if (ListInit *I = ThePool.FindNodeOrInsertPos(ID, IP)) 501aad4c9fc37b38cae21343173084c81d789535446David Greene return I; 502aad4c9fc37b38cae21343173084c81d789535446David Greene 503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void *Mem = ::operator new (totalSizeToAlloc<Init *>(Range.size())); 504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ListInit *I = new (Mem) ListInit(Range.size(), EltTy); 505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::uninitialized_copy(Range.begin(), Range.end(), 506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar I->getTrailingObjects<Init *>()); 507aad4c9fc37b38cae21343173084c81d789535446David Greene ThePool.InsertNode(I, IP); 508dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TheActualPool.push_back(std::unique_ptr<ListInit>(I)); 509aad4c9fc37b38cae21343173084c81d789535446David Greene return I; 510aad4c9fc37b38cae21343173084c81d789535446David Greene} 511aad4c9fc37b38cae21343173084c81d789535446David Greene 512aad4c9fc37b38cae21343173084c81d789535446David Greenevoid ListInit::Profile(FoldingSetNodeID &ID) const { 5136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RecTy *EltTy = cast<ListRecTy>(getType())->getElementType(); 514aad4c9fc37b38cae21343173084c81d789535446David Greene 515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProfileListInit(ID, getValues(), EltTy); 516d4a9066c93da9a5aab47ca228d82e796fdec70c0David Greene} 517d4a9066c93da9a5aab47ca228d82e796fdec70c0David Greene 5186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit *ListInit::convertInitializerTo(RecTy *Ty) const { 5196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *LRT = dyn_cast<ListRecTy>(Ty)) { 5206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::vector<Init*> Elements; 5216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 5226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Verify that all of the elements of the list are subclasses of the 5236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // appropriate class! 5246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (Init *I : getValues()) 5256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Init *CI = I->convertInitializerTo(LRT->getElementType())) 5266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Elements.push_back(CI); 5276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else 5286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 5296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 5306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<ListRecTy>(getType())) 5316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return ListInit::get(Elements, Ty); 5326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 5336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 5346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 5356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 5366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 53705bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit * 538f37dd02f7743ebd2424480361f5a7db510495c4fDavid GreeneListInit::convertInitListSlice(const std::vector<unsigned> &Elements) const { 53905bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Vals; 540b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner for (unsigned i = 0, e = Elements.size(); i != e; ++i) { 5416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Elements[i] >= size()) 542dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 543b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner Vals.push_back(getElement(Elements[i])); 544b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner } 545dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return ListInit::get(Vals, getType()); 546b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner} 547b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner 54850d456539dea5e61d7a1592a78f1861fb35b0063Chris LattnerRecord *ListInit::getElementAsRecord(unsigned i) const { 549de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(i < NumValues && "List element index out of range!"); 550de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DefInit *DI = dyn_cast<DefInit>(getElement(i)); 551dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!DI) 55261131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError("Expected record in list!"); 55350d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner return DI->getDef(); 55450d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner} 55550d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner 55605bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *ListInit::resolveReferences(Record &R, const RecordVal *RV) const { 55705bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Resolved; 5586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Resolved.reserve(size()); 5591dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner bool Changed = false; 5601dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 5616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (Init *CurElt : getValues()) { 56205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *E; 5631dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 5641dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner do { 5651dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner E = CurElt; 5667dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner CurElt = CurElt->resolveReferences(R, RV); 5671dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner Changed |= E != CurElt; 5681dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } while (E != CurElt); 5691dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner Resolved.push_back(E); 5701dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 5711dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 5721dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner if (Changed) 573dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return ListInit::get(Resolved, getType()); 57405bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<ListInit *>(this); 5751dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner} 5761dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 57705bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *ListInit::resolveListElementReference(Record &R, const RecordVal *IRV, 57805bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 5796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Elt >= size()) 580dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; // Out of range reference. 58105bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *E = getElement(Elt); 5822214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson // If the element is set to some value, or if we are resolving a reference 5832214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson // to a specific variable and that variable is explicitly unset, then 5842214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson // replace the VarListElementInit with it. 5853f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (IRV || !isa<UnsetInit>(E)) 5862214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson return E; 587dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 588e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene} 589e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 5903aba4d39fd101238ac06871895c28f26736d80cbChris Lattnerstd::string ListInit::getAsString() const { 5913aba4d39fd101238ac06871895c28f26736d80cbChris Lattner std::string Result = "["; 592de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (unsigned i = 0, e = NumValues; i != e; ++i) { 5933aba4d39fd101238ac06871895c28f26736d80cbChris Lattner if (i) Result += ", "; 594de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Result += getElement(i)->getAsString(); 595e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 5963aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return Result + "]"; 597e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 598e62c1185bee05facc25d1d725434f517261d308bChris Lattner 59905bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *OpInit::resolveListElementReference(Record &R, const RecordVal *IRV, 60005bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 601cedaae125e26d4d98072ed04017ddaebcfa468f8David Greene Init *Resolved = resolveReferences(R, IRV); 6026cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva OpInit *OResolved = dyn_cast<OpInit>(Resolved); 603cedaae125e26d4d98072ed04017ddaebcfa468f8David Greene if (OResolved) { 604dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Resolved = OResolved->Fold(&R, nullptr); 605cedaae125e26d4d98072ed04017ddaebcfa468f8David Greene } 606d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 607cedaae125e26d4d98072ed04017ddaebcfa468f8David Greene if (Resolved != this) { 6086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TypedInit *Typed = cast<TypedInit>(Resolved); 6096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Init *New = Typed->resolveListElementReference(R, IRV, Elt)) 6106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return New; 6116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return VarListElementInit::get(Typed, Elt); 612d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 61321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 614dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 615d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene} 616d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 617307525cd24c3b9c081ddb3c34a3418f2875cd556Michael LiaoInit *OpInit::getBit(unsigned Bit) const { 618307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao if (getType() == BitRecTy::get()) 619307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<OpInit*>(this); 620307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return VarBitInit::get(const_cast<OpInit*>(this), Bit); 621307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao} 622307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 623de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void 624de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarProfileUnOpInit(FoldingSetNodeID &ID, unsigned Opcode, Init *Op, RecTy *Type) { 625de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddInteger(Opcode); 626de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddPointer(Op); 627de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddPointer(Type); 628de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 6296f03b636d26bebad3cfcaaa02a2bbc1b3a6c81b8David Greene 630de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarUnOpInit *UnOpInit::get(UnaryOp Opc, Init *LHS, RecTy *Type) { 631de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static FoldingSet<UnOpInit> ThePool; 632de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static std::vector<std::unique_ptr<UnOpInit>> TheActualPool; 6336f03b636d26bebad3cfcaaa02a2bbc1b3a6c81b8David Greene 634de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FoldingSetNodeID ID; 635de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProfileUnOpInit(ID, Opc, LHS, Type); 636de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 637de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void *IP = nullptr; 638de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (UnOpInit *I = ThePool.FindNodeOrInsertPos(ID, IP)) 639de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return I; 640de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 641de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar UnOpInit *I = new UnOpInit(Opc, LHS, Type); 642de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ThePool.InsertNode(I, IP); 643de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TheActualPool.push_back(std::unique_ptr<UnOpInit>(I)); 644de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return I; 645de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 646de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 647de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid UnOpInit::Profile(FoldingSetNodeID &ID) const { 648de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProfileUnOpInit(ID, getOpcode(), getOperand(), getType()); 649dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 650dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 65105bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *UnOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { 652e6c27de069225e1122c78385ad22a2ff656db8e6David Greene switch (getOpcode()) { 653e6c27de069225e1122c78385ad22a2ff656db8e6David Greene case CAST: { 6546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<StringRecTy>(getType())) { 6553f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (StringInit *LHSs = dyn_cast<StringInit>(LHS)) 6562c0266202dc10a1ff887a8829950b6548d7feee3David Greene return LHSs; 657e6c27de069225e1122c78385ad22a2ff656db8e6David Greene 6583f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (DefInit *LHSd = dyn_cast<DefInit>(LHS)) 6596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return StringInit::get(LHSd->getAsString()); 660448b73a95ca9be6409907b96402f1606cd87d80cDavid Greene 6613f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (IntInit *LHSi = dyn_cast<IntInit>(LHS)) 662448b73a95ca9be6409907b96402f1606cd87d80cDavid Greene return StringInit::get(LHSi->getAsString()); 66321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 6643f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (StringInit *LHSs = dyn_cast<StringInit>(LHS)) { 665de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const std::string &Name = LHSs->getValue(); 6662c0266202dc10a1ff887a8829950b6548d7feee3David Greene 6672c0266202dc10a1ff887a8829950b6548d7feee3David Greene // From TGParser::ParseIDValue 6682c0266202dc10a1ff887a8829950b6548d7feee3David Greene if (CurRec) { 6692c0266202dc10a1ff887a8829950b6548d7feee3David Greene if (const RecordVal *RV = CurRec->getValue(Name)) { 670c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner if (RV->getType() != getType()) 67161131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError("type mismatch in cast"); 672dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return VarInit::get(Name, RV->getType()); 673e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 674e6c27de069225e1122c78385ad22a2ff656db8e6David Greene 675e22b321d2276b634519165b101b02d92c2fcf5c7David Greene Init *TemplateArgName = QualifyName(*CurRec, CurMultiClass, Name, 676e22b321d2276b634519165b101b02d92c2fcf5c7David Greene ":"); 6776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 6782c0266202dc10a1ff887a8829950b6548d7feee3David Greene if (CurRec->isTemplateArg(TemplateArgName)) { 6792c0266202dc10a1ff887a8829950b6548d7feee3David Greene const RecordVal *RV = CurRec->getValue(TemplateArgName); 6802c0266202dc10a1ff887a8829950b6548d7feee3David Greene assert(RV && "Template arg doesn't exist??"); 681e6c27de069225e1122c78385ad22a2ff656db8e6David Greene 682c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner if (RV->getType() != getType()) 68361131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError("type mismatch in cast"); 684e6c27de069225e1122c78385ad22a2ff656db8e6David Greene 685dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return VarInit::get(TemplateArgName, RV->getType()); 686e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 687e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 688e6c27de069225e1122c78385ad22a2ff656db8e6David Greene 6892c0266202dc10a1ff887a8829950b6548d7feee3David Greene if (CurMultiClass) { 6906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Init *MCName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name, 6916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar "::"); 692e22b321d2276b634519165b101b02d92c2fcf5c7David Greene 6932c0266202dc10a1ff887a8829950b6548d7feee3David Greene if (CurMultiClass->Rec.isTemplateArg(MCName)) { 6942c0266202dc10a1ff887a8829950b6548d7feee3David Greene const RecordVal *RV = CurMultiClass->Rec.getValue(MCName); 6952c0266202dc10a1ff887a8829950b6548d7feee3David Greene assert(RV && "Template arg doesn't exist??"); 69621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 697c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner if (RV->getType() != getType()) 69861131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError("type mismatch in cast"); 69921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 700dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return VarInit::get(MCName, RV->getType()); 7012c0266202dc10a1ff887a8829950b6548d7feee3David Greene } 7022c0266202dc10a1ff887a8829950b6548d7feee3David Greene } 703ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert(CurRec && "NULL pointer"); 70467db883487fca3472fdde51e931657e22d4d0495Chris Lattner if (Record *D = (CurRec->getRecords()).getDef(Name)) 70577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen return DefInit::get(D); 706e6c27de069225e1122c78385ad22a2ff656db8e6David Greene 70761131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(CurRec->getLoc(), 70861131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger "Undefined reference:'" + Name + "'\n"); 7092c0266202dc10a1ff887a8829950b6548d7feee3David Greene } 710f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 711f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (isa<IntRecTy>(getType())) { 712f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (BitsInit *BI = dyn_cast<BitsInit>(LHS)) { 713f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (Init *NewInit = BI->convertInitializerTo(IntRecTy::get())) 714f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return NewInit; 715f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar break; 716f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 717f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 718e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 719e6c27de069225e1122c78385ad22a2ff656db8e6David Greene break; 720e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 7211434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene case HEAD: { 7223f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (ListInit *LHSl = dyn_cast<ListInit>(LHS)) { 7236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(!LHSl->empty() && "Empty list in head"); 7245f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene return LHSl->getElement(0); 7255f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene } 7265f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene break; 7275f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene } 7281434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene case TAIL: { 7293f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (ListInit *LHSl = dyn_cast<ListInit>(LHS)) { 7306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(!LHSl->empty() && "Empty list in tail"); 731dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene // Note the +1. We can't just pass the result of getValues() 732dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene // directly. 7336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return ListInit::get(LHSl->getValues().slice(1), LHSl->getType()); 7345f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene } 7355f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene break; 7365f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene } 7371434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene case EMPTY: { 7386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (ListInit *LHSl = dyn_cast<ListInit>(LHS)) 7396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return IntInit::get(LHSl->empty()); 7406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (StringInit *LHSs = dyn_cast<StringInit>(LHS)) 7416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return IntInit::get(LHSs->getValue().empty()); 74221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 7435f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene break; 7445f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene } 745e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 74605bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<UnOpInit *>(this); 747e6c27de069225e1122c78385ad22a2ff656db8e6David Greene} 748e6c27de069225e1122c78385ad22a2ff656db8e6David Greene 74905bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *UnOpInit::resolveReferences(Record &R, const RecordVal *RV) const { 75005bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *lhs = LHS->resolveReferences(R, RV); 75121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 752e6c27de069225e1122c78385ad22a2ff656db8e6David Greene if (LHS != lhs) 753dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return (UnOpInit::get(getOpcode(), lhs, getType()))->Fold(&R, nullptr); 754dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Fold(&R, nullptr); 755e6c27de069225e1122c78385ad22a2ff656db8e6David Greene} 756e6c27de069225e1122c78385ad22a2ff656db8e6David Greene 757e6c27de069225e1122c78385ad22a2ff656db8e6David Greenestd::string UnOpInit::getAsString() const { 758e6c27de069225e1122c78385ad22a2ff656db8e6David Greene std::string Result; 759de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar switch (getOpcode()) { 760e6c27de069225e1122c78385ad22a2ff656db8e6David Greene case CAST: Result = "!cast<" + getType()->getAsString() + ">"; break; 7611434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene case HEAD: Result = "!head"; break; 7621434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene case TAIL: Result = "!tail"; break; 7631434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene case EMPTY: Result = "!empty"; break; 764e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 765e6c27de069225e1122c78385ad22a2ff656db8e6David Greene return Result + "(" + LHS->getAsString() + ")"; 766e6c27de069225e1122c78385ad22a2ff656db8e6David Greene} 767d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 768de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void 769de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarProfileBinOpInit(FoldingSetNodeID &ID, unsigned Opcode, Init *LHS, Init *RHS, 770de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar RecTy *Type) { 771de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddInteger(Opcode); 772de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddPointer(LHS); 773de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddPointer(RHS); 774de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddPointer(Type); 775de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 77665a5b8cb3b32db7681afca62d3e9d92941dbf979David Greene 777de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarBinOpInit *BinOpInit::get(BinaryOp Opc, Init *LHS, 778de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Init *RHS, RecTy *Type) { 779de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static FoldingSet<BinOpInit> ThePool; 780de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static std::vector<std::unique_ptr<BinOpInit>> TheActualPool; 78165a5b8cb3b32db7681afca62d3e9d92941dbf979David Greene 782de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FoldingSetNodeID ID; 783de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProfileBinOpInit(ID, Opc, LHS, RHS, Type); 78465a5b8cb3b32db7681afca62d3e9d92941dbf979David Greene 785de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void *IP = nullptr; 786de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (BinOpInit *I = ThePool.FindNodeOrInsertPos(ID, IP)) 787de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return I; 788de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 789de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar BinOpInit *I = new BinOpInit(Opc, LHS, RHS, Type); 790de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ThePool.InsertNode(I, IP); 791de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TheActualPool.push_back(std::unique_ptr<BinOpInit>(I)); 792de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return I; 793de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 794de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 795de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid BinOpInit::Profile(FoldingSetNodeID &ID) const { 796de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProfileBinOpInit(ID, getOpcode(), getLHS(), getRHS(), getType()); 797dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 798dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 79905bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { 800711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner switch (getOpcode()) { 80130d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng case CONCAT: { 8026cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva DagInit *LHSs = dyn_cast<DagInit>(LHS); 8036cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva DagInit *RHSs = dyn_cast<DagInit>(RHS); 80430d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng if (LHSs && RHSs) { 8056cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva DefInit *LOp = dyn_cast<DefInit>(LHSs->getOperator()); 8066cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva DefInit *ROp = dyn_cast<DefInit>(RHSs->getOperator()); 807dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!LOp || !ROp || LOp->getDef() != ROp->getDef()) 80861131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError("Concated Dag operators do not match!"); 80905bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Args; 81030d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng std::vector<std::string> ArgNames; 81130d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng for (unsigned i = 0, e = LHSs->getNumArgs(); i != e; ++i) { 81230d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng Args.push_back(LHSs->getArg(i)); 81330d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng ArgNames.push_back(LHSs->getArgName(i)); 81430d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng } 81530d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng for (unsigned i = 0, e = RHSs->getNumArgs(); i != e; ++i) { 81630d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng Args.push_back(RHSs->getArg(i)); 81730d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng ArgNames.push_back(RHSs->getArgName(i)); 81830d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng } 819dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return DagInit::get(LHSs->getOperator(), "", Args, ArgNames); 82030d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng } 82130d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng break; 82230d15757e3a203eb4b7170dfccbfd1f93476567bEvan Cheng } 823dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case LISTCONCAT: { 824dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ListInit *LHSs = dyn_cast<ListInit>(LHS); 825dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ListInit *RHSs = dyn_cast<ListInit>(RHS); 826dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (LHSs && RHSs) { 827dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::vector<Init *> Args; 828dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Args.insert(Args.end(), LHSs->begin(), LHSs->end()); 829dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Args.insert(Args.end(), RHSs->begin(), RHSs->end()); 830dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return ListInit::get( 8316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Args, cast<ListRecTy>(LHSs->getType())->getElementType()); 832dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 833dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines break; 834dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 835711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner case STRCONCAT: { 8366cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva StringInit *LHSs = dyn_cast<StringInit>(LHS); 8376cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva StringInit *RHSs = dyn_cast<StringInit>(RHS); 838711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner if (LHSs && RHSs) 839dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return StringInit::get(LHSs->getValue() + RHSs->getValue()); 840711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner break; 841711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner } 8426786d5e18387465d6106eaef0b7923526ef0bc10David Greene case EQ: { 843e87de41189b1591afd88e4dc12eeb17e06b77d3eBruno Cardoso Lopes // try to fold eq comparison for 'bit' and 'int', otherwise fallback 844e87de41189b1591afd88e4dc12eeb17e06b77d3eBruno Cardoso Lopes // to string objects. 845307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao IntInit *L = 8466cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva dyn_cast_or_null<IntInit>(LHS->convertInitializerTo(IntRecTy::get())); 847307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao IntInit *R = 8486cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva dyn_cast_or_null<IntInit>(RHS->convertInitializerTo(IntRecTy::get())); 849e87de41189b1591afd88e4dc12eeb17e06b77d3eBruno Cardoso Lopes 850e87de41189b1591afd88e4dc12eeb17e06b77d3eBruno Cardoso Lopes if (L && R) 851dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return IntInit::get(L->getValue() == R->getValue()); 852e87de41189b1591afd88e4dc12eeb17e06b77d3eBruno Cardoso Lopes 8536cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva StringInit *LHSs = dyn_cast<StringInit>(LHS); 8546cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva StringInit *RHSs = dyn_cast<StringInit>(RHS); 855e87de41189b1591afd88e4dc12eeb17e06b77d3eBruno Cardoso Lopes 856e87de41189b1591afd88e4dc12eeb17e06b77d3eBruno Cardoso Lopes // Make sure we've resolved 8576786d5e18387465d6106eaef0b7923526ef0bc10David Greene if (LHSs && RHSs) 858dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return IntInit::get(LHSs->getValue() == RHSs->getValue()); 8596786d5e18387465d6106eaef0b7923526ef0bc10David Greene 8606786d5e18387465d6106eaef0b7923526ef0bc10David Greene break; 8616786d5e18387465d6106eaef0b7923526ef0bc10David Greene } 862d23a41c153712b929bd84f5e713bda5db5d6e66dHal Finkel case ADD: 86337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case AND: 864711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner case SHL: 865711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner case SRA: 866711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner case SRL: { 86737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines IntInit *LHSi = 86837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines dyn_cast_or_null<IntInit>(LHS->convertInitializerTo(IntRecTy::get())); 86937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines IntInit *RHSi = 87037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines dyn_cast_or_null<IntInit>(RHS->convertInitializerTo(IntRecTy::get())); 871711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner if (LHSi && RHSi) { 87263f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t LHSv = LHSi->getValue(), RHSv = RHSi->getValue(); 87363f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t Result; 874711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner switch (getOpcode()) { 875858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper default: llvm_unreachable("Bad opcode!"); 876d23a41c153712b929bd84f5e713bda5db5d6e66dHal Finkel case ADD: Result = LHSv + RHSv; break; 87737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case AND: Result = LHSv & RHSv; break; 878711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner case SHL: Result = LHSv << RHSv; break; 879711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner case SRA: Result = LHSv >> RHSv; break; 88063f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman case SRL: Result = (uint64_t)LHSv >> (uint64_t)RHSv; break; 881711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner } 882dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return IntInit::get(Result); 883711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner } 884711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner break; 885711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner } 886711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner } 88705bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<BinOpInit *>(this); 888711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner} 889711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner 89005bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *BinOpInit::resolveReferences(Record &R, const RecordVal *RV) const { 89105bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *lhs = LHS->resolveReferences(R, RV); 89205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *rhs = RHS->resolveReferences(R, RV); 89321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 894711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner if (LHS != lhs || RHS != rhs) 895dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return (BinOpInit::get(getOpcode(), lhs, rhs, getType()))->Fold(&R,nullptr); 896dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Fold(&R, nullptr); 897711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner} 898711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner 8993aba4d39fd101238ac06871895c28f26736d80cbChris Lattnerstd::string BinOpInit::getAsString() const { 9003aba4d39fd101238ac06871895c28f26736d80cbChris Lattner std::string Result; 901de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar switch (getOpcode()) { 9023aba4d39fd101238ac06871895c28f26736d80cbChris Lattner case CONCAT: Result = "!con"; break; 903d23a41c153712b929bd84f5e713bda5db5d6e66dHal Finkel case ADD: Result = "!add"; break; 90437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case AND: Result = "!and"; break; 9053aba4d39fd101238ac06871895c28f26736d80cbChris Lattner case SHL: Result = "!shl"; break; 9063aba4d39fd101238ac06871895c28f26736d80cbChris Lattner case SRA: Result = "!sra"; break; 9073aba4d39fd101238ac06871895c28f26736d80cbChris Lattner case SRL: Result = "!srl"; break; 9086786d5e18387465d6106eaef0b7923526ef0bc10David Greene case EQ: Result = "!eq"; break; 909dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case LISTCONCAT: Result = "!listconcat"; break; 9103aba4d39fd101238ac06871895c28f26736d80cbChris Lattner case STRCONCAT: Result = "!strconcat"; break; 911711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner } 9123aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return Result + "(" + LHS->getAsString() + ", " + RHS->getAsString() + ")"; 913711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner} 914711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner 915de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void 916de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarProfileTernOpInit(FoldingSetNodeID &ID, unsigned Opcode, Init *LHS, Init *MHS, 917de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Init *RHS, RecTy *Type) { 918de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddInteger(Opcode); 919de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddPointer(LHS); 920de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddPointer(MHS); 921de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddPointer(RHS); 922de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ID.AddPointer(Type); 923de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 924de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 925de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarTernOpInit *TernOpInit::get(TernaryOp Opc, Init *LHS, Init *MHS, Init *RHS, 9266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RecTy *Type) { 927de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static FoldingSet<TernOpInit> ThePool; 928de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static std::vector<std::unique_ptr<TernOpInit>> TheActualPool; 929de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 930de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FoldingSetNodeID ID; 931de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProfileTernOpInit(ID, Opc, LHS, MHS, RHS, Type); 932de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 933de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void *IP = nullptr; 934de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (TernOpInit *I = ThePool.FindNodeOrInsertPos(ID, IP)) 935de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return I; 936de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 937de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TernOpInit *I = new TernOpInit(Opc, LHS, MHS, RHS, Type); 938de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ThePool.InsertNode(I, IP); 939de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TheActualPool.push_back(std::unique_ptr<TernOpInit>(I)); 940de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return I; 941de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 942de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 943de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid TernOpInit::Profile(FoldingSetNodeID &ID) const { 944de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProfileTernOpInit(ID, getOpcode(), getLHS(), getMHS(), getRHS(), getType()); 945dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 946dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 94705bce0beee87512e52428d4b80f5a8e79a949576David Greenestatic Init *ForeachHelper(Init *LHS, Init *MHS, Init *RHS, RecTy *Type, 94805bce0beee87512e52428d4b80f5a8e79a949576David Greene Record *CurRec, MultiClass *CurMultiClass); 949beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 95005bce0beee87512e52428d4b80f5a8e79a949576David Greenestatic Init *EvaluateOperation(OpInit *RHSo, Init *LHS, Init *Arg, 95105bce0beee87512e52428d4b80f5a8e79a949576David Greene RecTy *Type, Record *CurRec, 95205bce0beee87512e52428d4b80f5a8e79a949576David Greene MultiClass *CurMultiClass) { 953beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene // If this is a dag, recurse 9546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *TArg = dyn_cast<TypedInit>(Arg)) 9556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<DagRecTy>(TArg->getType())) 9566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return ForeachHelper(LHS, Arg, RHSo, Type, CurRec, CurMultiClass); 957beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 9586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::vector<Init *> NewOperands; 9596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (unsigned i = 0; i < RHSo->getNumOperands(); ++i) { 9606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *RHSoo = dyn_cast<OpInit>(RHSo->getOperand(i))) { 9616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Init *Result = EvaluateOperation(RHSoo, LHS, Arg, 9626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Type, CurRec, CurMultiClass)) 963beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene NewOperands.push_back(Result); 9646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else 965beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene NewOperands.push_back(Arg); 96621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else if (LHS->getAsString() == RHSo->getOperand(i)->getAsString()) { 967beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene NewOperands.push_back(Arg); 96821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 969beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene NewOperands.push_back(RHSo->getOperand(i)); 970beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 971beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 972beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 973beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene // Now run the operator and use its result as the new leaf 974f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene const OpInit *NewOp = RHSo->clone(NewOperands); 97505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *NewVal = NewOp->Fold(CurRec, CurMultiClass); 976dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return (NewVal != NewOp) ? NewVal : nullptr; 977beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene} 978beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 97905bce0beee87512e52428d4b80f5a8e79a949576David Greenestatic Init *ForeachHelper(Init *LHS, Init *MHS, Init *RHS, RecTy *Type, 98005bce0beee87512e52428d4b80f5a8e79a949576David Greene Record *CurRec, MultiClass *CurMultiClass) { 981beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 9826cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva OpInit *RHSo = dyn_cast<OpInit>(RHS); 983beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 9846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!RHSo) 98561131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(CurRec->getLoc(), "!foreach requires an operator\n"); 986beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 9876cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva TypedInit *LHSt = dyn_cast<TypedInit>(LHS); 988beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 98961131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger if (!LHSt) 99061131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(CurRec->getLoc(), "!foreach requires typed variable\n"); 991beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 9926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar DagInit *MHSd = dyn_cast<DagInit>(MHS); 9936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (MHSd && isa<DagRecTy>(Type)) { 9946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Init *Val = MHSd->getOperator(); 9956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Init *Result = EvaluateOperation(RHSo, LHS, Val, 9966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Type, CurRec, CurMultiClass)) 9976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Val = Result; 9986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::vector<std::pair<Init *, std::string> > args; 10006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (unsigned int i = 0; i < MHSd->getNumArgs(); ++i) { 10016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Init *Arg = MHSd->getArg(i); 10026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::string ArgName = MHSd->getArgName(i); 10036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Process args 10056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Init *Result = EvaluateOperation(RHSo, LHS, Arg, Type, 10066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CurRec, CurMultiClass)) 10076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Arg = Result; 10086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // TODO: Process arg names 10106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar args.push_back(std::make_pair(Arg, ArgName)); 10116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 1012beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 10136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return DagInit::get(Val, "", args); 10146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 1015beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 10166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ListInit *MHSl = dyn_cast<ListInit>(MHS); 10176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (MHSl && isa<ListRecTy>(Type)) { 10186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::vector<Init *> NewOperands; 10196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::vector<Init *> NewList(MHSl->begin(), MHSl->end()); 10206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (Init *&Item : NewList) { 10226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NewOperands.clear(); 10236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for(unsigned i = 0; i < RHSo->getNumOperands(); ++i) { 10246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // First, replace the foreach variable with the list item 10256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (LHS->getAsString() == RHSo->getOperand(i)->getAsString()) 10266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NewOperands.push_back(Item); 10276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else 10286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NewOperands.push_back(RHSo->getOperand(i)); 1029beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 1030beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 10316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Now run the operator and use its result as the new list item 10326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const OpInit *NewOp = RHSo->clone(NewOperands); 10336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Init *NewItem = NewOp->Fold(CurRec, CurMultiClass); 10346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (NewItem != NewOp) 10356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Item = NewItem; 1036beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 10376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return ListInit::get(NewList, MHSl->getType()); 1038beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 1039dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1040beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene} 1041beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 104205bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *TernOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { 10434afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene switch (getOpcode()) { 10444afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene case SUBST: { 10456cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva DefInit *LHSd = dyn_cast<DefInit>(LHS); 10466cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva VarInit *LHSv = dyn_cast<VarInit>(LHS); 10476cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva StringInit *LHSs = dyn_cast<StringInit>(LHS); 10484afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 10496cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva DefInit *MHSd = dyn_cast<DefInit>(MHS); 10506cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva VarInit *MHSv = dyn_cast<VarInit>(MHS); 10516cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva StringInit *MHSs = dyn_cast<StringInit>(MHS); 10524afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 10536cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva DefInit *RHSd = dyn_cast<DefInit>(RHS); 10546cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva VarInit *RHSv = dyn_cast<VarInit>(RHS); 10556cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva StringInit *RHSs = dyn_cast<StringInit>(RHS); 10564afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 10576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (LHSd && MHSd && RHSd) { 10586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Record *Val = RHSd->getDef(); 10596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (LHSd->getAsString() == RHSd->getAsString()) 10606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Val = MHSd->getDef(); 10616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return DefInit::get(Val); 10626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (LHSv && MHSv && RHSv) { 10646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::string Val = RHSv->getName(); 10656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (LHSv->getAsString() == RHSv->getAsString()) 10666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Val = MHSv->getName(); 10676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return VarInit::get(Val, getType()); 10686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (LHSs && MHSs && RHSs) { 10706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::string Val = RHSs->getValue(); 10716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::string::size_type found; 10736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::string::size_type idx = 0; 10746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar while (true) { 10756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar found = Val.find(LHSs->getValue(), idx); 10766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (found == std::string::npos) 10776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 10786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Val.replace(found, LHSs->getValue().size(), MHSs->getValue()); 10796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar idx = found + MHSs->getValue().size(); 10804afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10814afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 10826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return StringInit::get(Val); 10834afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10844afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene break; 108521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } 10864afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 10874afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene case FOREACH: { 10886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Init *Result = ForeachHelper(LHS, MHS, RHS, getType(), 10896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CurRec, CurMultiClass)) 1090beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene return Result; 10914afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene break; 10924afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10939bea7c85d71bbb192f686a56e9b5bf32ae3389e6David Greene 10949bea7c85d71bbb192f686a56e9b5bf32ae3389e6David Greene case IF: { 10956cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva IntInit *LHSi = dyn_cast<IntInit>(LHS); 109605bce0beee87512e52428d4b80f5a8e79a949576David Greene if (Init *I = LHS->convertInitializerTo(IntRecTy::get())) 10976cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva LHSi = dyn_cast<IntInit>(I); 10989bea7c85d71bbb192f686a56e9b5bf32ae3389e6David Greene if (LHSi) { 10996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (LHSi->getValue()) 11009bea7c85d71bbb192f686a56e9b5bf32ae3389e6David Greene return MHS; 11016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return RHS; 11029bea7c85d71bbb192f686a56e9b5bf32ae3389e6David Greene } 11039bea7c85d71bbb192f686a56e9b5bf32ae3389e6David Greene break; 11049bea7c85d71bbb192f686a56e9b5bf32ae3389e6David Greene } 11054afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 11064afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 110705bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<TernOpInit *>(this); 11084afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene} 11094afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 111005bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *TernOpInit::resolveReferences(Record &R, 111105bce0beee87512e52428d4b80f5a8e79a949576David Greene const RecordVal *RV) const { 111205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *lhs = LHS->resolveReferences(R, RV); 111377c489dcae2d7906fae653e2d25e023004d1b9e4David Greene 1114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (getOpcode() == IF && lhs != LHS) { 11156cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva IntInit *Value = dyn_cast<IntInit>(lhs); 111605bce0beee87512e52428d4b80f5a8e79a949576David Greene if (Init *I = lhs->convertInitializerTo(IntRecTy::get())) 11176cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva Value = dyn_cast<IntInit>(I); 1118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Value) { 111977c489dcae2d7906fae653e2d25e023004d1b9e4David Greene // Short-circuit 112077c489dcae2d7906fae653e2d25e023004d1b9e4David Greene if (Value->getValue()) { 112105bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *mhs = MHS->resolveReferences(R, RV); 1122dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return (TernOpInit::get(getOpcode(), lhs, mhs, 1123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RHS, getType()))->Fold(&R, nullptr); 112477c489dcae2d7906fae653e2d25e023004d1b9e4David Greene } 11256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Init *rhs = RHS->resolveReferences(R, RV); 11266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return (TernOpInit::get(getOpcode(), lhs, MHS, 11276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar rhs, getType()))->Fold(&R, nullptr); 112877c489dcae2d7906fae653e2d25e023004d1b9e4David Greene } 112977c489dcae2d7906fae653e2d25e023004d1b9e4David Greene } 113021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 113105bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *mhs = MHS->resolveReferences(R, RV); 113205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *rhs = RHS->resolveReferences(R, RV); 113377c489dcae2d7906fae653e2d25e023004d1b9e4David Greene 11344afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene if (LHS != lhs || MHS != mhs || RHS != rhs) 1135dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return (TernOpInit::get(getOpcode(), lhs, mhs, rhs, 1136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines getType()))->Fold(&R, nullptr); 1137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Fold(&R, nullptr); 11384afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene} 11394afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 11404afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greenestd::string TernOpInit::getAsString() const { 11414afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene std::string Result; 1142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar switch (getOpcode()) { 11434afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene case SUBST: Result = "!subst"; break; 114421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson case FOREACH: Result = "!foreach"; break; 114521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson case IF: Result = "!if"; break; 11466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Result + "(" + LHS->getAsString() + ", " + MHS->getAsString() + ", " + 11486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RHS->getAsString() + ")"; 11494afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene} 1150e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 11519703843dfa5640ddfc4362d7aa20b03fba485eceDavid GreeneRecTy *TypedInit::getFieldType(const std::string &FieldName) const { 115263554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva if (RecordRecTy *RecordType = dyn_cast<RecordRecTy>(getType())) 115363554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva if (RecordVal *Field = RecordType->getRecord()->getValue(FieldName)) 11549703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene return Field->getType(); 1155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 11569703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene} 11579703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene 115805bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit * 11596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarTypedInit::convertInitializerTo(RecTy *Ty) const { 11606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<IntRecTy>(Ty)) { 11616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (getType()->typeIsConvertibleTo(Ty)) 11626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<TypedInit *>(this); 11636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 11646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 11666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<StringRecTy>(Ty)) { 11676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<StringRecTy>(getType())) 11686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<TypedInit *>(this); 11696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 11706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (isa<CodeRecTy>(Ty)) { 1173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (isa<CodeRecTy>(getType())) 1174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return const_cast<TypedInit *>(this); 1175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return nullptr; 1176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 1177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 11786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<BitRecTy>(Ty)) { 11796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Accept variable if it is already of bit type! 11806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<BitRecTy>(getType())) 11816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<TypedInit *>(this); 11826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *BitsTy = dyn_cast<BitsRecTy>(getType())) { 11836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Accept only bits<1> expression. 11846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (BitsTy->getNumBits() == 1) 11856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<TypedInit *>(this); 11866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 11876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Ternary !if can be converted to bit, but only if both sides are 11896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // convertible to a bit. 11906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (const auto *TOI = dyn_cast<TernOpInit>(this)) { 11916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (TOI->getOpcode() == TernOpInit::TernaryOp::IF && 11926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TOI->getMHS()->convertInitializerTo(BitRecTy::get()) && 11936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TOI->getRHS()->convertInitializerTo(BitRecTy::get())) 11946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<TypedInit *>(this); 11956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 11966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 11986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 12006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *BRT = dyn_cast<BitsRecTy>(Ty)) { 12016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (BRT->getNumBits() == 1 && isa<BitRecTy>(getType())) 12026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return BitsInit::get(const_cast<TypedInit *>(this)); 12036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 12046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (getType()->typeIsConvertibleTo(BRT)) { 12056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar SmallVector<Init *, 16> NewBits(BRT->getNumBits()); 12066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 12076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (unsigned i = 0; i != BRT->getNumBits(); ++i) 12086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NewBits[i] = VarBitInit::get(const_cast<TypedInit *>(this), i); 12096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return BitsInit::get(NewBits); 12106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 12116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 12126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 12136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 12146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 12156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *DLRT = dyn_cast<ListRecTy>(Ty)) { 12166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *SLRT = dyn_cast<ListRecTy>(getType())) 12176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (SLRT->getElementType()->typeIsConvertibleTo(DLRT->getElementType())) 12186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<TypedInit *>(this); 12196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 12206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 12216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 12226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *DRT = dyn_cast<DagRecTy>(Ty)) { 12236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (getType()->typeIsConvertibleTo(DRT)) 12246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<TypedInit *>(this); 12256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 12266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 12276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 12286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *SRRT = dyn_cast<RecordRecTy>(Ty)) { 12296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Ensure that this is compatible with Rec. 12306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (RecordRecTy *DRRT = dyn_cast<RecordRecTy>(getType())) 12316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (DRRT->getRecord()->isSubClassOf(SRRT->getRecord()) || 12326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar DRRT->getRecord() == SRRT->getRecord()) 12336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<TypedInit *>(this); 12346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 12356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 12366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 12376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 12386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 12396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 12406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit * 1241f37dd02f7743ebd2424480361f5a7db510495c4fDavid GreeneTypedInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) const { 1242736ceace11249da645ec4ed91b8714832193ead4Sean Silva BitsRecTy *T = dyn_cast<BitsRecTy>(getType()); 1243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!T) return nullptr; // Cannot subscript a non-bits variable. 1244e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned NumBits = T->getNumBits(); 1245e62c1185bee05facc25d1d725434f517261d308bChris Lattner 124605bce0beee87512e52428d4b80f5a8e79a949576David Greene SmallVector<Init *, 16> NewBits(Bits.size()); 1247e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Bits.size(); i != e; ++i) { 1248ca7fd3de360b266783438666054dba198ff77ba2David Greene if (Bits[i] >= NumBits) 1249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1250ca7fd3de360b266783438666054dba198ff77ba2David Greene 125105bce0beee87512e52428d4b80f5a8e79a949576David Greene NewBits[i] = VarBitInit::get(const_cast<TypedInit *>(this), Bits[i]); 1252e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1253dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return BitsInit::get(NewBits); 1254e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1255e62c1185bee05facc25d1d725434f517261d308bChris Lattner 125605bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit * 1257f37dd02f7743ebd2424480361f5a7db510495c4fDavid GreeneTypedInit::convertInitListSlice(const std::vector<unsigned> &Elements) const { 1258736ceace11249da645ec4ed91b8714832193ead4Sean Silva ListRecTy *T = dyn_cast<ListRecTy>(getType()); 1259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!T) return nullptr; // Cannot subscript a non-list variable. 12601dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 12611dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner if (Elements.size() == 1) 126205bce0beee87512e52428d4b80f5a8e79a949576David Greene return VarListElementInit::get(const_cast<TypedInit *>(this), Elements[0]); 12631dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 126405bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> ListInits; 12651dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner ListInits.reserve(Elements.size()); 12661dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner for (unsigned i = 0, e = Elements.size(); i != e; ++i) 126705bce0beee87512e52428d4b80f5a8e79a949576David Greene ListInits.push_back(VarListElementInit::get(const_cast<TypedInit *>(this), 126805bce0beee87512e52428d4b80f5a8e79a949576David Greene Elements[i])); 1269dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return ListInit::get(ListInits, T); 12701dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner} 12711dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 12721dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 127305bce0beee87512e52428d4b80f5a8e79a949576David GreeneVarInit *VarInit::get(const std::string &VN, RecTy *T) { 1274ee6dca17252de152720655282fb4b74b76fb2fe9David Greene Init *Value = StringInit::get(VN); 1275ee6dca17252de152720655282fb4b74b76fb2fe9David Greene return VarInit::get(Value, T); 1276ee6dca17252de152720655282fb4b74b76fb2fe9David Greene} 1277ee6dca17252de152720655282fb4b74b76fb2fe9David Greene 1278ee6dca17252de152720655282fb4b74b76fb2fe9David GreeneVarInit *VarInit::get(Init *VN, RecTy *T) { 1279ee6dca17252de152720655282fb4b74b76fb2fe9David Greene typedef std::pair<RecTy *, Init *> Key; 12806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static DenseMap<Key, std::unique_ptr<VarInit>> ThePool; 1281e0be0e361a8306a7106ccab27dcf0140a748bfbcDavid Greene 1282e0be0e361a8306a7106ccab27dcf0140a748bfbcDavid Greene Key TheKey(std::make_pair(T, VN)); 1283e0be0e361a8306a7106ccab27dcf0140a748bfbcDavid Greene 12846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<VarInit> &I = ThePool[TheKey]; 12856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!I) I.reset(new VarInit(VN, T)); 12866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return I.get(); 1287dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 1288dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1289ee6dca17252de152720655282fb4b74b76fb2fe9David Greeneconst std::string &VarInit::getName() const { 12906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringInit *NameString = cast<StringInit>(getNameInit()); 1291ee6dca17252de152720655282fb4b74b76fb2fe9David Greene return NameString->getValue(); 1292ee6dca17252de152720655282fb4b74b76fb2fe9David Greene} 1293ee6dca17252de152720655282fb4b74b76fb2fe9David Greene 1294307525cd24c3b9c081ddb3c34a3418f2875cd556Michael LiaoInit *VarInit::getBit(unsigned Bit) const { 1295307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao if (getType() == BitRecTy::get()) 1296307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<VarInit*>(this); 1297307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return VarBitInit::get(const_cast<VarInit*>(this), Bit); 1298e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1299e62c1185bee05facc25d1d725434f517261d308bChris Lattner 130005bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *VarInit::resolveListElementReference(Record &R, 130105bce0beee87512e52428d4b80f5a8e79a949576David Greene const RecordVal *IRV, 130205bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 1303dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (R.isTemplateArg(getNameInit())) return nullptr; 1304dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (IRV && IRV->getNameInit() != getNameInit()) return nullptr; 13051dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 1306ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen RecordVal *RV = R.getValue(getNameInit()); 1307a8449e6aaa6f494d85e75d4755f9c47abf1e06ceBob Wilson assert(RV && "Reference to a non-existent variable?"); 13086cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva ListInit *LI = dyn_cast<ListInit>(RV->getValue()); 13096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!LI) 13106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return VarListElementInit::get(cast<TypedInit>(RV->getValue()), Elt); 131121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 13126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Elt >= LI->size()) 1313dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; // Out of range reference. 131405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *E = LI->getElement(Elt); 13152214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson // If the element is set to some value, or if we are resolving a reference 13162214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson // to a specific variable and that variable is explicitly unset, then 13172214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson // replace the VarListElementInit with it. 13183f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (IRV || !isa<UnsetInit>(E)) 13192214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson return E; 1320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 13211dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner} 13221dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 13231dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 1324b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris LattnerRecTy *VarInit::getFieldType(const std::string &FieldName) const { 1325736ceace11249da645ec4ed91b8714832193ead4Sean Silva if (RecordRecTy *RTy = dyn_cast<RecordRecTy>(getType())) 1326b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner if (const RecordVal *RV = RTy->getRecord()->getValue(FieldName)) 1327b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner return RV->getType(); 1328dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1329b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner} 1330b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner 133105bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *VarInit::getFieldInit(Record &R, const RecordVal *RV, 133205bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const { 133363554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva if (isa<RecordRecTy>(getType())) 1334d1baa252c41322d3a38d4360ba1dbcc20c0badf9Jakob Stoklund Olesen if (const RecordVal *Val = R.getValue(VarName)) { 13353f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (RV != Val && (RV || isa<UnsetInit>(Val->getValue()))) 1336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 133705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *TheInit = Val->getValue(); 1338ff367ee1c5977299c57343f93a31c7d40b5ede5dChris Lattner assert(TheInit != this && "Infinite loop detected!"); 133905bce0beee87512e52428d4b80f5a8e79a949576David Greene if (Init *I = TheInit->getFieldInit(R, RV, FieldName)) 1340b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner return I; 13416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 1342ff367ee1c5977299c57343f93a31c7d40b5ede5dChris Lattner } 1343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1344b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner} 1345b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner 134605bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *VarInit::resolveReferences(Record &R, const RecordVal *RV) const { 13479b929aa7495ee0b5d389370baeb332456632b2feChris Lattner if (RecordVal *Val = R.getValue(VarName)) 1348dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (RV == Val || (!RV && !isa<UnsetInit>(Val->getValue()))) 13499b929aa7495ee0b5d389370baeb332456632b2feChris Lattner return Val->getValue(); 135005bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<VarInit *>(this); 13519b929aa7495ee0b5d389370baeb332456632b2feChris Lattner} 13523da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 135305bce0beee87512e52428d4b80f5a8e79a949576David GreeneVarBitInit *VarBitInit::get(TypedInit *T, unsigned B) { 135405bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::pair<TypedInit *, unsigned> Key; 13556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static DenseMap<Key, std::unique_ptr<VarBitInit>> ThePool; 1356aa839b8fa3e4500551f23b20491c1c55e89567b5David Greene 1357aa839b8fa3e4500551f23b20491c1c55e89567b5David Greene Key TheKey(std::make_pair(T, B)); 1358aa839b8fa3e4500551f23b20491c1c55e89567b5David Greene 13596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<VarBitInit> &I = ThePool[TheKey]; 13606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!I) I.reset(new VarBitInit(T, B)); 13616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return I.get(); 13626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 13636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 13646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit *VarBitInit::convertInitializerTo(RecTy *Ty) const { 13656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<BitRecTy>(Ty)) 13666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<VarBitInit *>(this); 13676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 13686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 1369dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 1370dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 13713aba4d39fd101238ac06871895c28f26736d80cbChris Lattnerstd::string VarBitInit::getAsString() const { 13726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return TI->getAsString() + "{" + utostr(Bit) + "}"; 13733aba4d39fd101238ac06871895c28f26736d80cbChris Lattner} 1374db1b766fe63d22627b80346fcbf0ee95a69f791dChris Lattner 137505bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *VarBitInit::resolveReferences(Record &R, const RecordVal *RV) const { 1376307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao Init *I = TI->resolveReferences(R, RV); 1377307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao if (TI != I) 1378307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return I->getBit(getBitNum()); 1379307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 1380307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<VarBitInit*>(this); 1381db1b766fe63d22627b80346fcbf0ee95a69f791dChris Lattner} 1382db1b766fe63d22627b80346fcbf0ee95a69f791dChris Lattner 138305bce0beee87512e52428d4b80f5a8e79a949576David GreeneVarListElementInit *VarListElementInit::get(TypedInit *T, 138405bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned E) { 138505bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::pair<TypedInit *, unsigned> Key; 13866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static DenseMap<Key, std::unique_ptr<VarListElementInit>> ThePool; 138708f71e3e7437359f94fed3207bc64d8cc54ef3f3David Greene 138808f71e3e7437359f94fed3207bc64d8cc54ef3f3David Greene Key TheKey(std::make_pair(T, E)); 138908f71e3e7437359f94fed3207bc64d8cc54ef3f3David Greene 13906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<VarListElementInit> &I = ThePool[TheKey]; 13916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!I) I.reset(new VarListElementInit(T, E)); 13926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return I.get(); 1393dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 1394dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 13953aba4d39fd101238ac06871895c28f26736d80cbChris Lattnerstd::string VarListElementInit::getAsString() const { 13963aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return TI->getAsString() + "[" + utostr(Element) + "]"; 13973aba4d39fd101238ac06871895c28f26736d80cbChris Lattner} 13983aba4d39fd101238ac06871895c28f26736d80cbChris Lattner 139905bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit * 140005bce0beee87512e52428d4b80f5a8e79a949576David GreeneVarListElementInit::resolveReferences(Record &R, const RecordVal *RV) const { 140105bce0beee87512e52428d4b80f5a8e79a949576David Greene if (Init *I = getVariable()->resolveListElementReference(R, RV, 1402d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher getElementNum())) 14031dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner return I; 140405bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<VarListElementInit *>(this); 14051dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner} 14061dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 1407307525cd24c3b9c081ddb3c34a3418f2875cd556Michael LiaoInit *VarListElementInit::getBit(unsigned Bit) const { 1408307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao if (getType() == BitRecTy::get()) 1409307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<VarListElementInit*>(this); 1410307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return VarBitInit::get(const_cast<VarListElementInit*>(this), Bit); 14111dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner} 14121dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 141305bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *VarListElementInit:: resolveListElementReference(Record &R, 141405bce0beee87512e52428d4b80f5a8e79a949576David Greene const RecordVal *RV, 141505bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 14166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Init *Result = TI->resolveListElementReference(R, RV, Element)) { 14173f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (TypedInit *TInit = dyn_cast<TypedInit>(Result)) { 14186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Init *Result2 = TInit->resolveListElementReference(R, RV, Elt)) 14196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Result2; 14206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return VarListElementInit::get(TInit, Elt); 14211045a594e65c65c55dfcd9585658eee85ef79e75David Greene } 14221045a594e65c65c55dfcd9585658eee85ef79e75David Greene return Result; 14231045a594e65c65c55dfcd9585658eee85ef79e75David Greene } 14246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1425dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 14261dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner} 14271dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 142805bce0beee87512e52428d4b80f5a8e79a949576David GreeneDefInit *DefInit::get(Record *R) { 142977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen return R->getDefInit(); 143077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen} 143177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 14326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit *DefInit::convertInitializerTo(RecTy *Ty) const { 14336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (auto *RRT = dyn_cast<RecordRecTy>(Ty)) 14346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (getDef()->isSubClassOf(RRT->getRecord())) 14356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<DefInit *>(this); 14366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 14376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 14386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1439b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris LattnerRecTy *DefInit::getFieldType(const std::string &FieldName) const { 1440b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner if (const RecordVal *RV = Def->getValue(FieldName)) 1441b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner return RV->getType(); 1442dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1443b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner} 1444b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner 144505bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *DefInit::getFieldInit(Record &R, const RecordVal *RV, 144605bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const { 1447b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner return Def->getValue(FieldName)->getValue(); 1448b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner} 1449b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner 1450b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner 14513aba4d39fd101238ac06871895c28f26736d80cbChris Lattnerstd::string DefInit::getAsString() const { 14523aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return Def->getName(); 1453e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1454e62c1185bee05facc25d1d725434f517261d308bChris Lattner 145505bce0beee87512e52428d4b80f5a8e79a949576David GreeneFieldInit *FieldInit::get(Init *R, const std::string &FN) { 145605bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::pair<Init *, TableGenStringKey> Key; 14576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static DenseMap<Key, std::unique_ptr<FieldInit>> ThePool; 145865bf3ca9aa474db6c5c2a0d3ea0f4a22af514184David Greene 145965bf3ca9aa474db6c5c2a0d3ea0f4a22af514184David Greene Key TheKey(std::make_pair(R, FN)); 146065bf3ca9aa474db6c5c2a0d3ea0f4a22af514184David Greene 14616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<FieldInit> &I = ThePool[TheKey]; 14626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!I) I.reset(new FieldInit(R, FN)); 14636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return I.get(); 1464dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 1465dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1466307525cd24c3b9c081ddb3c34a3418f2875cd556Michael LiaoInit *FieldInit::getBit(unsigned Bit) const { 1467307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao if (getType() == BitRecTy::get()) 1468307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<FieldInit*>(this); 1469307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return VarBitInit::get(const_cast<FieldInit*>(this), Bit); 14701dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner} 14711dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 147205bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *FieldInit::resolveListElementReference(Record &R, const RecordVal *RV, 147305bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 147405bce0beee87512e52428d4b80f5a8e79a949576David Greene if (Init *ListVal = Rec->getFieldInit(R, RV, FieldName)) 14756cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva if (ListInit *LI = dyn_cast<ListInit>(ListVal)) { 14766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Elt >= LI->size()) return nullptr; 147705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *E = LI->getElement(Elt); 14781dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 14792214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson // If the element is set to some value, or if we are resolving a 14802214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson // reference to a specific variable and that variable is explicitly 14812214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson // unset, then replace the VarListElementInit with it. 14823f7b7f8ce0b050fc6a0100839d9c5a84198b2aedSean Silva if (RV || !isa<UnsetInit>(E)) 14832214dc07649d36e47d11914e1ffc7c56eb40ad73Bob Wilson return E; 14841dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 1485dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 148624151a6888c752ff1d7fc80b500f5a836c9ac528Chris Lattner} 148724151a6888c752ff1d7fc80b500f5a836c9ac528Chris Lattner 148805bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *FieldInit::resolveReferences(Record &R, const RecordVal *RV) const { 148905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *NewRec = RV ? Rec->resolveReferences(R, RV) : Rec; 14907dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner 14916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Init *BitsVal = NewRec->getFieldInit(R, RV, FieldName)) { 149205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *BVR = BitsVal->resolveReferences(R, RV); 149305bce0beee87512e52428d4b80f5a8e79a949576David Greene return BVR->isComplete() ? BVR : const_cast<FieldInit *>(this); 1494b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner } 14957dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner 14966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (NewRec != Rec) 1497dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return FieldInit::get(NewRec, FieldName); 149805bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<FieldInit *>(this); 1499db1b766fe63d22627b80346fcbf0ee95a69f791dChris Lattner} 1500db1b766fe63d22627b80346fcbf0ee95a69f791dChris Lattner 150174b3c8da4800c7e8ba8f019879db29738ecc5f74Benjamin Kramerstatic void ProfileDagInit(FoldingSetNodeID &ID, Init *V, const std::string &VN, 150274b3c8da4800c7e8ba8f019879db29738ecc5f74Benjamin Kramer ArrayRef<Init *> ArgRange, 150374b3c8da4800c7e8ba8f019879db29738ecc5f74Benjamin Kramer ArrayRef<std::string> NameRange) { 150478621a851ae84520de7d24a6d61e1dcf25749712David Greene ID.AddPointer(V); 150578621a851ae84520de7d24a6d61e1dcf25749712David Greene ID.AddString(VN); 150678621a851ae84520de7d24a6d61e1dcf25749712David Greene 150705bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init *>::iterator Arg = ArgRange.begin(); 150878621a851ae84520de7d24a6d61e1dcf25749712David Greene ArrayRef<std::string>::iterator Name = NameRange.begin(); 150978621a851ae84520de7d24a6d61e1dcf25749712David Greene while (Arg != ArgRange.end()) { 151078621a851ae84520de7d24a6d61e1dcf25749712David Greene assert(Name != NameRange.end() && "Arg name underflow!"); 151178621a851ae84520de7d24a6d61e1dcf25749712David Greene ID.AddPointer(*Arg++); 151278621a851ae84520de7d24a6d61e1dcf25749712David Greene ID.AddString(*Name++); 151378621a851ae84520de7d24a6d61e1dcf25749712David Greene } 151478621a851ae84520de7d24a6d61e1dcf25749712David Greene assert(Name == NameRange.end() && "Arg name overflow!"); 151578621a851ae84520de7d24a6d61e1dcf25749712David Greene} 151678621a851ae84520de7d24a6d61e1dcf25749712David Greene 151705bce0beee87512e52428d4b80f5a8e79a949576David GreeneDagInit * 151805bce0beee87512e52428d4b80f5a8e79a949576David GreeneDagInit::get(Init *V, const std::string &VN, 151905bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init *> ArgRange, 152078621a851ae84520de7d24a6d61e1dcf25749712David Greene ArrayRef<std::string> NameRange) { 15216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static FoldingSet<DagInit> ThePool; 15226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static std::vector<std::unique_ptr<DagInit>> TheActualPool; 152378621a851ae84520de7d24a6d61e1dcf25749712David Greene 152478621a851ae84520de7d24a6d61e1dcf25749712David Greene FoldingSetNodeID ID; 152578621a851ae84520de7d24a6d61e1dcf25749712David Greene ProfileDagInit(ID, V, VN, ArgRange, NameRange); 152678621a851ae84520de7d24a6d61e1dcf25749712David Greene 1527dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void *IP = nullptr; 152805bce0beee87512e52428d4b80f5a8e79a949576David Greene if (DagInit *I = ThePool.FindNodeOrInsertPos(ID, IP)) 152978621a851ae84520de7d24a6d61e1dcf25749712David Greene return I; 153078621a851ae84520de7d24a6d61e1dcf25749712David Greene 153178621a851ae84520de7d24a6d61e1dcf25749712David Greene DagInit *I = new DagInit(V, VN, ArgRange, NameRange); 153278621a851ae84520de7d24a6d61e1dcf25749712David Greene ThePool.InsertNode(I, IP); 15336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TheActualPool.push_back(std::unique_ptr<DagInit>(I)); 153478621a851ae84520de7d24a6d61e1dcf25749712David Greene return I; 153578621a851ae84520de7d24a6d61e1dcf25749712David Greene} 153678621a851ae84520de7d24a6d61e1dcf25749712David Greene 153705bce0beee87512e52428d4b80f5a8e79a949576David GreeneDagInit * 153805bce0beee87512e52428d4b80f5a8e79a949576David GreeneDagInit::get(Init *V, const std::string &VN, 153905bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::vector<std::pair<Init*, std::string> > &args) { 154005bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init *> Args; 1541dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene std::vector<std::string> Names; 1542dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 15436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (const auto &Arg : args) { 15446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Args.push_back(Arg.first); 15456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Names.push_back(Arg.second); 1546dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene } 1547dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1548dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return DagInit::get(V, VN, Args, Names); 1549dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 1550dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 155178621a851ae84520de7d24a6d61e1dcf25749712David Greenevoid DagInit::Profile(FoldingSetNodeID &ID) const { 155278621a851ae84520de7d24a6d61e1dcf25749712David Greene ProfileDagInit(ID, Val, ValName, Args, ArgNames); 1553dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene} 1554dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 15556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarInit *DagInit::convertInitializerTo(RecTy *Ty) const { 15566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<DagRecTy>(Ty)) 15576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return const_cast<DagInit *>(this); 15586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 15596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 15606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 15616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 156205bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *DagInit::resolveReferences(Record &R, const RecordVal *RV) const { 156305bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> NewArgs; 1564273d463befb26004ed5be8dc737321f65a175ad0Chris Lattner for (unsigned i = 0, e = Args.size(); i != e; ++i) 1565273d463befb26004ed5be8dc737321f65a175ad0Chris Lattner NewArgs.push_back(Args[i]->resolveReferences(R, RV)); 156621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 156705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Op = Val->resolveReferences(R, RV); 156821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 15698c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner if (Args != NewArgs || Op != Val) 1570dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return DagInit::get(Op, ValName, NewArgs, ArgNames); 157121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 157205bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<DagInit *>(this); 1573273d463befb26004ed5be8dc737321f65a175ad0Chris Lattner} 1574273d463befb26004ed5be8dc737321f65a175ad0Chris Lattner 1575db1b766fe63d22627b80346fcbf0ee95a69f791dChris Lattner 15763aba4d39fd101238ac06871895c28f26736d80cbChris Lattnerstd::string DagInit::getAsString() const { 15773aba4d39fd101238ac06871895c28f26736d80cbChris Lattner std::string Result = "(" + Val->getAsString(); 15787cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman if (!ValName.empty()) 15797cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman Result += ":" + ValName; 1580ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!Args.empty()) { 15813aba4d39fd101238ac06871895c28f26736d80cbChris Lattner Result += " " + Args[0]->getAsString(); 15823aba4d39fd101238ac06871895c28f26736d80cbChris Lattner if (!ArgNames[0].empty()) Result += ":$" + ArgNames[0]; 158391290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner for (unsigned i = 1, e = Args.size(); i != e; ++i) { 15843aba4d39fd101238ac06871895c28f26736d80cbChris Lattner Result += ", " + Args[i]->getAsString(); 15853aba4d39fd101238ac06871895c28f26736d80cbChris Lattner if (!ArgNames[i].empty()) Result += ":$" + ArgNames[i]; 158691290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner } 15878e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner } 15883aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return Result + ")"; 15898e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner} 15908e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner 15918e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner 1592e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1593e62c1185bee05facc25d1d725434f517261d308bChris Lattner// Other implementations 1594e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1595e62c1185bee05facc25d1d725434f517261d308bChris Lattner 15966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarRecordVal::RecordVal(Init *N, RecTy *T, bool P) 15976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : NameAndPrefix(N, P), Ty(T) { 15986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Value = UnsetInit::get()->convertInitializerTo(Ty); 1599e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(Value && "Cannot create unset value for current type!"); 1600e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1601e62c1185bee05facc25d1d725434f517261d308bChris Lattner 16026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarRecordVal::RecordVal(const std::string &N, RecTy *T, bool P) 16036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : NameAndPrefix(StringInit::get(N), P), Ty(T) { 16046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Value = UnsetInit::get()->convertInitializerTo(Ty); 1605011dca7fac07100695dd3685bfaddbea58a468b9David Greene assert(Value && "Cannot create unset value for current type!"); 1606011dca7fac07100695dd3685bfaddbea58a468b9David Greene} 1607011dca7fac07100695dd3685bfaddbea58a468b9David Greene 1608011dca7fac07100695dd3685bfaddbea58a468b9David Greeneconst std::string &RecordVal::getName() const { 16096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return cast<StringInit>(getNameInit())->getValue(); 1610011dca7fac07100695dd3685bfaddbea58a468b9David Greene} 1611011dca7fac07100695dd3685bfaddbea58a468b9David Greene 1612de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_DUMP_METHOD void RecordVal::dump() const { errs() << *this; } 1613e62c1185bee05facc25d1d725434f517261d308bChris Lattner 16141a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarvoid RecordVal::print(raw_ostream &OS, bool PrintSem) const { 1615e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (getPrefix()) OS << "field "; 1616e681d284f96333cef7774c6cc3dd862526af2282David Greene OS << *getType() << " " << getNameInitAsString(); 16177dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner 16187dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner if (getValue()) 1619e62c1185bee05facc25d1d725434f517261d308bChris Lattner OS << " = " << *getValue(); 16207dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner 1621e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (PrintSem) OS << ";\n"; 1622e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1623e62c1185bee05facc25d1d725434f517261d308bChris Lattner 16246f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbarunsigned Record::LastID = 0; 16256f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar 1626f7931b7040de1c829e678b4e391308bc3376f8a0David Greenevoid Record::init() { 1627f7931b7040de1c829e678b4e391308bc3376f8a0David Greene checkName(); 1628e338565757bfcfe9d762751c976684f66954fb45David Greene 1629e338565757bfcfe9d762751c976684f66954fb45David Greene // Every record potentially has a def at the top. This value is 1630e338565757bfcfe9d762751c976684f66954fb45David Greene // replaced with the top-level def name at instantiation time. 1631e338565757bfcfe9d762751c976684f66954fb45David Greene RecordVal DN("NAME", StringRecTy::get(), 0); 1632e338565757bfcfe9d762751c976684f66954fb45David Greene addValue(DN); 1633f7931b7040de1c829e678b4e391308bc3376f8a0David Greene} 1634f7931b7040de1c829e678b4e391308bc3376f8a0David Greene 16350d886401b3ec09b0c2d267942b07702a2f0740f4David Greenevoid Record::checkName() { 16360d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // Ensure the record name has string type. 16376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const TypedInit *TypedName = cast<const TypedInit>(Name); 16386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!isa<StringRecTy>(TypedName->getType())) 163961131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record name is not a string!"); 16400d886401b3ec09b0c2d267942b07702a2f0740f4David Greene} 16410d886401b3ec09b0c2d267942b07702a2f0740f4David Greene 164277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund OlesenDefInit *Record::getDefInit() { 1643f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (!TheInit) 1644f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar TheInit.reset(new DefInit(this, new RecordRecTy(this))); 1645f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return TheInit.get(); 164677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen} 164777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 16480d886401b3ec09b0c2d267942b07702a2f0740f4David Greeneconst std::string &Record::getName() const { 16496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return cast<StringInit>(Name)->getValue(); 16500d886401b3ec09b0c2d267942b07702a2f0740f4David Greene} 16510d886401b3ec09b0c2d267942b07702a2f0740f4David Greene 16520d886401b3ec09b0c2d267942b07702a2f0740f4David Greenevoid Record::setName(Init *NewName) { 1653f628204262fb91bc095e198b5d9777bd015637e2David Greene Name = NewName; 16540d886401b3ec09b0c2d267942b07702a2f0740f4David Greene checkName(); 16550d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // DO NOT resolve record values to the name at this point because 16560d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // there might be default values for arguments of this def. Those 16570d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // arguments might not have been resolved yet so we don't want to 16580d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // prematurely assume values for those arguments were not passed to 16590d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // this def. 16600d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // 16610d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // Nonetheless, it may be that some of this Record's values 16620d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // reference the record name. Indeed, the reason for having the 16630d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // record name be an Init is to provide this flexibility. The extra 16640d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // resolve steps after completely instantiating defs takes care of 16650d886401b3ec09b0c2d267942b07702a2f0740f4David Greene // this. See TGParser::ParseDef and TGParser::ParseDefm. 16660d886401b3ec09b0c2d267942b07702a2f0740f4David Greene} 16670d886401b3ec09b0c2d267942b07702a2f0740f4David Greene 16680d886401b3ec09b0c2d267942b07702a2f0740f4David Greenevoid Record::setName(const std::string &Name) { 16690d886401b3ec09b0c2d267942b07702a2f0740f4David Greene setName(StringInit::get(Name)); 167096a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene} 167196a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene 16727dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattnervoid Record::resolveReferencesTo(const RecordVal *RV) { 16737dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) { 1674a2da78852b25ef098c91e5923e8edf205c3bf0c7Jakob Stoklund Olesen if (RV == &Values[i]) // Skip resolve the same field as the given one 1675a2da78852b25ef098c91e5923e8edf205c3bf0c7Jakob Stoklund Olesen continue; 167605bce0beee87512e52428d4b80f5a8e79a949576David Greene if (Init *V = Values[i].getValue()) 1677307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao if (Values[i].setValue(V->resolveReferences(*this, RV))) 16786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar PrintFatalError(getLoc(), "Invalid value is found when setting '" + 16796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Values[i].getNameInitAsString() + 16806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar "' after resolving references" + 16816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar (RV ? " against '" + RV->getNameInitAsString() + 16826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar "' of (" + RV->getValue()->getAsUnquotedString() + 16836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ")" 16846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : "") + "\n"); 16857dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner } 16869c42bcf2ca4844162b427d017fa419bf93f258e3David Greene Init *OldName = getNameInit(); 16879c42bcf2ca4844162b427d017fa419bf93f258e3David Greene Init *NewName = Name->resolveReferences(*this, RV); 16889c42bcf2ca4844162b427d017fa419bf93f258e3David Greene if (NewName != OldName) { 16899c42bcf2ca4844162b427d017fa419bf93f258e3David Greene // Re-register with RecordKeeper. 16909c42bcf2ca4844162b427d017fa419bf93f258e3David Greene setName(NewName); 16919c42bcf2ca4844162b427d017fa419bf93f258e3David Greene } 1692e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1693e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1694de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_DUMP_METHOD void Record::dump() const { errs() << *this; } 1695e62c1185bee05facc25d1d725434f517261d308bChris Lattner 16961a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &llvm::operator<<(raw_ostream &OS, const Record &R) { 169741effc6c15cb65bf486887b20b1dd419ad40f4afDavid Greene OS << R.getNameInitAsString(); 1698e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1699f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar ArrayRef<Init *> TArgs = R.getTemplateArgs(); 1700e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (!TArgs.empty()) { 1701e62c1185bee05facc25d1d725434f517261d308bChris Lattner OS << "<"; 17026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool NeedComma = false; 17036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (const Init *TA : TArgs) { 17046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (NeedComma) OS << ", "; 17056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NeedComma = true; 17066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const RecordVal *RV = R.getValue(TA); 1707e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(RV && "Template argument record not found??"); 1708e62c1185bee05facc25d1d725434f517261d308bChris Lattner RV->print(OS, false); 1709e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1710e62c1185bee05facc25d1d725434f517261d308bChris Lattner OS << ">"; 1711e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1712e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1713e62c1185bee05facc25d1d725434f517261d308bChris Lattner OS << " {"; 1714de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ArrayRef<std::pair<Record *, SMRange>> SC = R.getSuperClasses(); 1715e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (!SC.empty()) { 1716e62c1185bee05facc25d1d725434f517261d308bChris Lattner OS << "\t//"; 1717de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (const auto &SuperPair : SC) 1718de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << " " << SuperPair.first->getNameInitAsString(); 1719e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1720e62c1185bee05facc25d1d725434f517261d308bChris Lattner OS << "\n"; 1721e62c1185bee05facc25d1d725434f517261d308bChris Lattner 17226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (const RecordVal &Val : R.getValues()) 17236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Val.getPrefix() && !R.isTemplateArg(Val.getName())) 17246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar OS << Val; 17256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (const RecordVal &Val : R.getValues()) 17266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!Val.getPrefix() && !R.isTemplateArg(Val.getName())) 17276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar OS << Val; 1728e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1729e62c1185bee05facc25d1d725434f517261d308bChris Lattner return OS << "}\n"; 1730e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1731e62c1185bee05facc25d1d725434f517261d308bChris Lattner 173205bce0beee87512e52428d4b80f5a8e79a949576David GreeneInit *Record::getValueInit(StringRef FieldName) const { 1733c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner const RecordVal *R = getValue(FieldName); 1734dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!R || !R->getValue()) 173561131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + 173636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "' does not have a field named `" + FieldName + "'!\n"); 1737c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner return R->getValue(); 1738c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner} 1739c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 1740c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 1741c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattnerstd::string Record::getValueAsString(StringRef FieldName) const { 17425c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner const RecordVal *R = getValue(FieldName); 1743dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!R || !R->getValue()) 174461131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + 174536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "' does not have a field named `" + FieldName + "'!\n"); 17465c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 17476cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva if (StringInit *SI = dyn_cast<StringInit>(R->getValue())) 17485c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner return SI->getValue(); 1749de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (CodeInit *CI = dyn_cast<CodeInit>(R->getValue())) 1750de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return CI->getValue(); 1751de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 175261131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 175336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have a string initializer!"); 17545c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner} 17555c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 175605bce0beee87512e52428d4b80f5a8e79a949576David GreeneBitsInit *Record::getValueAsBitsInit(StringRef FieldName) const { 17576f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner const RecordVal *R = getValue(FieldName); 1758dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!R || !R->getValue()) 175961131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + 176036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "' does not have a field named `" + FieldName + "'!\n"); 17616f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner 17626cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva if (BitsInit *BI = dyn_cast<BitsInit>(R->getValue())) 17636f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner return BI; 176461131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 176536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have a BitsInit initializer!"); 17666f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner} 17676f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner 176805bce0beee87512e52428d4b80f5a8e79a949576David GreeneListInit *Record::getValueAsListInit(StringRef FieldName) const { 176958c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner const RecordVal *R = getValue(FieldName); 1770dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!R || !R->getValue()) 177161131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + 177236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "' does not have a field named `" + FieldName + "'!\n"); 177358c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner 17746cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva if (ListInit *LI = dyn_cast<ListInit>(R->getValue())) 177558c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner return LI; 177661131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 177736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have a list initializer!"); 177858c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner} 17796f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner 178021870411d9c1807526b613d04c2ebae5a43c263bBob Wilsonstd::vector<Record*> 1781c19418f31fa8ab09ff43c57150e5042dbe368f49Chris LattnerRecord::getValueAsListOfDefs(StringRef FieldName) const { 178205bce0beee87512e52428d4b80f5a8e79a949576David Greene ListInit *List = getValueAsListInit(FieldName); 1783fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey std::vector<Record*> Defs; 17846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (Init *I : List->getValues()) { 17856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (DefInit *DI = dyn_cast<DefInit>(I)) 1786fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey Defs.push_back(DI->getDef()); 17876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else 178861131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 178936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' list is not entirely DefInit!"); 1790fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey } 1791fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey return Defs; 1792fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey} 1793fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey 1794c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattnerint64_t Record::getValueAsInt(StringRef FieldName) const { 179558c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner const RecordVal *R = getValue(FieldName); 1796dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!R || !R->getValue()) 179761131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + 179836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "' does not have a field named `" + FieldName + "'!\n"); 179958c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner 18006cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva if (IntInit *II = dyn_cast<IntInit>(R->getValue())) 180158c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner return II->getValue(); 180261131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 180336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have an int initializer!"); 180458c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner} 18055c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 180621870411d9c1807526b613d04c2ebae5a43c263bBob Wilsonstd::vector<int64_t> 1807c19418f31fa8ab09ff43c57150e5042dbe368f49Chris LattnerRecord::getValueAsListOfInts(StringRef FieldName) const { 180805bce0beee87512e52428d4b80f5a8e79a949576David Greene ListInit *List = getValueAsListInit(FieldName); 180963f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman std::vector<int64_t> Ints; 18106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (Init *I : List->getValues()) { 18116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (IntInit *II = dyn_cast<IntInit>(I)) 1812af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov Ints.push_back(II->getValue()); 18136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else 181461131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 181536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have a list of ints initializer!"); 1816af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov } 1817af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov return Ints; 1818af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov} 1819af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov 1820bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Andersonstd::vector<std::string> 1821bea6f615eefae279e53bbb63a31d2c3c67274c45Owen AndersonRecord::getValueAsListOfStrings(StringRef FieldName) const { 182205bce0beee87512e52428d4b80f5a8e79a949576David Greene ListInit *List = getValueAsListInit(FieldName); 1823bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson std::vector<std::string> Strings; 18246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (Init *I : List->getValues()) { 18256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (StringInit *SI = dyn_cast<StringInit>(I)) 18266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Strings.push_back(SI->getValue()); 18276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else 182861131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 182936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have a list of strings initializer!"); 1830bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson } 1831bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson return Strings; 1832bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson} 1833bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson 1834c19418f31fa8ab09ff43c57150e5042dbe368f49Chris LattnerRecord *Record::getValueAsDef(StringRef FieldName) const { 1835dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner const RecordVal *R = getValue(FieldName); 1836dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!R || !R->getValue()) 183761131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + 183836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "' does not have a field named `" + FieldName + "'!\n"); 1839dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner 18406cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva if (DefInit *DI = dyn_cast<DefInit>(R->getValue())) 1841dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner return DI->getDef(); 184261131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 184336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have a def initializer!"); 1844dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner} 1845dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner 1846c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattnerbool Record::getValueAsBit(StringRef FieldName) const { 18470969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner const RecordVal *R = getValue(FieldName); 1848dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!R || !R->getValue()) 184961131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + 185036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "' does not have a field named `" + FieldName + "'!\n"); 18510969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner 18526cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva if (BitInit *BI = dyn_cast<BitInit>(R->getValue())) 1853784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner return BI->getValue(); 185461131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 185536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have a bit initializer!"); 1856784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner} 1857784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner 1858c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesenbool Record::getValueAsBitOrUnset(StringRef FieldName, bool &Unset) const { 1859c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen const RecordVal *R = getValue(FieldName); 1860dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!R || !R->getValue()) 186161131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + 186261131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger "' does not have a field named `" + FieldName.str() + "'!\n"); 1863c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen 18646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<UnsetInit>(R->getValue())) { 1865c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen Unset = true; 1866c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen return false; 1867c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen } 1868c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen Unset = false; 18696cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva if (BitInit *BI = dyn_cast<BitInit>(R->getValue())) 1870c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen return BI->getValue(); 187161131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 187236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have a bit initializer!"); 1873c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen} 1874c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen 187505bce0beee87512e52428d4b80f5a8e79a949576David GreeneDagInit *Record::getValueAsDag(StringRef FieldName) const { 1876784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner const RecordVal *R = getValue(FieldName); 1877dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!R || !R->getValue()) 187861131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + 187936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "' does not have a field named `" + FieldName + "'!\n"); 1880784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner 18816cfc806a6b82b60a3e923b6b89f2b4da62cdb50bSean Silva if (DagInit *DI = dyn_cast<DagInit>(R->getValue())) 1882784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner return DI; 188361131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError(getLoc(), "Record `" + getName() + "', field `" + 188436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FieldName + "' does not have a dag initializer!"); 18850969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner} 18860969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner 1887dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner 1888de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_DUMP_METHOD void MultiClass::dump() const { 18891a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar errs() << "Record:\n"; 1890d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene Rec.dump(); 189121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 18921a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar errs() << "Defs:\n"; 18936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (const auto &Proto : DefPrototypes) 18946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Proto->dump(); 1895d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene} 1896d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 1897d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 1898de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_DUMP_METHOD void RecordKeeper::dump() const { errs() << *this; } 1899e62c1185bee05facc25d1d725434f517261d308bChris Lattner 19001a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &llvm::operator<<(raw_ostream &OS, const RecordKeeper &RK) { 1901e62c1185bee05facc25d1d725434f517261d308bChris Lattner OS << "------------- Classes -----------------\n"; 19026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (const auto &C : RK.getClasses()) 190337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines OS << "class " << *C.second; 19043da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 1905e62c1185bee05facc25d1d725434f517261d308bChris Lattner OS << "------------- Defs -----------------\n"; 19066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (const auto &D : RK.getDefs()) 190737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines OS << "def " << *D.second; 1908e62c1185bee05facc25d1d725434f517261d308bChris Lattner return OS; 1909e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1910ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 1911de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::vector<Record *> 19125c737ad4d669b835b8fb973a5c477a4dbb213830Chris LattnerRecordKeeper::getAllDerivedDefinitions(const std::string &ClassName) const { 19139d6250f52ba4ba0a34d44aa2cc9d3fa14c15a006Chris Lattner Record *Class = getClass(ClassName); 19145c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner if (!Class) 191561131ab15fd593a2e295d79fe2714e7bc21f2ec8Joerg Sonnenberger PrintFatalError("ERROR: Couldn't find the `" + ClassName + "' class!\n"); 1916ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 19175c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner std::vector<Record*> Defs; 191837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines for (const auto &D : getDefs()) 191937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (D.second->isSubClassOf(Class)) 192037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Defs.push_back(D.second.get()); 1921ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 19225c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner return Defs; 1923ab47ae3381aa2372009a9054260461c20324b555Chris Lattner} 1924d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 192530c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *llvm::QualifyName(Record &CurRec, MultiClass *CurMultiClass, 192630c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene Init *Name, const std::string &Scoper) { 19270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar RecTy *Type = cast<TypedInit>(Name)->getType(); 192830c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 192930c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene BinOpInit *NewName = 19306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar BinOpInit::get(BinOpInit::STRCONCAT, 19316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar BinOpInit::get(BinOpInit::STRCONCAT, 19326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CurRec.getNameInit(), 19336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringInit::get(Scoper), 19346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Type)->Fold(&CurRec, CurMultiClass), 19356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Name, 19366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Type); 193730c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 193830c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene if (CurMultiClass && Scoper != "::") { 193930c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene NewName = 19406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar BinOpInit::get(BinOpInit::STRCONCAT, 19416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar BinOpInit::get(BinOpInit::STRCONCAT, 19426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CurMultiClass->Rec.getNameInit(), 19436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringInit::get("::"), 19446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Type)->Fold(&CurRec, CurMultiClass), 19456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NewName->Fold(&CurRec, CurMultiClass), 19466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Type); 194730c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene } 194830c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 194930c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene return NewName->Fold(&CurRec, CurMultiClass); 195030c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene} 195130c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 195230c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *llvm::QualifyName(Record &CurRec, MultiClass *CurMultiClass, 195330c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene const std::string &Name, 195430c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene const std::string &Scoper) { 195530c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene return QualifyName(CurRec, CurMultiClass, StringInit::get(Name), Scoper); 195630c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene} 1957