Record.h revision 2d24e2a396a1d211baaeedf32148a3b657240170
17c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne//===- llvm/TableGen/Record.h - Classes for Table Records -------*- C++ -*-===// 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// 1014d7c59491347a2f8f29e120fd75a4cad42f68e7Chris Lattner// This file defines the main TableGen data structures, including the TableGen 1114d7c59491347a2f8f29e120fd75a4cad42f68e7Chris Lattner// types, values, and high-level data structures. 12e62c1185bee05facc25d1d725434f517261d308bChris Lattner// 13e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 14e62c1185bee05facc25d1d725434f517261d308bChris Lattner 157c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#ifndef LLVM_TABLEGEN_RECORD_H 167c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#define LLVM_TABLEGEN_RECORD_H 17e62c1185bee05facc25d1d725434f517261d308bChris Lattner 18c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene#include "llvm/ADT/ArrayRef.h" 19726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene#include "llvm/ADT/FoldingSet.h" 20dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene#include "llvm/Support/Allocator.h" 21099e198ae84c1a6cfe2a7c79ee9f47fa67caac8fChris Lattner#include "llvm/Support/SourceMgr.h" 223cc52ea33c0b96d1682f14fc45c45b57df0f39b6Michael J. Spencer#include "llvm/Support/DataTypes.h" 231a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar#include "llvm/Support/raw_ostream.h" 24e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include <map> 25028936ada14335bb04f377d46a6261dc4c66dafdJohn Criswell 26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 271a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarclass raw_ostream; 2821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 297dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// RecTy subclasses. 307cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitRecTy; 317cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitsRecTy; 327cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass IntRecTy; 337cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass StringRecTy; 347cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass ListRecTy; 357cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass CodeRecTy; 3640f71134b9fef0ca06c516f033cc9403394a913cChris Lattnerclass DagRecTy; 377cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass RecordRecTy; 387cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 397dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// Init subclasses. 40afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init; 41e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass UnsetInit; 42e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit; 43e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsInit; 44e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass IntInit; 45e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass StringInit; 46e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattnerclass CodeInit; 47e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListInit; 48e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit; 49711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattnerclass BinOpInit; 504afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit; 51e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass DefInit; 528e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattnerclass DagInit; 53b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass TypedInit; 54b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarInit; 55a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattnerclass FieldInit; 56b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarBitInit; 571dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit; 587cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 597dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// Other classes. 60e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass Record; 617dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattnerclass RecordVal; 62293b13350c2fbae8a64b0b0beb440cb859968c8cBob Wilsonstruct MultiClass; 6367db883487fca3472fdde51e931657e22d4d0495Chris Lattnerclass RecordKeeper; 64e62c1185bee05facc25d1d725434f517261d308bChris Lattner 65e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 66e62c1185bee05facc25d1d725434f517261d308bChris Lattner// Type Classes 67e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 68e62c1185bee05facc25d1d725434f517261d308bChris Lattner 6977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenclass RecTy { 7077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen ListRecTy *ListTy; 712d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 7277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 7377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen RecTy() : ListTy(0) {} 74e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual ~RecTy() {} 75e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7699ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner virtual std::string getAsString() const = 0; 771a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar void print(raw_ostream &OS) const { OS << getAsString(); } 787cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner void dump() const; 797cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 807cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner /// typeIsConvertibleTo - Return true if all values of 'this' type can be 817cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner /// converted to the specified type. 827cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool typeIsConvertibleTo(const RecTy *RHS) const = 0; 837cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 8477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen /// getListTy - Returns the type representing list<this>. 8577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen ListRecTy *getListTy(); 8677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 877cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerpublic: // These methods should only be called from subclasses of Init 8805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return 0; } 8905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 9005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 9105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 9205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 9305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 9405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { 9505bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)UI); 96e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 9705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { 9805bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)UI); 99e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene } 10005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { 10105bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)UI); 1024afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( CodeInit *CI) { return 0; } 10405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 10505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 10605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 10705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI) { return 0; } 10805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { 10905bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)VI); 110b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner } 11105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { 11205bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)FI); 113b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner } 114e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1157cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerpublic: // These methods should only be called by subclasses of RecTy. 1167cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner // baseClassOf - These virtual methods should be overloaded to return true iff 1177cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner // all values of type 'RHS' can be converted to the 'this' type. 1187cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 1197cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 1207cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 1217cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 1227cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 1237cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } 12440f71134b9fef0ca06c516f033cc9403394a913cChris Lattner virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 1257cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 126e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 127e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1281a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecTy &Ty) { 129e62c1185bee05facc25d1d725434f517261d308bChris Lattner Ty.print(OS); 130e62c1185bee05facc25d1d725434f517261d308bChris Lattner return OS; 131e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 132e62c1185bee05facc25d1d725434f517261d308bChris Lattner 13307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 13407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitRecTy - 'bit' - Represent a single bit 13507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1361fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass BitRecTy : public RecTy { 13777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static BitRecTy Shared; 13877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen BitRecTy() {} 1391fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 14077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static BitRecTy *get() { return &Shared; } 14177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 14205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 14305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return (Init*)BI; } 14405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI); 14505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II); 14605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 14705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 14805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( CodeInit *CI) { return 0; } 14905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return (Init*)VB; } 15005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 15105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 15205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 15305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 15405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 15505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 15605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 15705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 158e62c1185bee05facc25d1d725434f517261d308bChris Lattner 15999ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const { return "bit"; } 1607cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 1617cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 1627cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 1637cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 164ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return true; } 165ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const; 166ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return true; } 167ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 168ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 169ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } 170ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 171ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 172ead87b671278379f92890fddd859a301bb68f462Reid Spencer 173e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 174e62c1185bee05facc25d1d725434f517261d308bChris Lattner 17507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 176234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// BitsRecTy - 'bits<n>' - Represent a fixed number of bits 177234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// BitsRecTy - 'bits<n>' - Represent a fixed number of bits 17807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 179e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsRecTy : public RecTy { 180e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Size; 1811002c0203450620594a85454c6a095ca94b87cb2Dan Gohman explicit BitsRecTy(unsigned Sz) : Size(Sz) {} 18277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 18377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static BitsRecTy *get(unsigned Sz); 184e62c1185bee05facc25d1d725434f517261d308bChris Lattner 185e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getNumBits() const { return Size; } 186e62c1185bee05facc25d1d725434f517261d308bChris Lattner 18705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI); 18805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *UI); 18905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI); 19005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II); 19105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 19205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 19305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( CodeInit *CI) { return 0; } 19405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 19505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 19605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 19705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 19805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 19905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 20005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 20105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 20205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 203ead87b671278379f92890fddd859a301bb68f462Reid Spencer 20499ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const; 2057cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 2067cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 2077cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 2087cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 209ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return Size == 1; } 210ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { 2117cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->Size == Size; 2127cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 213ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return true; } 214ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 215ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 216ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } 217ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 218ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 219ead87b671278379f92890fddd859a301bb68f462Reid Spencer 220e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 221e62c1185bee05facc25d1d725434f517261d308bChris Lattner 22207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 22307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntRecTy - 'int' - Represent an integer value of no particular size 22407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 2251fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass IntRecTy : public RecTy { 22677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static IntRecTy Shared; 22777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen IntRecTy() {} 2281fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 22977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static IntRecTy *get() { return &Shared; } 23077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 23105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 23205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI); 23305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI); 23405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return (Init*)II; } 23505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 23605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 23705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( CodeInit *CI) { return 0; } 23805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 23905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 24005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 24105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 24205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 24305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 24405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 24505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 24605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 247ead87b671278379f92890fddd859a301bb68f462Reid Spencer 24899ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const { return "int"; } 2497cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 2507cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 2517cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 2527cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 2537cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 254ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return true; } 255ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return true; } 256ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return true; } 257ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 258ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 259ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } 260ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 261ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 262ead87b671278379f92890fddd859a301bb68f462Reid Spencer 263e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 264e62c1185bee05facc25d1d725434f517261d308bChris Lattner 26507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringRecTy - 'string' - Represent an string value 26607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 2671fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass StringRecTy : public RecTy { 26877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static StringRecTy Shared; 26977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen StringRecTy() {} 2701fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 27177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static StringRecTy *get() { return &Shared; } 27277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 27305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 27405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 27505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 27605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 27705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return (Init*)SI; } 27805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 27905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *BO); 28005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *BO); 28105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);} 28205bce0beee87512e52428d4b80f5a8e79a949576David Greene 28305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( CodeInit *CI) { return 0; } 28405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 28505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 28605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 28705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 28805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 28905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 290ead87b671278379f92890fddd859a301bb68f462Reid Spencer 29199ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const { return "string"; } 2927cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 2937cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 2947cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 2957cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 2967cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 297ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 298ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 299ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 3007cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const StringRecTy *RHS) const { return true; } 301ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 302ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } 303ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 304ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 305e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 306e62c1185bee05facc25d1d725434f517261d308bChris Lattner 307234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of 308234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// the specified type. 309234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must 310234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// be of the specified type. 31107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 312e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListRecTy : public RecTy { 3137cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner RecTy *Ty; 3141002c0203450620594a85454c6a095ca94b87cb2Dan Gohman explicit ListRecTy(RecTy *T) : Ty(T) {} 31577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen friend ListRecTy *RecTy::getListTy(); 31677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 31777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static ListRecTy *get(RecTy *T) { return T->getListTy(); } 3187cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner RecTy *getElementType() const { return Ty; } 319f1b36f9a71eb267f04b7bd3a32aca9bc69f71e97Chris Lattner 32005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 32105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 32205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 32305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 32405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 32505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI); 32605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( CodeInit *CI) { return 0; } 32705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 32805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 32905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 33005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 33105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 33205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 33305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 33405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 33505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 3363da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 33799ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const; 3387cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 3397cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 3407cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 3417cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 3427cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 343ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 344ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 345ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 346ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 347ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { 3483da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman return RHS->getElementType()->typeIsConvertibleTo(Ty); 3497cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 350ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } 351ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 352ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 353e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 354e62c1185bee05facc25d1d725434f517261d308bChris Lattner 355f05760de76b4ec26474da18c97770ca369972cfdChris Lattner/// CodeRecTy - 'code' - Represent an code fragment, function or method. 356f05760de76b4ec26474da18c97770ca369972cfdChris Lattner/// 3571fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass CodeRecTy : public RecTy { 35877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static CodeRecTy Shared; 35977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen CodeRecTy() {} 3601fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 36177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static CodeRecTy *get() { return &Shared; } 36277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 36305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 36405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 36505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 36605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 36705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 36805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 36905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( CodeInit *CI) { return (Init*)CI; } 37005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 37105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 37205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 37305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 37405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 37505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 37605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 37705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 37805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 379ead87b671278379f92890fddd859a301bb68f462Reid Spencer 38099ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const { return "code"; } 3817cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 3827cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 3837cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 3847cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 385ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 386ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 387ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 388ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 389ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 390ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const CodeRecTy *RHS) const { return true; } 391ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 392ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 393f05760de76b4ec26474da18c97770ca369972cfdChris Lattner}; 394f05760de76b4ec26474da18c97770ca369972cfdChris Lattner 39540f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/// DagRecTy - 'dag' - Represent a dag fragment 39640f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/// 3971fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass DagRecTy : public RecTy { 39877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static DagRecTy Shared; 39977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DagRecTy() {} 4001fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 40177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static DagRecTy *get() { return &Shared; } 40277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 40305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 40405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 40505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 40605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 40705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 40805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 40905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( CodeInit *CI) { return 0; } 41005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 41105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 41205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *BO); 41305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *BO); 41405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);} 41505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *CI) { return (Init*)CI; } 41605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 41705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 41805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 41940f71134b9fef0ca06c516f033cc9403394a913cChris Lattner 42099ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const { return "dag"; } 42140f71134b9fef0ca06c516f033cc9403394a913cChris Lattner 42240f71134b9fef0ca06c516f033cc9403394a913cChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 42340f71134b9fef0ca06c516f033cc9403394a913cChris Lattner return RHS->baseClassOf(this); 42440f71134b9fef0ca06c516f033cc9403394a913cChris Lattner } 425ead87b671278379f92890fddd859a301bb68f462Reid Spencer 426ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 427ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 428ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 429ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 430ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 431ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } 432ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return true; } 433ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 43440f71134b9fef0ca06c516f033cc9403394a913cChris Lattner}; 43540f71134b9fef0ca06c516f033cc9403394a913cChris Lattner 436f05760de76b4ec26474da18c97770ca369972cfdChris Lattner 437234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// RecordRecTy - '[classname]' - Represent an instance of a class, such as: 43807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// (R32 X = EAX). 43907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 440e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordRecTy : public RecTy { 441e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *Rec; 4421002c0203450620594a85454c6a095ca94b87cb2Dan Gohman explicit RecordRecTy(Record *R) : Rec(R) {} 44377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen friend class Record; 44477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 44577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static RecordRecTy *get(Record *R); 446e62c1185bee05facc25d1d725434f517261d308bChris Lattner 447a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner Record *getRecord() const { return Rec; } 448a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 44905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 45005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 45105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 45205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 45305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 45405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 45505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( CodeInit *CI) { return 0; } 45605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 45705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 45805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 45905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 46005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI); 46105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 46205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *VI); 46305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 46405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 465e62c1185bee05facc25d1d725434f517261d308bChris Lattner 46699ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const; 4677cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 4687cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 4697cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 4707cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 471ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 472ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 473ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 474ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 475ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 476ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } 477ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 4787cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const RecordRecTy *RHS) const; 479e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 480e62c1185bee05facc25d1d725434f517261d308bChris Lattner 48121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// resolveTypes - Find a common type that T1 and T2 convert to. 482e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene/// Return 0 if no such type exists. 483e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene/// 484e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid GreeneRecTy *resolveTypes(RecTy *T1, RecTy *T2); 48507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 486e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 487e62c1185bee05facc25d1d725434f517261d308bChris Lattner// Initializer Classes 488e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 489e62c1185bee05facc25d1d725434f517261d308bChris Lattner 490afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init { 491dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene Init(const Init &); // Do not define. 492dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene Init &operator=(const Init &); // Do not define. 4932d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 494dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 495dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 496dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene Init(void) {} 497dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 498afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greenepublic: 499e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual ~Init() {} 500e62c1185bee05facc25d1d725434f517261d308bChris Lattner 501f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// isComplete - This virtual method should be overridden by values that may 502f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// not be completely specified yet. 503f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner virtual bool isComplete() const { return true; } 504f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner 505f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// print - Print out this value. 5061a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar void print(raw_ostream &OS) const { OS << getAsString(); } 5073aba4d39fd101238ac06871895c28f26736d80cbChris Lattner 5083aba4d39fd101238ac06871895c28f26736d80cbChris Lattner /// getAsString - Convert this value to a string form. 5093aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const = 0; 5100b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// getAsUnquotedString - Convert this value to a string form, 5110b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// without adding quote markers. This primaruly affects 5120b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// StringInits where we will not surround the string value with 5130b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// quotes. 5140b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene virtual std::string getAsUnquotedString() const { return getAsString(); } 515f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner 516f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// dump - Debugging method that may be called through a debugger, just 5171a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar /// invokes print on stderr. 518e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 519e62c1185bee05facc25d1d725434f517261d308bChris Lattner 520f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// convertInitializerTo - This virtual function is a simple call-back 521f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// function that should be overridden to call the appropriate 522f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// RecTy::convertValue method. 523f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// 52405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const = 0; 525f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner 526f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// convertInitializerBitRange - This method is used to implement the bitrange 527f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// selection operator. Given an initializer, it selects the specified bits 5287331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner /// out, returning them as a new init of bits type. If it is not legal to use 5297331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner /// the bit subscript operator on this initializer, return null. 530f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// 53105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 532f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const { 533e62c1185bee05facc25d1d725434f517261d308bChris Lattner return 0; 534e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 535e62c1185bee05facc25d1d725434f517261d308bChris Lattner 536b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// convertInitListSlice - This method is used to implement the list slice 537b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// selection operator. Given an initializer, it selects the specified list 538b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// elements, returning them as a new init of list type. If it is not legal 539b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// to take a slice of this, return null. 540b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// 54105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 542f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitListSlice(const std::vector<unsigned> &Elements) const { 543b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner return 0; 544b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner } 545b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner 546a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// getFieldType - This method is used to implement the FieldInit class. 547a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// Implementors of this method should return the type of the named field if 548a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// they are of record type. 549a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// 550a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner virtual RecTy *getFieldType(const std::string &FieldName) const { return 0; } 551a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 552b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// getFieldInit - This method complements getFieldType to return the 553b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// initializer for the specified field. If getFieldType returns non-null 554b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// this method should return non-null, otherwise it returns null. 555b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// 55605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getFieldInit(Record &R, const RecordVal *RV, 55705bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const { 558b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner return 0; 559b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner } 5603da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 561f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// resolveReferences - This method is used by classes that refer to other 562a8449e6aaa6f494d85e75d4755f9c47abf1e06ceBob Wilson /// variables which may not be defined at the time the expression is formed. 563f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// If a value is set for the variable later, this method will be called on 564f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// users of the value to allow the value to propagate out. 565f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// 56605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const { 56705bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<Init *>(this); 5687dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner } 569e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 570e62c1185bee05facc25d1d725434f517261d308bChris Lattner 5711a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const Init &I) { 572e62c1185bee05facc25d1d725434f517261d308bChris Lattner I.print(OS); return OS; 573e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 574e62c1185bee05facc25d1d725434f517261d308bChris Lattner 575beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// TypedInit - This is the common super-class of types that have a specific, 576beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// explicit, type. 577beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// 578beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass TypedInit : public Init { 579beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene RecTy *Ty; 580dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 581dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TypedInit(const TypedInit &Other); // Do not define. 582dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TypedInit &operator=(const TypedInit &Other); // Do not define. 583dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 584dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 585d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit TypedInit(RecTy *T) : Ty(T) {} 586d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher 587dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 588beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene RecTy *getType() const { return Ty; } 589beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 59005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 591f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const; 59205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 593f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitListSlice(const std::vector<unsigned> &Elements) const; 594beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 5959703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// getFieldType - This method is used to implement the FieldInit class. 5969703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// Implementors of this method should return the type of the named field if 5979703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// they are of record type. 5989703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// 5999703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene virtual RecTy *getFieldType(const std::string &FieldName) const; 6009703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene 601beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveBitReference - This method is used to implement 602beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 603beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// simply return the resolved value, otherwise we return null. 604beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// 60505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 60605bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const = 0; 607beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 608beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveListElementReference - This method is used to implement 609beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 610beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// now, we return the resolved value, otherwise we return null. 61105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 61205bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const = 0; 613beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene}; 614beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 61507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 61607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// UnsetInit - ? - Represents an uninitialized value 61707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 6181fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass UnsetInit : public Init { 619dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnsetInit() : Init() {} 620dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnsetInit(const UnsetInit &); // Do not define. 621dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnsetInit &operator=(const UnsetInit &Other); // Do not define. 6222d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 623dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 6241fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 62505bce0beee87512e52428d4b80f5a8e79a949576David Greene static UnsetInit *get(); 626dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 62705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 62805bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<UnsetInit *>(this)); 629e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 630e62c1185bee05facc25d1d725434f517261d308bChris Lattner 631e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual bool isComplete() const { return false; } 6323aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return "?"; } 633e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 634e62c1185bee05facc25d1d725434f517261d308bChris Lattner 63507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 63607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitInit - true/false - Represent a concrete initializer for a bit. 63707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 638e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit : public Init { 639e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool Value; 640dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 641d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit BitInit(bool V) : Value(V) {} 642dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitInit(const BitInit &Other); // Do not define. 643dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitInit &operator=(BitInit &Other); // Do not define. 6442d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 645dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 646dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 64705bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitInit *get(bool V); 648e62c1185bee05facc25d1d725434f517261d308bChris Lattner 649e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool getValue() const { return Value; } 650e62c1185bee05facc25d1d725434f517261d308bChris Lattner 65105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 65205bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<BitInit *>(this)); 653e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 654e62c1185bee05facc25d1d725434f517261d308bChris Lattner 6553aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return Value ? "1" : "0"; } 656e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 657e62c1185bee05facc25d1d725434f517261d308bChris Lattner 65807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value. 65907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// It contains a vector of bits, whose size is determined by the type. 66007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 661726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greeneclass BitsInit : public Init, public FoldingSetNode { 66205bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Bits; 663dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 66405bce0beee87512e52428d4b80f5a8e79a949576David Greene BitsInit(ArrayRef<Init *> Range) : Bits(Range.begin(), Range.end()) {} 665e62c1185bee05facc25d1d725434f517261d308bChris Lattner 666dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitsInit(const BitsInit &Other); // Do not define. 667dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitsInit &operator=(const BitsInit &Other); // Do not define. 668dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 669dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 67005bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitsInit *get(ArrayRef<Init *> Range); 671dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 672726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene void Profile(FoldingSetNodeID &ID) const; 673726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 674e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getNumBits() const { return Bits.size(); } 675e62c1185bee05facc25d1d725434f517261d308bChris Lattner 67605bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getBit(unsigned Bit) const { 677e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(Bit < Bits.size() && "Bit index out of range!"); 678e62c1185bee05facc25d1d725434f517261d308bChris Lattner return Bits[Bit]; 679e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 680e62c1185bee05facc25d1d725434f517261d308bChris Lattner 68105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 68205bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<BitsInit *>(this)); 683e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 68405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 685f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const; 686e62c1185bee05facc25d1d725434f517261d308bChris Lattner 687e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual bool isComplete() const { 688e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0; i != getNumBits(); ++i) 689e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (!getBit(i)->isComplete()) return false; 690e62c1185bee05facc25d1d725434f517261d308bChris Lattner return true; 691e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 6921808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen bool allInComplete() const { 6931808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen for (unsigned i = 0; i != getNumBits(); ++i) 6941808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen if (getBit(i)->isComplete()) return false; 6951808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen return true; 6961808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen } 6973aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 698e62c1185bee05facc25d1d725434f517261d308bChris Lattner 69905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 700e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 701e62c1185bee05facc25d1d725434f517261d308bChris Lattner 70207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 70307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntInit - 7 - Represent an initalization by a literal integer value. 70407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 705e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greeneclass IntInit : public TypedInit { 70663f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t Value; 707dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 70877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen explicit IntInit(int64_t V) : TypedInit(IntRecTy::get()), Value(V) {} 709e62c1185bee05facc25d1d725434f517261d308bChris Lattner 710dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene IntInit(const IntInit &Other); // Do not define. 711dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene IntInit &operator=(const IntInit &Other); // Do note define. 712dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 713dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 71405bce0beee87512e52428d4b80f5a8e79a949576David Greene static IntInit *get(int64_t V); 715dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 71663f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t getValue() const { return Value; } 717e62c1185bee05facc25d1d725434f517261d308bChris Lattner 71805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 71905bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<IntInit *>(this)); 720e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 72105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 722f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const; 723e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7243aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 725e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 726e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveBitReference - This method is used to implement 727e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 728e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// simply return the resolved value, otherwise we return null. 729e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// 73005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 73105bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 732e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene assert(0 && "Illegal bit reference off int"); 733e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene return 0; 734e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 735e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 736e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveListElementReference - This method is used to implement 737e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 738e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// now, we return the resolved value, otherwise we return null. 73905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 74005bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 741e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene assert(0 && "Illegal element reference off int"); 742e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene return 0; 743e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 744e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 745e62c1185bee05facc25d1d725434f517261d308bChris Lattner 74607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 74707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringInit - "foo" - Represent an initialization by a string value. 74807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 749beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass StringInit : public TypedInit { 750e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::string Value; 751dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 752d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit StringInit(const std::string &V) 75377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen : TypedInit(StringRecTy::get()), Value(V) {} 754e62c1185bee05facc25d1d725434f517261d308bChris Lattner 755dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene StringInit(const StringInit &Other); // Do not define. 756dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene StringInit &operator=(const StringInit &Other); // Do not define. 7572d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 758dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 759dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 76005bce0beee87512e52428d4b80f5a8e79a949576David Greene static StringInit *get(const std::string &V); 761dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 7625c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner const std::string &getValue() const { return Value; } 7635c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 76405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 76505bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<StringInit *>(this)); 766e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 767e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7683aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return "\"" + Value + "\""; } 7690b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene virtual std::string getAsUnquotedString() const { return Value; } 770beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 771beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveBitReference - This method is used to implement 772beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 773beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// simply return the resolved value, otherwise we return null. 774beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// 77505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 77605bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 777beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene assert(0 && "Illegal bit reference off string"); 778beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene return 0; 779beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 780beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 781beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveListElementReference - This method is used to implement 782beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 783beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// now, we return the resolved value, otherwise we return null. 78405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 78505bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 786beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene assert(0 && "Illegal element reference off string"); 787beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene return 0; 788beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 789e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 790e62c1185bee05facc25d1d725434f517261d308bChris Lattner 791e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner/// CodeInit - "[{...}]" - Represent a code fragment. 792e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner/// 793e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattnerclass CodeInit : public Init { 794e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner std::string Value; 795dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 796d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit CodeInit(const std::string &V) : Value(V) {} 797e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner 798dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene CodeInit(const CodeInit &Other); // Do not define. 799dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene CodeInit &operator=(const CodeInit &Other); // Do not define. 8002d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 801dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 802dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 80305bce0beee87512e52428d4b80f5a8e79a949576David Greene static CodeInit *get(const std::string &V); 804dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 8057ed1391ff66012e4963081cfb20b6166e8784f50Chris Lattner const std::string &getValue() const { return Value; } 806c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 80705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 80805bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<CodeInit *>(this)); 809e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner } 810e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner 8113aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return "[{" + Value + "}]"; } 812e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner}; 813e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner 81407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// ListInit - [AL, AH, CL] - Represent a list of defs 81507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 816aad4c9fc37b38cae21343173084c81d789535446David Greeneclass ListInit : public TypedInit, public FoldingSetNode { 81705bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Values; 818e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 81905bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::vector<Init*>::const_iterator const_iterator; 8205f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene 821aad4c9fc37b38cae21343173084c81d789535446David Greeneprivate: 82205bce0beee87512e52428d4b80f5a8e79a949576David Greene explicit ListInit(ArrayRef<Init *> Range, RecTy *EltTy) 82360c04af7879c3eda957162737783de726dd177b6David Greene : TypedInit(ListRecTy::get(EltTy)), Values(Range.begin(), Range.end()) {} 824e62c1185bee05facc25d1d725434f517261d308bChris Lattner 825dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene ListInit(const ListInit &Other); // Do not define. 826dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene ListInit &operator=(const ListInit &Other); // Do not define. 827dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 828dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 82905bce0beee87512e52428d4b80f5a8e79a949576David Greene static ListInit *get(ArrayRef<Init *> Range, RecTy *EltTy); 830dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 831aad4c9fc37b38cae21343173084c81d789535446David Greene void Profile(FoldingSetNodeID &ID) const; 832aad4c9fc37b38cae21343173084c81d789535446David Greene 8337cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner unsigned getSize() const { return Values.size(); } 83405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getElement(unsigned i) const { 8357cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner assert(i < Values.size() && "List element index out of range!"); 8367cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return Values[i]; 837e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 838e62c1185bee05facc25d1d725434f517261d308bChris Lattner 83950d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner Record *getElementAsRecord(unsigned i) const; 84021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 84105bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *convertInitListSlice(const std::vector<unsigned> &Elements) const; 842b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner 84305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 84405bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<ListInit *>(this)); 845e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 846e62c1185bee05facc25d1d725434f517261d308bChris Lattner 8471dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// resolveReferences - This method is used by classes that refer to other 8481dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// variables which may not be defined at the time they expression is formed. 8491dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// If a value is set for the variable later, this method will be called on 8501dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// users of the value to allow the value to propagate out. 8511dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// 85205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 8531dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 8543aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 85582137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov 85605bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init*> getValues() const { return Values; } 857c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene 85882137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline const_iterator begin() const { return Values.begin(); } 85982137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline const_iterator end () const { return Values.end(); } 86082137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov 86182137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline size_t size () const { return Values.size(); } 86282137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline bool empty() const { return Values.empty(); } 863e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 864e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveBitReference - This method is used to implement 865e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 866e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// simply return the resolved value, otherwise we return null. 867e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// 86805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 86905bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 870e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene assert(0 && "Illegal bit reference off list"); 871e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene return 0; 872e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 873e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 874e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveListElementReference - This method is used to implement 875e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 876e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// now, we return the resolved value, otherwise we return null. 87705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 87805bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 879e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 880e62c1185bee05facc25d1d725434f517261d308bChris Lattner 8817331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 882d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// OpInit - Base class for operators 883d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 884d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass OpInit : public TypedInit { 885dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit(const OpInit &Other); // Do not define. 886dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit &operator=(OpInit &Other); // Do not define. 887d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher 888dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 889dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene explicit OpInit(RecTy *Type) : TypedInit(Type) {} 890dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 891dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 892d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Clone - Clone this operator, replacing arguments with the new list 89305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const = 0; 894d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 895a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman virtual int getNumOperands() const = 0; 89605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getOperand(int i) const = 0; 897d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 898d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Fold - If possible, fold this to a simpler init. Return this if not 899d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // possible to fold. 90005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const = 0; 901d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 90205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 90305bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<OpInit *>(this)); 904d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 90521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 90605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 90705bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const; 90805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 90905bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 910d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene}; 911d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 912d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 913d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// UnOpInit - !op (X) - Transform an init. 914d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 915e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit : public OpInit { 916e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic: 9171434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene enum UnaryOp { CAST, HEAD, TAIL, EMPTY }; 918e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneprivate: 919e6c27de069225e1122c78385ad22a2ff656db8e6David Greene UnaryOp Opc; 92005bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS; 921dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 92205bce0beee87512e52428d4b80f5a8e79a949576David Greene UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type) 923dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : OpInit(Type), Opc(opc), LHS(lhs) {} 924dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 925dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnOpInit(const UnOpInit &Other); // Do not define. 926dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnOpInit &operator=(const UnOpInit &Other); // Do not define. 927dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 928e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic: 92905bce0beee87512e52428d4b80f5a8e79a949576David Greene static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type); 930d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 931e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // Clone - Clone this operator, replacing arguments with the new list 93205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const { 933aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 1 && 934aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for unary operation"); 935dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return UnOpInit::get(getOpcode(), *Operands.begin(), getType()); 936e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 937d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 938a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman int getNumOperands() const { return 1; } 93905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand(int i) const { 940e6c27de069225e1122c78385ad22a2ff656db8e6David Greene assert(i == 0 && "Invalid operand id for unary operator"); 941e6c27de069225e1122c78385ad22a2ff656db8e6David Greene return getOperand(); 942e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 94321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 944e6c27de069225e1122c78385ad22a2ff656db8e6David Greene UnaryOp getOpcode() const { return Opc; } 94505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand() const { return LHS; } 946d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 947e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // Fold - If possible, fold this to a simpler init. Return this if not 948e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // possible to fold. 94905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const; 950d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 95105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 95221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 953e6c27de069225e1122c78385ad22a2ff656db8e6David Greene virtual std::string getAsString() const; 954e6c27de069225e1122c78385ad22a2ff656db8e6David Greene}; 955e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 956e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// BinOpInit - !op (X, Y) - Combine two inits. 957e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// 958d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass BinOpInit : public OpInit { 959e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greenepublic: 960c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, EQ }; 961e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greeneprivate: 962e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene BinaryOp Opc; 96305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS, *RHS; 964dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 96505bce0beee87512e52428d4b80f5a8e79a949576David Greene BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) : 966dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit(Type), Opc(opc), LHS(lhs), RHS(rhs) {} 967dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 968dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BinOpInit(const BinOpInit &Other); // Do not define. 969dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BinOpInit &operator=(const BinOpInit &Other); // Do not define. 970dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 971dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 97205bce0beee87512e52428d4b80f5a8e79a949576David Greene static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs, 97305bce0beee87512e52428d4b80f5a8e79a949576David Greene RecTy *Type); 97421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 975d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Clone - Clone this operator, replacing arguments with the new list 97605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const { 977aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 2 && 978aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for binary operation"); 979dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType()); 980d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 981d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 982a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman int getNumOperands() const { return 2; } 98305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand(int i) const { 984aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert((i == 0 || i == 1) && "Invalid operand id for binary operator"); 985d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene if (i == 0) { 986d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene return getLHS(); 98721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 988d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene return getRHS(); 989d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 990d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 991d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 992e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene BinaryOp getOpcode() const { return Opc; } 99305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getLHS() const { return LHS; } 99405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getRHS() const { return RHS; } 995e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 996e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene // Fold - If possible, fold this to a simpler init. Return this if not 997e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene // possible to fold. 99805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const; 999e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 100005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 100121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1002e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene virtual std::string getAsString() const; 1003e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene}; 1004e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 1005d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// TernOpInit - !op (X, Y, Z) - Combine two inits. 1006d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 10074afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit : public OpInit { 10084afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greenepublic: 1009ffc0ab6037aa45bc22f57433148e5f586843b3a7David Greene enum TernaryOp { SUBST, FOREACH, IF }; 10104afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneprivate: 10114afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene TernaryOp Opc; 101205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS, *MHS, *RHS; 1013dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 101405bce0beee87512e52428d4b80f5a8e79a949576David Greene TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs, 1015f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene RecTy *Type) : 1016dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit(Type), Opc(opc), LHS(lhs), MHS(mhs), RHS(rhs) {} 1017dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1018dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TernOpInit(const TernOpInit &Other); // Do not define. 1019dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TernOpInit &operator=(const TernOpInit &Other); // Do not define. 1020dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1021dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 102205bce0beee87512e52428d4b80f5a8e79a949576David Greene static TernOpInit *get(TernaryOp opc, Init *lhs, 102305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *mhs, Init *rhs, 102405bce0beee87512e52428d4b80f5a8e79a949576David Greene RecTy *Type); 102521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 10264afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // Clone - Clone this operator, replacing arguments with the new list 102705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const { 1028aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 3 && 1029aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for ternary operation"); 1030dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return TernOpInit::get(getOpcode(), Operands[0], Operands[1], Operands[2], 1031dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene getType()); 10324afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10334afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 1034a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman int getNumOperands() const { return 3; } 103505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand(int i) const { 1036aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert((i == 0 || i == 1 || i == 2) && 1037aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Invalid operand id for ternary operator"); 10384afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene if (i == 0) { 10394afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getLHS(); 104021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else if (i == 1) { 10414afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getMHS(); 104221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 10434afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getRHS(); 10444afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10454afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10464afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 10474afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene TernaryOp getOpcode() const { return Opc; } 104805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getLHS() const { return LHS; } 104905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getMHS() const { return MHS; } 105005bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getRHS() const { return RHS; } 10514afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 10524afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // Fold - If possible, fold this to a simpler init. Return this if not 10534afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // possible to fold. 105405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const; 105521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1056548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling virtual bool isComplete() const { return false; } 1057548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling 105805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 105921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 10604afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene virtual std::string getAsString() const; 10614afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene}; 1062d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 1063e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 106407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// VarInit - 'Opcode' - Represent a reference to an entire variable object. 106507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 10667331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass VarInit : public TypedInit { 1067ee6dca17252de152720655282fb4b74b76fb2fe9David Greene Init *VarName; 1068dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1069d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit VarInit(const std::string &VN, RecTy *T) 1070ee6dca17252de152720655282fb4b74b76fb2fe9David Greene : TypedInit(T), VarName(StringInit::get(VN)) {} 1071ee6dca17252de152720655282fb4b74b76fb2fe9David Greene explicit VarInit(Init *VN, RecTy *T) 1072dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : TypedInit(T), VarName(VN) {} 1073dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1074dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarInit(const VarInit &Other); // Do not define. 1075dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarInit &operator=(const VarInit &Other); // Do not define. 1076dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1077dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 107805bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarInit *get(const std::string &VN, RecTy *T); 107905bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarInit *get(Init *VN, RecTy *T); 10803da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 108105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 108205bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarInit *>(this)); 1083e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1084e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1085ee6dca17252de152720655282fb4b74b76fb2fe9David Greene const std::string &getName() const; 1086ee6dca17252de152720655282fb4b74b76fb2fe9David Greene Init *getNameInit() const { return VarName; } 1087ee6dca17252de152720655282fb4b74b76fb2fe9David Greene std::string getNameInitAsString() const { 1088ee6dca17252de152720655282fb4b74b76fb2fe9David Greene return getNameInit()->getAsUnquotedString(); 1089ee6dca17252de152720655282fb4b74b76fb2fe9David Greene } 1090e62c1185bee05facc25d1d725434f517261d308bChris Lattner 109105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 109205bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const; 109305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 109405bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 10957331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 1096a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner virtual RecTy *getFieldType(const std::string &FieldName) const; 109705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getFieldInit(Record &R, const RecordVal *RV, 109805bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const; 10999b929aa7495ee0b5d389370baeb332456632b2feChris Lattner 11009b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// resolveReferences - This method is used by classes that refer to other 11019b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// variables which may not be defined at the time they expression is formed. 11029b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// If a value is set for the variable later, this method will be called on 11039b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// users of the value to allow the value to propagate out. 11049b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// 110505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 11063da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 1107ee6dca17252de152720655282fb4b74b76fb2fe9David Greene virtual std::string getAsString() const { return getName(); } 1108e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1109e62c1185bee05facc25d1d725434f517261d308bChris Lattner 111007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 11117331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner/// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field. 111207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1113e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass VarBitInit : public Init { 111405bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *TI; 1115e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Bit; 1116dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 111705bce0beee87512e52428d4b80f5a8e79a949576David Greene VarBitInit(TypedInit *T, unsigned B) : TI(T), Bit(B) { 11187331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner assert(T->getType() && dynamic_cast<BitsRecTy*>(T->getType()) && 11197331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner ((BitsRecTy*)T->getType())->getNumBits() > B && 11207331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner "Illegal VarBitInit expression!"); 11217331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner } 1122e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1123dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarBitInit(const VarBitInit &Other); // Do not define. 1124dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarBitInit &operator=(const VarBitInit &Other); // Do not define. 1125dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1126dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 112705bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarBitInit *get(TypedInit *T, unsigned B); 1128dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 112905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 113005bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarBitInit *>(this)); 1131e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1132e62c1185bee05facc25d1d725434f517261d308bChris Lattner 113305bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *getVariable() const { return TI; } 1134e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getBitNum() const { return Bit; } 11353da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 11363aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 113705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 1138e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1139e62c1185bee05facc25d1d725434f517261d308bChris Lattner 11403da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman/// VarListElementInit - List[4] - Represent access to one element of a var or 11411dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner/// field. 11421dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit : public TypedInit { 114305bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *TI; 11441dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner unsigned Element; 1145dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 114605bce0beee87512e52428d4b80f5a8e79a949576David Greene VarListElementInit(TypedInit *T, unsigned E) 1147dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : TypedInit(dynamic_cast<ListRecTy*>(T->getType())->getElementType()), 1148dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TI(T), Element(E) { 11491dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner assert(T->getType() && dynamic_cast<ListRecTy*>(T->getType()) && 11501dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner "Illegal VarBitInit expression!"); 11511dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 11521dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 1153dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarListElementInit(const VarListElementInit &Other); // Do not define. 1154dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarListElementInit &operator=(const VarListElementInit &Other); // Do 1155dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene // not 1156dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene // define. 1157dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1158dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 115905bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarListElementInit *get(TypedInit *T, unsigned E); 1160dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 116105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 116205bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarListElementInit *>(this)); 11631dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 11641dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 116505bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *getVariable() const { return TI; } 11661dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner unsigned getElementNum() const { return Element; } 11671dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 116805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 116905bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const; 11701dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 11711dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// resolveListElementReference - This method is used to implement 11721dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// VarListElementInit::resolveReferences. If the list element is resolvable 11731dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// now, we return the resolved value, otherwise we return null. 117405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, 117505bce0beee87512e52428d4b80f5a8e79a949576David Greene const RecordVal *RV, 117605bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 11771dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 11783aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 117905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 11801dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner}; 118107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 118207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// DefInit - AL - Represent a reference to a 'def' in the description 118307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1184beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass DefInit : public TypedInit { 1185e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *Def; 1186dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 118777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit(Record *D, RecordRecTy *T) : TypedInit(T), Def(D) {} 118877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen friend class Record; 1189dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1190dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DefInit(const DefInit &Other); // Do not define. 1191dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DefInit &operator=(const DefInit &Other); // Do not define. 1192dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1193e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 119405bce0beee87512e52428d4b80f5a8e79a949576David Greene static DefInit *get(Record*); 11953da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 119605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 119705bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<DefInit *>(this)); 1198e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1199e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1200e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getDef() const { return Def; } 1201e62c1185bee05facc25d1d725434f517261d308bChris Lattner 120205bce0beee87512e52428d4b80f5a8e79a949576David Greene //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits); 1203b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner 1204b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner virtual RecTy *getFieldType(const std::string &FieldName) const; 120505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getFieldInit(Record &R, const RecordVal *RV, 120605bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const; 12073da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 12083aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 1209beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 1210beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveBitReference - This method is used to implement 1211beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 1212beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// simply return the resolved value, otherwise we return null. 1213beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// 121405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 121505bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 1216beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene assert(0 && "Illegal bit reference off def"); 1217beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene return 0; 1218beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 1219beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 1220beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveListElementReference - This method is used to implement 1221beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 1222beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// now, we return the resolved value, otherwise we return null. 122305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 122405bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 1225beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene assert(0 && "Illegal element reference off def"); 1226beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene return 0; 1227beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 1228e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1229e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1230e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1231a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner/// FieldInit - X.Y - Represent a reference to a subfield of a variable 1232a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner/// 12337331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass FieldInit : public TypedInit { 123405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Rec; // Record we are referring to 1235a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner std::string FieldName; // Field we are accessing 1236dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 123705bce0beee87512e52428d4b80f5a8e79a949576David Greene FieldInit(Init *R, const std::string &FN) 1238dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : TypedInit(R->getFieldType(FN)), Rec(R), FieldName(FN) { 12397331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner assert(getType() && "FieldInit with non-record type!"); 1240a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner } 1241a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 1242dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene FieldInit(const FieldInit &Other); // Do not define. 1243dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene FieldInit &operator=(const FieldInit &Other); // Do not define. 1244dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1245dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 124605bce0beee87512e52428d4b80f5a8e79a949576David Greene static FieldInit *get(Init *R, const std::string &FN); 124705bce0beee87512e52428d4b80f5a8e79a949576David Greene static FieldInit *get(Init *R, const Init *FN); 1248dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 124905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 125005bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<FieldInit *>(this)); 1251a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner } 1252a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 125305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 125405bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const; 125505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, 125605bce0beee87512e52428d4b80f5a8e79a949576David Greene const RecordVal *RV, 125705bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 12587331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 125905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 126024151a6888c752ff1d7fc80b500f5a836c9ac528Chris Lattner 12613aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { 12623aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return Rec->getAsString() + "." + FieldName; 1263a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner } 1264a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner}; 1265a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 12668c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// DagInit - (v a, b) - Represent a DAG tree value. DAG inits are required 12678c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// to have at least one value then a (possibly empty) list of arguments. Each 12688c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// argument can have a name associated with it. 12698e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner/// 127078621a851ae84520de7d24a6d61e1dcf25749712David Greeneclass DagInit : public TypedInit, public FoldingSetNode { 127105bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Val; 12727cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman std::string ValName; 127305bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Args; 127491290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner std::vector<std::string> ArgNames; 1275dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 127605bce0beee87512e52428d4b80f5a8e79a949576David Greene DagInit(Init *V, const std::string &VN, 127705bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init *> ArgRange, 127878621a851ae84520de7d24a6d61e1dcf25749712David Greene ArrayRef<std::string> NameRange) 127978621a851ae84520de7d24a6d61e1dcf25749712David Greene : TypedInit(DagRecTy::get()), Val(V), ValName(VN), 128078621a851ae84520de7d24a6d61e1dcf25749712David Greene Args(ArgRange.begin(), ArgRange.end()), 128178621a851ae84520de7d24a6d61e1dcf25749712David Greene ArgNames(NameRange.begin(), NameRange.end()) {} 128221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1283dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DagInit(const DagInit &Other); // Do not define. 1284dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DagInit &operator=(const DagInit &Other); // Do not define. 1285dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1286dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 128705bce0beee87512e52428d4b80f5a8e79a949576David Greene static DagInit *get(Init *V, const std::string &VN, 128805bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init *> ArgRange, 128905bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<std::string> NameRange); 129005bce0beee87512e52428d4b80f5a8e79a949576David Greene static DagInit *get(Init *V, const std::string &VN, 129105bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::vector< 129205bce0beee87512e52428d4b80f5a8e79a949576David Greene std::pair<Init*, std::string> > &args); 1293dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 129478621a851ae84520de7d24a6d61e1dcf25749712David Greene void Profile(FoldingSetNodeID &ID) const; 1295dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 129605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 129705bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<DagInit *>(this)); 12988e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner } 12998e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner 130005bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperator() const { return Val; } 130191290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner 13027cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman const std::string &getName() const { return ValName; } 13037cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman 130491290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner unsigned getNumArgs() const { return Args.size(); } 130505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getArg(unsigned Num) const { 130691290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner assert(Num < Args.size() && "Arg number out of range!"); 130791290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner return Args[Num]; 130891290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner } 130991290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner const std::string &getArgName(unsigned Num) const { 131091290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner assert(Num < ArgNames.size() && "Arg number out of range!"); 131191290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner return ArgNames[Num]; 131291290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner } 13138e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner 131405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 1315990db46e9ae7faa742a152ca4126d0bee9f1df9cChris Lattner 13163aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 13177674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 131805bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::vector<Init*>::const_iterator const_arg_iterator; 13197674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov typedef std::vector<std::string>::const_iterator const_name_iterator; 13207674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 13217674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_arg_iterator arg_begin() const { return Args.begin(); } 13227674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_arg_iterator arg_end () const { return Args.end(); } 13237674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 13247674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline size_t arg_size () const { return Args.size(); } 13257674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline bool arg_empty() const { return Args.empty(); } 13267674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 13277674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_name_iterator name_begin() const { return ArgNames.begin(); } 13287674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_name_iterator name_end () const { return ArgNames.end(); } 13297674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 13307674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline size_t name_size () const { return ArgNames.size(); } 13317674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline bool name_empty() const { return ArgNames.empty(); } 13327674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 133305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 133405bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 1335beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene assert(0 && "Illegal bit reference off dag"); 1336beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene return 0; 1337beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 133821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 133905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 134005bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 1341beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene assert(0 && "Illegal element reference off dag"); 1342beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene return 0; 1343beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 13448e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner}; 1345e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1346e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1347e62c1185bee05facc25d1d725434f517261d308bChris Lattner// High-Level Classes 1348e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1349e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1350e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordVal { 1351011dca7fac07100695dd3685bfaddbea58a468b9David Greene Init *Name; 1352e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecTy *Ty; 1353e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Prefix; 135405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Value; 1355e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1356011dca7fac07100695dd3685bfaddbea58a468b9David Greene RecordVal(Init *N, RecTy *T, unsigned P); 1357e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecordVal(const std::string &N, RecTy *T, unsigned P); 1358e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1359011dca7fac07100695dd3685bfaddbea58a468b9David Greene const std::string &getName() const; 1360de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene const Init *getNameInit() const { return Name; } 1361de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene std::string getNameInitAsString() const { 1362de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene return getNameInit()->getAsUnquotedString(); 1363de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene } 1364e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1365e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getPrefix() const { return Prefix; } 1366e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecTy *getType() const { return Ty; } 136705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getValue() const { return Value; } 1368e62c1185bee05facc25d1d725434f517261d308bChris Lattner 136905bce0beee87512e52428d4b80f5a8e79a949576David Greene bool setValue(Init *V) { 1370e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (V) { 1371e62c1185bee05facc25d1d725434f517261d308bChris Lattner Value = V->convertInitializerTo(Ty); 1372e62c1185bee05facc25d1d725434f517261d308bChris Lattner return Value == 0; 1373e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1374e62c1185bee05facc25d1d725434f517261d308bChris Lattner Value = 0; 1375e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1376e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1377e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1378e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 13791a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar void print(raw_ostream &OS, bool PrintSem = true) const; 1380e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1381e62c1185bee05facc25d1d725434f517261d308bChris Lattner 13821a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecordVal &RV) { 1383e62c1185bee05facc25d1d725434f517261d308bChris Lattner RV.print(OS << " "); 1384e62c1185bee05facc25d1d725434f517261d308bChris Lattner return OS; 1385e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1386e62c1185bee05facc25d1d725434f517261d308bChris Lattner 138789e0f74094a6a86170c2c70fe8c6c19cb99c97a0Chris Lattnerclass Record { 13886f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar static unsigned LastID; 13896f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar 13906f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar // Unique record ID. 13916f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar unsigned ID; 13920d886401b3ec09b0c2d267942b07702a2f0740f4David Greene Init *Name; 13931e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner SMLoc Loc; 1394e22b321d2276b634519165b101b02d92c2fcf5c7David Greene std::vector<Init *> TemplateArgs; 1395e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::vector<RecordVal> Values; 1396e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::vector<Record*> SuperClasses; 139767db883487fca3472fdde51e931657e22d4d0495Chris Lattner 139867db883487fca3472fdde51e931657e22d4d0495Chris Lattner // Tracks Record instances. Not owned by Record. 139967db883487fca3472fdde51e931657e22d4d0495Chris Lattner RecordKeeper &TrackedRecords; 140067db883487fca3472fdde51e931657e22d4d0495Chris Lattner 140177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit *TheInit; 140277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 1403f7931b7040de1c829e678b4e391308bc3376f8a0David Greene void init(); 14040d886401b3ec09b0c2d267942b07702a2f0740f4David Greene void checkName(); 14050d886401b3ec09b0c2d267942b07702a2f0740f4David Greene 1406e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1407e62c1185bee05facc25d1d725434f517261d308bChris Lattner 14089c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner // Constructs a record. 14099c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner explicit Record(const std::string &N, SMLoc loc, RecordKeeper &records) : 14100abdadbce7e04af76145154d75ca41dab749b8d6David Greene ID(LastID++), Name(StringInit::get(N)), Loc(loc), TrackedRecords(records), 14110abdadbce7e04af76145154d75ca41dab749b8d6David Greene TheInit(0) { 1412004adaf3452a355ada2a54bcb61dc8925a718651David Greene init(); 14130abdadbce7e04af76145154d75ca41dab749b8d6David Greene } 1414675f85d0f240930d571f4e557bb92237ee48124eDavid Greene explicit Record(Init *N, SMLoc loc, RecordKeeper &records) : 1415675f85d0f240930d571f4e557bb92237ee48124eDavid Greene ID(LastID++), Name(N), Loc(loc), TrackedRecords(records), TheInit(0) { 1416004adaf3452a355ada2a54bcb61dc8925a718651David Greene init(); 1417675f85d0f240930d571f4e557bb92237ee48124eDavid Greene } 1418e62c1185bee05facc25d1d725434f517261d308bChris Lattner ~Record() {} 141921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1420f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 1421117ccb7e518f05e4bf3df058fc402262f897ff0bChris Lattner static unsigned getNewUID() { return LastID++; } 1422f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 1423f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 14246f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar unsigned getID() const { return ID; } 14256f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar 14260d886401b3ec09b0c2d267942b07702a2f0740f4David Greene const std::string &getName() const; 1427d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene Init *getNameInit() const { 1428d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene return Name; 1429d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene } 1430d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene const std::string getNameInitAsString() const { 1431d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene return getNameInit()->getAsUnquotedString(); 1432d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene } 1433d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene 14340d886401b3ec09b0c2d267942b07702a2f0740f4David Greene void setName(Init *Name); // Also updates RecordKeeper. 1435936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void setName(const std::string &Name); // Also updates RecordKeeper. 143621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 14371e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner SMLoc getLoc() const { return Loc; } 143821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 143977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen /// get the corresponding DefInit. 144077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit *getDefInit(); 144177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 1442e22b321d2276b634519165b101b02d92c2fcf5c7David Greene const std::vector<Init *> &getTemplateArgs() const { 1443e62c1185bee05facc25d1d725434f517261d308bChris Lattner return TemplateArgs; 1444e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1445e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::vector<RecordVal> &getValues() const { return Values; } 1446e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::vector<Record*> &getSuperClasses() const { return SuperClasses; } 1447e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1448e22b321d2276b634519165b101b02d92c2fcf5c7David Greene bool isTemplateArg(Init *Name) const { 1449e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i) 1450e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (TemplateArgs[i] == Name) return true; 1451e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1452e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1453e22b321d2276b634519165b101b02d92c2fcf5c7David Greene bool isTemplateArg(StringRef Name) const { 1454e22b321d2276b634519165b101b02d92c2fcf5c7David Greene return isTemplateArg(StringInit::get(Name.str())); 1455e22b321d2276b634519165b101b02d92c2fcf5c7David Greene } 1456e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1457c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner const RecordVal *getValue(StringRef Name) const { 1458e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 1459e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (Values[i].getName() == Name) return &Values[i]; 1460e62c1185bee05facc25d1d725434f517261d308bChris Lattner return 0; 1461e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1462c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner RecordVal *getValue(StringRef Name) { 1463e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 1464e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (Values[i].getName() == Name) return &Values[i]; 1465e62c1185bee05facc25d1d725434f517261d308bChris Lattner return 0; 1466e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1467e62c1185bee05facc25d1d725434f517261d308bChris Lattner 146896a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene const RecordVal *getValue(Init *Name) const; 146996a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene RecordVal *getValue(Init *Name); 147096a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene 1471e22b321d2276b634519165b101b02d92c2fcf5c7David Greene void addTemplateArg(Init *Name) { 1472e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(!isTemplateArg(Name) && "Template arg already defined!"); 1473e62c1185bee05facc25d1d725434f517261d308bChris Lattner TemplateArgs.push_back(Name); 1474e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1475e22b321d2276b634519165b101b02d92c2fcf5c7David Greene void addTemplateArg(StringRef Name) { 1476e22b321d2276b634519165b101b02d92c2fcf5c7David Greene addTemplateArg(StringInit::get(Name.str())); 1477e22b321d2276b634519165b101b02d92c2fcf5c7David Greene } 1478e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1479e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addValue(const RecordVal &RV) { 1480e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(getValue(RV.getName()) == 0 && "Value already added!"); 1481e62c1185bee05facc25d1d725434f517261d308bChris Lattner Values.push_back(RV); 1482e338565757bfcfe9d762751c976684f66954fb45David Greene if (Values.size() > 1) 1483e338565757bfcfe9d762751c976684f66954fb45David Greene // Keep NAME at the end of the list. It makes record dumps a 1484e338565757bfcfe9d762751c976684f66954fb45David Greene // bit prettier and allows TableGen tests to be written more 1485e338565757bfcfe9d762751c976684f66954fb45David Greene // naturally. Tests can use CHECK-NEXT to look for Record 1486e338565757bfcfe9d762751c976684f66954fb45David Greene // fields they expect to see after a def. They can't do that if 1487e338565757bfcfe9d762751c976684f66954fb45David Greene // NAME is the first Record field. 1488e338565757bfcfe9d762751c976684f66954fb45David Greene std::swap(Values[Values.size() - 2], Values[Values.size() - 1]); 1489e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1490e62c1185bee05facc25d1d725434f517261d308bChris Lattner 149196a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene void removeValue(Init *Name) { 1492bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 149396a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene if (Values[i].getNameInit() == Name) { 1494bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner Values.erase(Values.begin()+i); 1495bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner return; 1496bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner } 14978478a5bcfba9ff80674ee78aa4447597c449fb43Bob Wilson assert(0 && "Cannot remove an entry that does not exist!"); 1498bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner } 1499bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner 150096a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene void removeValue(StringRef Name) { 150196a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene removeValue(StringInit::get(Name.str())); 150296a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene } 150396a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene 150402475f1fd502fa1729d1fc447417087acf9e96c8Ted Kremenek bool isSubClassOf(const Record *R) const { 1505e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i) 1506e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (SuperClasses[i] == R) 1507ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen return true; 1508e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1509e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1510e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1511c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner bool isSubClassOf(StringRef Name) const { 1512a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i) 15137474c29d903d479e7f99eb0d1d097f75289c5f48David Greene if (SuperClasses[i]->getNameInitAsString() == Name) 1514a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner return true; 1515a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner return false; 1516a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner } 1517a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner 1518e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addSuperClass(Record *R) { 1519e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(!isSubClassOf(R) && "Already subclassing record!"); 1520e62c1185bee05facc25d1d725434f517261d308bChris Lattner SuperClasses.push_back(R); 1521e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1522e62c1185bee05facc25d1d725434f517261d308bChris Lattner 15237dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// resolveReferences - If there are any field references that refer to fields 15247dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// that have been filled in, we can propagate the values now. 15257dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// 15267dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner void resolveReferences() { resolveReferencesTo(0); } 15277dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner 15287dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// resolveReferencesTo - If anything in this record refers to RV, replace the 15297dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// reference to RV with the RHS of RV. If RV is null, we resolve all 15307dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// possible references. 15317dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner void resolveReferencesTo(const RecordVal *RV); 1532e62c1185bee05facc25d1d725434f517261d308bChris Lattner 153367db883487fca3472fdde51e931657e22d4d0495Chris Lattner RecordKeeper &getRecords() const { 15349c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner return TrackedRecords; 153567db883487fca3472fdde51e931657e22d4d0495Chris Lattner } 153667db883487fca3472fdde51e931657e22d4d0495Chris Lattner 1537e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 15385c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 15395c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner //===--------------------------------------------------------------------===// 15405c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner // High-level methods useful to tablegen back-ends 15415c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner // 15425c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 1543c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// getValueInit - Return the initializer for a value with the specified name, 1544c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// or throw an exception if the field does not exist. 1545c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// 154605bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getValueInit(StringRef FieldName) const; 1547c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 15485c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// getValueAsString - This method looks up the specified field and returns 15495c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// its value as a string, throwing an exception if the field does not exist 15505c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// or if the value is not a string. 15515c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// 1552c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::string getValueAsString(StringRef FieldName) const; 15535c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 15546f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// getValueAsBitsInit - This method looks up the specified field and returns 15556f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// its value as a BitsInit, throwing an exception if the field does not exist 15566f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// or if the value is not the right type. 15576f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// 155805bce0beee87512e52428d4b80f5a8e79a949576David Greene BitsInit *getValueAsBitsInit(StringRef FieldName) const; 15596f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner 156058c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// getValueAsListInit - This method looks up the specified field and returns 156158c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// its value as a ListInit, throwing an exception if the field does not exist 156258c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// or if the value is not the right type. 156358c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// 156405bce0beee87512e52428d4b80f5a8e79a949576David Greene ListInit *getValueAsListInit(StringRef FieldName) const; 156558c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner 1566b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner /// getValueAsListOfDefs - This method looks up the specified field and 1567af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov /// returns its value as a vector of records, throwing an exception if the 1568b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner /// field does not exist or if the value is not the right type. 1569fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey /// 1570c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::vector<Record*> getValueAsListOfDefs(StringRef FieldName) const; 1571fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey 1572f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// getValueAsListOfInts - This method looks up the specified field and 1573f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// returns its value as a vector of integers, throwing an exception if the 1574f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// field does not exist or if the value is not the right type. 1575af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov /// 1576c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const; 157721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1578bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// getValueAsListOfStrings - This method looks up the specified field and 1579bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// returns its value as a vector of strings, throwing an exception if the 1580bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// field does not exist or if the value is not the right type. 1581bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// 1582bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson std::vector<std::string> getValueAsListOfStrings(StringRef FieldName) const; 1583bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson 1584dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// getValueAsDef - This method looks up the specified field and returns its 1585dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// value as a Record, throwing an exception if the field does not exist or if 1586dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// the value is not the right type. 1587dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// 1588c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner Record *getValueAsDef(StringRef FieldName) const; 1589dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner 15900969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// getValueAsBit - This method looks up the specified field and returns its 15910969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// value as a bit, throwing an exception if the field does not exist or if 15920969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// the value is not the right type. 15930969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// 1594c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner bool getValueAsBit(StringRef FieldName) const; 15950969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner 159658c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// getValueAsInt - This method looks up the specified field and returns its 159763f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman /// value as an int64_t, throwing an exception if the field does not exist or 159863f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman /// if the value is not the right type. 159958c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// 1600c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner int64_t getValueAsInt(StringRef FieldName) const; 1601784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner 1602784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// getValueAsDag - This method looks up the specified field and returns its 1603784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// value as an Dag, throwing an exception if the field does not exist or if 1604784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// the value is not the right type. 1605784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// 160605bce0beee87512e52428d4b80f5a8e79a949576David Greene DagInit *getValueAsDag(StringRef FieldName) const; 160721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 16088f493130bb51dea34c49e08aeab161e6a32dfdc6Chris Lattner /// getValueAsCode - This method looks up the specified field and returns 16098f493130bb51dea34c49e08aeab161e6a32dfdc6Chris Lattner /// its value as the string data in a CodeInit, throwing an exception if the 16108f493130bb51dea34c49e08aeab161e6a32dfdc6Chris Lattner /// field does not exist or if the value is not a code object. 16118f493130bb51dea34c49e08aeab161e6a32dfdc6Chris Lattner /// 1612c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::string getValueAsCode(StringRef FieldName) const; 1613e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1614e62c1185bee05facc25d1d725434f517261d308bChris Lattner 16151a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const Record &R); 1616e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1617c7cafcd815519b06318629b424abe746437e1389David Greenestruct MultiClass { 1618c7cafcd815519b06318629b424abe746437e1389David Greene Record Rec; // Placeholder for template args and Name. 1619c7cafcd815519b06318629b424abe746437e1389David Greene typedef std::vector<Record*> RecordVector; 1620c7cafcd815519b06318629b424abe746437e1389David Greene RecordVector DefPrototypes; 1621d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 1622d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene void dump() const; 1623d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 162467db883487fca3472fdde51e931657e22d4d0495Chris Lattner MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) : 162567db883487fca3472fdde51e931657e22d4d0495Chris Lattner Rec(Name, Loc, Records) {} 1626c7cafcd815519b06318629b424abe746437e1389David Greene}; 1627c7cafcd815519b06318629b424abe746437e1389David Greene 1628e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordKeeper { 1629e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*> Classes, Defs; 1630e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1631e62c1185bee05facc25d1d725434f517261d308bChris Lattner ~RecordKeeper() { 1632e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (std::map<std::string, Record*>::iterator I = Classes.begin(), 1633ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen E = Classes.end(); I != E; ++I) 1634e62c1185bee05facc25d1d725434f517261d308bChris Lattner delete I->second; 1635e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (std::map<std::string, Record*>::iterator I = Defs.begin(), 1636ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen E = Defs.end(); I != E; ++I) 1637e62c1185bee05facc25d1d725434f517261d308bChris Lattner delete I->second; 1638e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 16393da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 1640e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::map<std::string, Record*> &getClasses() const { return Classes; } 1641e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::map<std::string, Record*> &getDefs() const { return Defs; } 1642e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1643e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getClass(const std::string &Name) const { 1644e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*>::const_iterator I = Classes.find(Name); 1645e62c1185bee05facc25d1d725434f517261d308bChris Lattner return I == Classes.end() ? 0 : I->second; 1646e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1647e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getDef(const std::string &Name) const { 1648e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*>::const_iterator I = Defs.find(Name); 1649e62c1185bee05facc25d1d725434f517261d308bChris Lattner return I == Defs.end() ? 0 : I->second; 1650e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1651e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addClass(Record *R) { 16520615d6aac810059a37fbced0f315cce75476da49David Greene assert(getClass(R->getNameInitAsString()) == 0 && "Class already exists!"); 16530615d6aac810059a37fbced0f315cce75476da49David Greene Classes.insert(std::make_pair(R->getNameInitAsString(), R)); 1654e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1655e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addDef(Record *R) { 16560615d6aac810059a37fbced0f315cce75476da49David Greene assert(getDef(R->getNameInitAsString()) == 0 && "Def already exists!"); 16570615d6aac810059a37fbced0f315cce75476da49David Greene Defs.insert(std::make_pair(R->getNameInitAsString(), R)); 1658e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1659e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1660936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// removeClass - Remove, but do not delete, the specified record. 1661936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// 1662936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void removeClass(const std::string &Name) { 1663936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner assert(Classes.count(Name) && "Class does not exist!"); 1664936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner Classes.erase(Name); 1665936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner } 1666936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// removeDef - Remove, but do not delete, the specified record. 1667936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// 1668936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void removeDef(const std::string &Name) { 1669936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner assert(Defs.count(Name) && "Def does not exist!"); 1670936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner Defs.erase(Name); 1671936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner } 167221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1673ab47ae3381aa2372009a9054260461c20324b555Chris Lattner //===--------------------------------------------------------------------===// 1674ab47ae3381aa2372009a9054260461c20324b555Chris Lattner // High-level helper methods, useful for tablegen backends... 1675ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 1676ab47ae3381aa2372009a9054260461c20324b555Chris Lattner /// getAllDerivedDefinitions - This method returns all concrete definitions 1677ab47ae3381aa2372009a9054260461c20324b555Chris Lattner /// that derive from the specified class name. If a class with the specified 16785c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// name does not exist, an exception is thrown. 16795c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner std::vector<Record*> 16805c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner getAllDerivedDefinitions(const std::string &ClassName) const; 1681ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 1682e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 1683e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1684e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1685690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// LessRecord - Sorting predicate to sort record pointers by name. 1686690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// 1687690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecord { 1688690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner bool operator()(const Record *Rec1, const Record *Rec2) const { 1689160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0; 1690690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner } 1691690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner}; 1692690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner 169321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// LessRecordFieldName - Sorting predicate to sort record pointers by their 16947c9a7728d9dd248ebee8f2dd969d303711d487a9Jim Grosbach/// name field. 1695690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// 1696690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecordFieldName { 1697690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner bool operator()(const Record *Rec1, const Record *Rec2) const { 1698690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name"); 1699690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner } 1700690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner}; 1701690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner 17021a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK); 1703e62c1185bee05facc25d1d725434f517261d308bChris Lattner 170430c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring 170530c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name. 170630c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass, 170730c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene Init *Name, const std::string &Scoper); 170830c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 170930c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring 171030c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name. 171130c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass, 171230c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene const std::string &Name, const std::string &Scoper); 171330c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 1714d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 1715d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 1716e62c1185bee05facc25d1d725434f517261d308bChris Lattner#endif 1717