Record.h revision 50bee42b54cd9aec5f49566307df2b0cf23afcf6
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" 2350bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper#include "llvm/Support/ErrorHandling.h" 241a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar#include "llvm/Support/raw_ostream.h" 25e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include <map> 26028936ada14335bb04f377d46a6261dc4c66dafdJohn Criswell 27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 281a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarclass raw_ostream; 2921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 307dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// RecTy subclasses. 317cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitRecTy; 327cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitsRecTy; 337cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass IntRecTy; 347cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass StringRecTy; 357cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass ListRecTy; 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; 46e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListInit; 47e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit; 48711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattnerclass BinOpInit; 494afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit; 50e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass DefInit; 518e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattnerclass DagInit; 52b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass TypedInit; 53b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarInit; 54a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattnerclass FieldInit; 55b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarBitInit; 561dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit; 577cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 587dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// Other classes. 59e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass Record; 607dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattnerclass RecordVal; 61293b13350c2fbae8a64b0b0beb440cb859968c8cBob Wilsonstruct MultiClass; 6267db883487fca3472fdde51e931657e22d4d0495Chris Lattnerclass RecordKeeper; 63e62c1185bee05facc25d1d725434f517261d308bChris Lattner 64e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 65e62c1185bee05facc25d1d725434f517261d308bChris Lattner// Type Classes 66e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 67e62c1185bee05facc25d1d725434f517261d308bChris Lattner 6877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenclass RecTy { 6977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen ListRecTy *ListTy; 702d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 7177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 7277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen RecTy() : ListTy(0) {} 73e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual ~RecTy() {} 74e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7599ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner virtual std::string getAsString() const = 0; 761a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar void print(raw_ostream &OS) const { OS << getAsString(); } 777cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner void dump() const; 787cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 797cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner /// typeIsConvertibleTo - Return true if all values of 'this' type can be 807cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner /// converted to the specified type. 817cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool typeIsConvertibleTo(const RecTy *RHS) const = 0; 827cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 8377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen /// getListTy - Returns the type representing list<this>. 8477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen ListRecTy *getListTy(); 8577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 867cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerpublic: // These methods should only be called from subclasses of Init 8705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return 0; } 8805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 8905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 9005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 9105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 9205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 9305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { 9405bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)UI); 95e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 9605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { 9705bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)UI); 98e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene } 9905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { 10005bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)UI); 1014afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 10305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 10405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 10505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI) { return 0; } 10605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { 10705bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)VI); 108b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner } 10905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { 11005bce0beee87512e52428d4b80f5a8e79a949576David Greene return convertValue((TypedInit*)FI); 111b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner } 112e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1137cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerpublic: // These methods should only be called by subclasses of RecTy. 1147cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner // baseClassOf - These virtual methods should be overloaded to return true iff 1157cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner // all values of type 'RHS' can be converted to the 'this' type. 1167cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 1177cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 1187cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 1197cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 1207cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 12140f71134b9fef0ca06c516f033cc9403394a913cChris Lattner virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 1227cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 123e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 124e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1251a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecTy &Ty) { 126e62c1185bee05facc25d1d725434f517261d308bChris Lattner Ty.print(OS); 127e62c1185bee05facc25d1d725434f517261d308bChris Lattner return OS; 128e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 129e62c1185bee05facc25d1d725434f517261d308bChris Lattner 13007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 13107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitRecTy - 'bit' - Represent a single bit 13207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1331fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass BitRecTy : public RecTy { 13477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static BitRecTy Shared; 13577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen BitRecTy() {} 1361fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 13777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static BitRecTy *get() { return &Shared; } 13877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 13905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 14005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return (Init*)BI; } 14105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI); 14205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II); 14305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 14405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 14505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return (Init*)VB; } 14605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 14705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 14805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 14905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 15005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 15105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 15205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 15305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 154e62c1185bee05facc25d1d725434f517261d308bChris Lattner 15599ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const { return "bit"; } 1567cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 1577cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 1587cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 1597cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 160ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return true; } 161ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const; 162ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return true; } 163ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 164ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 165ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 166ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 167ead87b671278379f92890fddd859a301bb68f462Reid Spencer 168e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 169e62c1185bee05facc25d1d725434f517261d308bChris Lattner 17007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 171234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// BitsRecTy - 'bits<n>' - Represent a fixed number of bits 172234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// BitsRecTy - 'bits<n>' - Represent a fixed number of bits 17307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 174e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsRecTy : public RecTy { 175e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Size; 1761002c0203450620594a85454c6a095ca94b87cb2Dan Gohman explicit BitsRecTy(unsigned Sz) : Size(Sz) {} 17777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 17877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static BitsRecTy *get(unsigned Sz); 179e62c1185bee05facc25d1d725434f517261d308bChris Lattner 180e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getNumBits() const { return Size; } 181e62c1185bee05facc25d1d725434f517261d308bChris Lattner 18205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI); 18305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *UI); 18405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI); 18505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II); 18605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 18705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 18805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 18905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 19005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 19105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 19205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 19305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 19405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 19505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 19605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 197ead87b671278379f92890fddd859a301bb68f462Reid Spencer 19899ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const; 1997cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 2007cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 2017cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 2027cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 203ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return Size == 1; } 204ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { 2057cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->Size == Size; 2067cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 207ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return true; } 208ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 209ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 210ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 211ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 212ead87b671278379f92890fddd859a301bb68f462Reid Spencer 213e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 214e62c1185bee05facc25d1d725434f517261d308bChris Lattner 21507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 21607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntRecTy - 'int' - Represent an integer value of no particular size 21707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 2181fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass IntRecTy : public RecTy { 21977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static IntRecTy Shared; 22077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen IntRecTy() {} 2211fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 22277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static IntRecTy *get() { return &Shared; } 22377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 22405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 22505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI); 22605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI); 22705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return (Init*)II; } 22805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 22905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 23005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 23105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 23205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 23305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 23405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 23505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 23605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 23705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 23805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 239ead87b671278379f92890fddd859a301bb68f462Reid Spencer 24099ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const { return "int"; } 2417cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 2427cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 2437cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 2447cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 2457cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 246ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return true; } 247ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return true; } 248ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return true; } 249ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 250ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 251ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 252ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 253ead87b671278379f92890fddd859a301bb68f462Reid Spencer 254e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 255e62c1185bee05facc25d1d725434f517261d308bChris Lattner 25607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringRecTy - 'string' - Represent an string value 25707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 2581fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass StringRecTy : public RecTy { 25977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static StringRecTy Shared; 26077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen StringRecTy() {} 2611fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 26277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static StringRecTy *get() { return &Shared; } 26377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 26405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 26505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 26605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 26705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 26805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return (Init*)SI; } 26905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 27005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *BO); 27105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *BO); 27205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);} 27305bce0beee87512e52428d4b80f5a8e79a949576David Greene 27405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 27505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 27605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 27705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 27805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 27905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 280ead87b671278379f92890fddd859a301bb68f462Reid Spencer 28199ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const { return "string"; } 2827cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 2837cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 2847cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 2857cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 2867cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 287ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 288ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 289ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 2907cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const StringRecTy *RHS) const { return true; } 291ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 292ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 293ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 294e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 295e62c1185bee05facc25d1d725434f517261d308bChris Lattner 296234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of 297234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// the specified type. 298234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must 299234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// be of the specified type. 30007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 301e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListRecTy : public RecTy { 3027cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner RecTy *Ty; 3031002c0203450620594a85454c6a095ca94b87cb2Dan Gohman explicit ListRecTy(RecTy *T) : Ty(T) {} 30477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen friend ListRecTy *RecTy::getListTy(); 30577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 30677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static ListRecTy *get(RecTy *T) { return T->getListTy(); } 3077cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner RecTy *getElementType() const { return Ty; } 308f1b36f9a71eb267f04b7bd3a32aca9bc69f71e97Chris Lattner 30905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 31005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 31105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 31205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 31305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 31405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI); 31505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 31605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 31705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 31805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 31905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 32005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 32105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 32205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 32305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 3243da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 32599ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const; 3267cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 3277cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 3287cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 3297cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 3307cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 331ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 332ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 333ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 334ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 335ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { 3363da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman return RHS->getElementType()->typeIsConvertibleTo(Ty); 3377cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 338ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 339ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 340f05760de76b4ec26474da18c97770ca369972cfdChris Lattner}; 341f05760de76b4ec26474da18c97770ca369972cfdChris Lattner 34240f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/// DagRecTy - 'dag' - Represent a dag fragment 34340f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/// 3441fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass DagRecTy : public RecTy { 34577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static DagRecTy Shared; 34677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DagRecTy() {} 3471fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 34877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static DagRecTy *get() { return &Shared; } 34977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 35005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 35105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 35205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 35305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 35405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 35505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 35605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 35705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI) { return 0; } 35805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *BO); 35905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *BO); 36005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);} 36105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *CI) { return (Init*)CI; } 36205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *TI); 36305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 36405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 36540f71134b9fef0ca06c516f033cc9403394a913cChris Lattner 36699ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const { return "dag"; } 36740f71134b9fef0ca06c516f033cc9403394a913cChris Lattner 36840f71134b9fef0ca06c516f033cc9403394a913cChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 36940f71134b9fef0ca06c516f033cc9403394a913cChris Lattner return RHS->baseClassOf(this); 37040f71134b9fef0ca06c516f033cc9403394a913cChris Lattner } 371ead87b671278379f92890fddd859a301bb68f462Reid Spencer 372ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 373ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 374ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 375ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 376ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 377ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return true; } 378ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } 37940f71134b9fef0ca06c516f033cc9403394a913cChris Lattner}; 38040f71134b9fef0ca06c516f033cc9403394a913cChris Lattner 381f05760de76b4ec26474da18c97770ca369972cfdChris Lattner 382234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// RecordRecTy - '[classname]' - Represent an instance of a class, such as: 38307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// (R32 X = EAX). 38407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 385e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordRecTy : public RecTy { 386e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *Rec; 3871002c0203450620594a85454c6a095ca94b87cb2Dan Gohman explicit RecordRecTy(Record *R) : Rec(R) {} 38877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen friend class Record; 38977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 39077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static RecordRecTy *get(Record *R); 391e62c1185bee05facc25d1d725434f517261d308bChris Lattner 392a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner Record *getRecord() const { return Rec; } 393a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 39405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; } 39505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitInit *BI) { return 0; } 39605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BitsInit *BI) { return 0; } 39705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( IntInit *II) { return 0; } 39805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(StringInit *SI) { return 0; } 39905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( ListInit *LI) { return 0; } 40005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue(VarBitInit *VB) { return 0; } 40105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);} 40205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);} 40305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);} 40405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DefInit *DI); 40505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( DagInit *DI) { return 0; } 40605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( TypedInit *VI); 40705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} 40805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} 409e62c1185bee05facc25d1d725434f517261d308bChris Lattner 41099ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner std::string getAsString() const; 4117cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 4127cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner bool typeIsConvertibleTo(const RecTy *RHS) const { 4137cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 4147cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 415ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitRecTy *RHS) const { return false; } 416ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; } 417ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const IntRecTy *RHS) const { return false; } 418ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } 419ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } 420ead87b671278379f92890fddd859a301bb68f462Reid Spencer virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } 4217cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner virtual bool baseClassOf(const RecordRecTy *RHS) const; 422e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 423e62c1185bee05facc25d1d725434f517261d308bChris Lattner 42421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// resolveTypes - Find a common type that T1 and T2 convert to. 425e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene/// Return 0 if no such type exists. 426e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene/// 427e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid GreeneRecTy *resolveTypes(RecTy *T1, RecTy *T2); 42807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 429e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 430e62c1185bee05facc25d1d725434f517261d308bChris Lattner// Initializer Classes 431e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 432e62c1185bee05facc25d1d725434f517261d308bChris Lattner 433afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init { 434dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene Init(const Init &); // Do not define. 435dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene Init &operator=(const Init &); // Do not define. 4362d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 437dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 438dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 439dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene Init(void) {} 440dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 441afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greenepublic: 442e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual ~Init() {} 443e62c1185bee05facc25d1d725434f517261d308bChris Lattner 444f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// isComplete - This virtual method should be overridden by values that may 445f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// not be completely specified yet. 446f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner virtual bool isComplete() const { return true; } 447f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner 448f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// print - Print out this value. 4491a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar void print(raw_ostream &OS) const { OS << getAsString(); } 4503aba4d39fd101238ac06871895c28f26736d80cbChris Lattner 4513aba4d39fd101238ac06871895c28f26736d80cbChris Lattner /// getAsString - Convert this value to a string form. 4523aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const = 0; 4530b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// getAsUnquotedString - Convert this value to a string form, 4540b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// without adding quote markers. This primaruly affects 4550b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// StringInits where we will not surround the string value with 4560b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// quotes. 4570b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene virtual std::string getAsUnquotedString() const { return getAsString(); } 458f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner 459f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// dump - Debugging method that may be called through a debugger, just 4601a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar /// invokes print on stderr. 461e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 462e62c1185bee05facc25d1d725434f517261d308bChris Lattner 463f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// convertInitializerTo - This virtual function is a simple call-back 464f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// function that should be overridden to call the appropriate 465f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// RecTy::convertValue method. 466f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// 46705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const = 0; 468f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner 469f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// convertInitializerBitRange - This method is used to implement the bitrange 470f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// selection operator. Given an initializer, it selects the specified bits 4717331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner /// out, returning them as a new init of bits type. If it is not legal to use 4727331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner /// the bit subscript operator on this initializer, return null. 473f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// 47405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 475f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const { 476e62c1185bee05facc25d1d725434f517261d308bChris Lattner return 0; 477e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 478e62c1185bee05facc25d1d725434f517261d308bChris Lattner 479b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// convertInitListSlice - This method is used to implement the list slice 480b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// selection operator. Given an initializer, it selects the specified list 481b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// elements, returning them as a new init of list type. If it is not legal 482b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// to take a slice of this, return null. 483b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// 48405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 485f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitListSlice(const std::vector<unsigned> &Elements) const { 486b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner return 0; 487b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner } 488b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner 489a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// getFieldType - This method is used to implement the FieldInit class. 490a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// Implementors of this method should return the type of the named field if 491a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// they are of record type. 492a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// 493a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner virtual RecTy *getFieldType(const std::string &FieldName) const { return 0; } 494a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 495b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// getFieldInit - This method complements getFieldType to return the 496b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// initializer for the specified field. If getFieldType returns non-null 497b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// this method should return non-null, otherwise it returns null. 498b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// 49905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getFieldInit(Record &R, const RecordVal *RV, 50005bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const { 501b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner return 0; 502b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner } 5033da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 504f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// resolveReferences - This method is used by classes that refer to other 505a8449e6aaa6f494d85e75d4755f9c47abf1e06ceBob Wilson /// variables which may not be defined at the time the expression is formed. 506f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// If a value is set for the variable later, this method will be called on 507f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// users of the value to allow the value to propagate out. 508f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// 50905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const { 51005bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<Init *>(this); 5117dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner } 512e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 513e62c1185bee05facc25d1d725434f517261d308bChris Lattner 5141a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const Init &I) { 515e62c1185bee05facc25d1d725434f517261d308bChris Lattner I.print(OS); return OS; 516e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 517e62c1185bee05facc25d1d725434f517261d308bChris Lattner 518beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// TypedInit - This is the common super-class of types that have a specific, 519beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// explicit, type. 520beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// 521beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass TypedInit : public Init { 522beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene RecTy *Ty; 523dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 524dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TypedInit(const TypedInit &Other); // Do not define. 525dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TypedInit &operator=(const TypedInit &Other); // Do not define. 526dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 527dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 528d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit TypedInit(RecTy *T) : Ty(T) {} 529d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher 530dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 531beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene RecTy *getType() const { return Ty; } 532beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 53305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 534f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const; 53505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 536f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitListSlice(const std::vector<unsigned> &Elements) const; 537beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 5389703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// getFieldType - This method is used to implement the FieldInit class. 5399703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// Implementors of this method should return the type of the named field if 5409703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// they are of record type. 5419703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// 5429703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene virtual RecTy *getFieldType(const std::string &FieldName) const; 5439703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene 544beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveBitReference - This method is used to implement 545beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 546beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// simply return the resolved value, otherwise we return null. 547beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// 54805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 54905bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const = 0; 550beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 551beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveListElementReference - This method is used to implement 552beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 553beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// now, we return the resolved value, otherwise we return null. 55405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 55505bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const = 0; 556beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene}; 557beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 55807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 55907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// UnsetInit - ? - Represents an uninitialized value 56007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 5611fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass UnsetInit : public Init { 562dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnsetInit() : Init() {} 563dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnsetInit(const UnsetInit &); // Do not define. 564dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnsetInit &operator=(const UnsetInit &Other); // Do not define. 5652d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 566dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 5671fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 56805bce0beee87512e52428d4b80f5a8e79a949576David Greene static UnsetInit *get(); 569dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 57005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 57105bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<UnsetInit *>(this)); 572e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 573e62c1185bee05facc25d1d725434f517261d308bChris Lattner 574e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual bool isComplete() const { return false; } 5753aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return "?"; } 576e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 577e62c1185bee05facc25d1d725434f517261d308bChris Lattner 57807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 57907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitInit - true/false - Represent a concrete initializer for a bit. 58007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 581e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit : public Init { 582e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool Value; 583dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 584d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit BitInit(bool V) : Value(V) {} 585dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitInit(const BitInit &Other); // Do not define. 586dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitInit &operator=(BitInit &Other); // Do not define. 5872d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 588dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 589dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 59005bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitInit *get(bool V); 591e62c1185bee05facc25d1d725434f517261d308bChris Lattner 592e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool getValue() const { return Value; } 593e62c1185bee05facc25d1d725434f517261d308bChris Lattner 59405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 59505bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<BitInit *>(this)); 596e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 597e62c1185bee05facc25d1d725434f517261d308bChris Lattner 5983aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return Value ? "1" : "0"; } 599e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 600e62c1185bee05facc25d1d725434f517261d308bChris Lattner 60107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value. 60207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// It contains a vector of bits, whose size is determined by the type. 60307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 604726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greeneclass BitsInit : public Init, public FoldingSetNode { 60505bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Bits; 606dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 60705bce0beee87512e52428d4b80f5a8e79a949576David Greene BitsInit(ArrayRef<Init *> Range) : Bits(Range.begin(), Range.end()) {} 608e62c1185bee05facc25d1d725434f517261d308bChris Lattner 609dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitsInit(const BitsInit &Other); // Do not define. 610dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitsInit &operator=(const BitsInit &Other); // Do not define. 611dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 612dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 61305bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitsInit *get(ArrayRef<Init *> Range); 614dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 615726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene void Profile(FoldingSetNodeID &ID) const; 616726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 617e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getNumBits() const { return Bits.size(); } 618e62c1185bee05facc25d1d725434f517261d308bChris Lattner 61905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getBit(unsigned Bit) const { 620e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(Bit < Bits.size() && "Bit index out of range!"); 621e62c1185bee05facc25d1d725434f517261d308bChris Lattner return Bits[Bit]; 622e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 623e62c1185bee05facc25d1d725434f517261d308bChris Lattner 62405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 62505bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<BitsInit *>(this)); 626e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 62705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 628f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const; 629e62c1185bee05facc25d1d725434f517261d308bChris Lattner 630e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual bool isComplete() const { 631e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0; i != getNumBits(); ++i) 632e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (!getBit(i)->isComplete()) return false; 633e62c1185bee05facc25d1d725434f517261d308bChris Lattner return true; 634e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 6351808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen bool allInComplete() const { 6361808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen for (unsigned i = 0; i != getNumBits(); ++i) 6371808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen if (getBit(i)->isComplete()) return false; 6381808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen return true; 6391808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen } 6403aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 641e62c1185bee05facc25d1d725434f517261d308bChris Lattner 64205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 643e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 644e62c1185bee05facc25d1d725434f517261d308bChris Lattner 64507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 64607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntInit - 7 - Represent an initalization by a literal integer value. 64707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 648e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greeneclass IntInit : public TypedInit { 64963f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t Value; 650dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 65177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen explicit IntInit(int64_t V) : TypedInit(IntRecTy::get()), Value(V) {} 652e62c1185bee05facc25d1d725434f517261d308bChris Lattner 653dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene IntInit(const IntInit &Other); // Do not define. 654dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene IntInit &operator=(const IntInit &Other); // Do note define. 655dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 656dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 65705bce0beee87512e52428d4b80f5a8e79a949576David Greene static IntInit *get(int64_t V); 658dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 65963f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t getValue() const { return Value; } 660e62c1185bee05facc25d1d725434f517261d308bChris Lattner 66105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 66205bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<IntInit *>(this)); 663e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 66405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 665f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const; 666e62c1185bee05facc25d1d725434f517261d308bChris Lattner 6673aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 668e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 669e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveBitReference - This method is used to implement 670e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 671e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// simply return the resolved value, otherwise we return null. 672e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// 67305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 67405bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 67550bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal bit reference off int"); 676e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 677e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 678e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveListElementReference - This method is used to implement 679e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 680e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// now, we return the resolved value, otherwise we return null. 68105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 68205bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 68350bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off int"); 684e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 685e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 686e62c1185bee05facc25d1d725434f517261d308bChris Lattner 68707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 68807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringInit - "foo" - Represent an initialization by a string value. 68907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 690beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass StringInit : public TypedInit { 691e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::string Value; 692dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 693d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit StringInit(const std::string &V) 69477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen : TypedInit(StringRecTy::get()), Value(V) {} 695e62c1185bee05facc25d1d725434f517261d308bChris Lattner 696dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene StringInit(const StringInit &Other); // Do not define. 697dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene StringInit &operator=(const StringInit &Other); // Do not define. 6982d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 699dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 700dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 701ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen static StringInit *get(StringRef); 702dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 7035c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner const std::string &getValue() const { return Value; } 7045c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 70505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 70605bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<StringInit *>(this)); 707e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 708e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7093aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return "\"" + Value + "\""; } 7100b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene virtual std::string getAsUnquotedString() const { return Value; } 711beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 712beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveBitReference - This method is used to implement 713beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 714beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// simply return the resolved value, otherwise we return null. 715beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// 71605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 71705bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 71850bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal bit reference off string"); 719beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 720beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 721beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveListElementReference - This method is used to implement 722beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 723beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// now, we return the resolved value, otherwise we return null. 72405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 72505bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 72650bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off string"); 727beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 728e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 729e62c1185bee05facc25d1d725434f517261d308bChris Lattner 73007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// ListInit - [AL, AH, CL] - Represent a list of defs 73107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 732aad4c9fc37b38cae21343173084c81d789535446David Greeneclass ListInit : public TypedInit, public FoldingSetNode { 73305bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Values; 734e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 73505bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::vector<Init*>::const_iterator const_iterator; 7365f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene 737aad4c9fc37b38cae21343173084c81d789535446David Greeneprivate: 73805bce0beee87512e52428d4b80f5a8e79a949576David Greene explicit ListInit(ArrayRef<Init *> Range, RecTy *EltTy) 73960c04af7879c3eda957162737783de726dd177b6David Greene : TypedInit(ListRecTy::get(EltTy)), Values(Range.begin(), Range.end()) {} 740e62c1185bee05facc25d1d725434f517261d308bChris Lattner 741dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene ListInit(const ListInit &Other); // Do not define. 742dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene ListInit &operator=(const ListInit &Other); // Do not define. 743dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 744dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 74505bce0beee87512e52428d4b80f5a8e79a949576David Greene static ListInit *get(ArrayRef<Init *> Range, RecTy *EltTy); 746dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 747aad4c9fc37b38cae21343173084c81d789535446David Greene void Profile(FoldingSetNodeID &ID) const; 748aad4c9fc37b38cae21343173084c81d789535446David Greene 7497cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner unsigned getSize() const { return Values.size(); } 75005bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getElement(unsigned i) const { 7517cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner assert(i < Values.size() && "List element index out of range!"); 7527cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return Values[i]; 753e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 754e62c1185bee05facc25d1d725434f517261d308bChris Lattner 75550d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner Record *getElementAsRecord(unsigned i) const; 75621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 75705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *convertInitListSlice(const std::vector<unsigned> &Elements) const; 758b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner 75905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 76005bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<ListInit *>(this)); 761e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 762e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7631dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// resolveReferences - This method is used by classes that refer to other 7641dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// variables which may not be defined at the time they expression is formed. 7651dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// If a value is set for the variable later, this method will be called on 7661dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// users of the value to allow the value to propagate out. 7671dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// 76805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 7691dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 7703aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 77182137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov 77205bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init*> getValues() const { return Values; } 773c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene 77482137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline const_iterator begin() const { return Values.begin(); } 77582137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline const_iterator end () const { return Values.end(); } 77682137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov 77782137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline size_t size () const { return Values.size(); } 77882137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline bool empty() const { return Values.empty(); } 779e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 780e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveBitReference - This method is used to implement 781e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 782e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// simply return the resolved value, otherwise we return null. 783e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// 78405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 78505bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 78650bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal bit reference off list"); 787e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 788e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 789e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveListElementReference - This method is used to implement 790e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 791e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// now, we return the resolved value, otherwise we return null. 79205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 79305bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 794e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 795e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7967331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 797d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// OpInit - Base class for operators 798d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 799d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass OpInit : public TypedInit { 800dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit(const OpInit &Other); // Do not define. 801dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit &operator=(OpInit &Other); // Do not define. 802d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher 803dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 804dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene explicit OpInit(RecTy *Type) : TypedInit(Type) {} 805dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 806dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 807d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Clone - Clone this operator, replacing arguments with the new list 80805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const = 0; 809d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 810a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman virtual int getNumOperands() const = 0; 81105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getOperand(int i) const = 0; 812d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 813d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Fold - If possible, fold this to a simpler init. Return this if not 814d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // possible to fold. 81505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const = 0; 816d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 81705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 81805bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<OpInit *>(this)); 819d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 82021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 82105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 82205bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const; 82305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 82405bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 825d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene}; 826d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 827d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 828d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// UnOpInit - !op (X) - Transform an init. 829d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 830e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit : public OpInit { 831e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic: 8321434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene enum UnaryOp { CAST, HEAD, TAIL, EMPTY }; 833e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneprivate: 834e6c27de069225e1122c78385ad22a2ff656db8e6David Greene UnaryOp Opc; 83505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS; 836dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 83705bce0beee87512e52428d4b80f5a8e79a949576David Greene UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type) 838dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : OpInit(Type), Opc(opc), LHS(lhs) {} 839dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 840dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnOpInit(const UnOpInit &Other); // Do not define. 841dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnOpInit &operator=(const UnOpInit &Other); // Do not define. 842dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 843e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic: 84405bce0beee87512e52428d4b80f5a8e79a949576David Greene static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type); 845d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 846e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // Clone - Clone this operator, replacing arguments with the new list 84705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const { 848aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 1 && 849aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for unary operation"); 850dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return UnOpInit::get(getOpcode(), *Operands.begin(), getType()); 851e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 852d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 853a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman int getNumOperands() const { return 1; } 85405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand(int i) const { 855e6c27de069225e1122c78385ad22a2ff656db8e6David Greene assert(i == 0 && "Invalid operand id for unary operator"); 856e6c27de069225e1122c78385ad22a2ff656db8e6David Greene return getOperand(); 857e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 85821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 859e6c27de069225e1122c78385ad22a2ff656db8e6David Greene UnaryOp getOpcode() const { return Opc; } 86005bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand() const { return LHS; } 861d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 862e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // Fold - If possible, fold this to a simpler init. Return this if not 863e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // possible to fold. 86405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const; 865d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 86605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 86721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 868e6c27de069225e1122c78385ad22a2ff656db8e6David Greene virtual std::string getAsString() const; 869e6c27de069225e1122c78385ad22a2ff656db8e6David Greene}; 870e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 871e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// BinOpInit - !op (X, Y) - Combine two inits. 872e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// 873d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass BinOpInit : public OpInit { 874e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greenepublic: 875c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, EQ }; 876e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greeneprivate: 877e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene BinaryOp Opc; 87805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS, *RHS; 879dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 88005bce0beee87512e52428d4b80f5a8e79a949576David Greene BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) : 881dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit(Type), Opc(opc), LHS(lhs), RHS(rhs) {} 882dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 883dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BinOpInit(const BinOpInit &Other); // Do not define. 884dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BinOpInit &operator=(const BinOpInit &Other); // Do not define. 885dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 886dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 88705bce0beee87512e52428d4b80f5a8e79a949576David Greene static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs, 88805bce0beee87512e52428d4b80f5a8e79a949576David Greene RecTy *Type); 88921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 890d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Clone - Clone this operator, replacing arguments with the new list 89105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const { 892aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 2 && 893aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for binary operation"); 894dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType()); 895d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 896d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 897a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman int getNumOperands() const { return 2; } 89805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand(int i) const { 899aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert((i == 0 || i == 1) && "Invalid operand id for binary operator"); 900d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene if (i == 0) { 901d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene return getLHS(); 90221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 903d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene return getRHS(); 904d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 905d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 906d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 907e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene BinaryOp getOpcode() const { return Opc; } 90805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getLHS() const { return LHS; } 90905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getRHS() const { return RHS; } 910e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 911e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene // Fold - If possible, fold this to a simpler init. Return this if not 912e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene // possible to fold. 91305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const; 914e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 91505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 91621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 917e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene virtual std::string getAsString() const; 918e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene}; 919e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 920d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// TernOpInit - !op (X, Y, Z) - Combine two inits. 921d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 9224afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit : public OpInit { 9234afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greenepublic: 924ffc0ab6037aa45bc22f57433148e5f586843b3a7David Greene enum TernaryOp { SUBST, FOREACH, IF }; 9254afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneprivate: 9264afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene TernaryOp Opc; 92705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS, *MHS, *RHS; 928dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 92905bce0beee87512e52428d4b80f5a8e79a949576David Greene TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs, 930f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene RecTy *Type) : 931dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit(Type), Opc(opc), LHS(lhs), MHS(mhs), RHS(rhs) {} 932dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 933dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TernOpInit(const TernOpInit &Other); // Do not define. 934dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TernOpInit &operator=(const TernOpInit &Other); // Do not define. 935dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 936dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 93705bce0beee87512e52428d4b80f5a8e79a949576David Greene static TernOpInit *get(TernaryOp opc, Init *lhs, 93805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *mhs, Init *rhs, 93905bce0beee87512e52428d4b80f5a8e79a949576David Greene RecTy *Type); 94021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 9414afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // Clone - Clone this operator, replacing arguments with the new list 94205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const { 943aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 3 && 944aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for ternary operation"); 945dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return TernOpInit::get(getOpcode(), Operands[0], Operands[1], Operands[2], 946dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene getType()); 9474afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 9484afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 949a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman int getNumOperands() const { return 3; } 95005bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand(int i) const { 951aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert((i == 0 || i == 1 || i == 2) && 952aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Invalid operand id for ternary operator"); 9534afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene if (i == 0) { 9544afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getLHS(); 95521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else if (i == 1) { 9564afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getMHS(); 95721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 9584afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getRHS(); 9594afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 9604afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 9614afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 9624afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene TernaryOp getOpcode() const { return Opc; } 96305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getLHS() const { return LHS; } 96405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getMHS() const { return MHS; } 96505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getRHS() const { return RHS; } 9664afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 9674afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // Fold - If possible, fold this to a simpler init. Return this if not 9684afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // possible to fold. 96905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const; 97021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 971548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling virtual bool isComplete() const { return false; } 972548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling 97305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 97421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 9754afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene virtual std::string getAsString() const; 9764afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene}; 977d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 978e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 97907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// VarInit - 'Opcode' - Represent a reference to an entire variable object. 98007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 9817331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass VarInit : public TypedInit { 982ee6dca17252de152720655282fb4b74b76fb2fe9David Greene Init *VarName; 983dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 984d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit VarInit(const std::string &VN, RecTy *T) 985ee6dca17252de152720655282fb4b74b76fb2fe9David Greene : TypedInit(T), VarName(StringInit::get(VN)) {} 986ee6dca17252de152720655282fb4b74b76fb2fe9David Greene explicit VarInit(Init *VN, RecTy *T) 987dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : TypedInit(T), VarName(VN) {} 988dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 989dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarInit(const VarInit &Other); // Do not define. 990dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarInit &operator=(const VarInit &Other); // Do not define. 991dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 992dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 99305bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarInit *get(const std::string &VN, RecTy *T); 99405bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarInit *get(Init *VN, RecTy *T); 9953da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 99605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 99705bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarInit *>(this)); 998e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 999e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1000ee6dca17252de152720655282fb4b74b76fb2fe9David Greene const std::string &getName() const; 1001ee6dca17252de152720655282fb4b74b76fb2fe9David Greene Init *getNameInit() const { return VarName; } 1002ee6dca17252de152720655282fb4b74b76fb2fe9David Greene std::string getNameInitAsString() const { 1003ee6dca17252de152720655282fb4b74b76fb2fe9David Greene return getNameInit()->getAsUnquotedString(); 1004ee6dca17252de152720655282fb4b74b76fb2fe9David Greene } 1005e62c1185bee05facc25d1d725434f517261d308bChris Lattner 100605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 100705bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const; 100805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 100905bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 10107331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 1011a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner virtual RecTy *getFieldType(const std::string &FieldName) const; 101205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getFieldInit(Record &R, const RecordVal *RV, 101305bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const; 10149b929aa7495ee0b5d389370baeb332456632b2feChris Lattner 10159b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// resolveReferences - This method is used by classes that refer to other 10169b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// variables which may not be defined at the time they expression is formed. 10179b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// If a value is set for the variable later, this method will be called on 10189b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// users of the value to allow the value to propagate out. 10199b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// 102005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 10213da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 1022ee6dca17252de152720655282fb4b74b76fb2fe9David Greene virtual std::string getAsString() const { return getName(); } 1023e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1024e62c1185bee05facc25d1d725434f517261d308bChris Lattner 102507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 10267331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner/// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field. 102707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1028e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass VarBitInit : public Init { 102905bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *TI; 1030e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Bit; 1031dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 103205bce0beee87512e52428d4b80f5a8e79a949576David Greene VarBitInit(TypedInit *T, unsigned B) : TI(T), Bit(B) { 10337331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner assert(T->getType() && dynamic_cast<BitsRecTy*>(T->getType()) && 10347331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner ((BitsRecTy*)T->getType())->getNumBits() > B && 10357331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner "Illegal VarBitInit expression!"); 10367331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner } 1037e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1038dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarBitInit(const VarBitInit &Other); // Do not define. 1039dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarBitInit &operator=(const VarBitInit &Other); // Do not define. 1040dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1041dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 104205bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarBitInit *get(TypedInit *T, unsigned B); 1043dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 104405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 104505bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarBitInit *>(this)); 1046e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1047e62c1185bee05facc25d1d725434f517261d308bChris Lattner 104805bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *getVariable() const { return TI; } 1049e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getBitNum() const { return Bit; } 10503da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 10513aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 105205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 1053e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1054e62c1185bee05facc25d1d725434f517261d308bChris Lattner 10553da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman/// VarListElementInit - List[4] - Represent access to one element of a var or 10561dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner/// field. 10571dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit : public TypedInit { 105805bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *TI; 10591dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner unsigned Element; 1060dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 106105bce0beee87512e52428d4b80f5a8e79a949576David Greene VarListElementInit(TypedInit *T, unsigned E) 1062dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : TypedInit(dynamic_cast<ListRecTy*>(T->getType())->getElementType()), 1063dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TI(T), Element(E) { 10641dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner assert(T->getType() && dynamic_cast<ListRecTy*>(T->getType()) && 10651dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner "Illegal VarBitInit expression!"); 10661dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 10671dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 1068dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarListElementInit(const VarListElementInit &Other); // Do not define. 1069dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarListElementInit &operator=(const VarListElementInit &Other); // Do 1070dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene // not 1071dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene // define. 1072dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1073dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 107405bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarListElementInit *get(TypedInit *T, unsigned E); 1075dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 107605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 107705bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarListElementInit *>(this)); 10781dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 10791dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 108005bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *getVariable() const { return TI; } 10811dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner unsigned getElementNum() const { return Element; } 10821dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 108305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 108405bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const; 10851dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 10861dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// resolveListElementReference - This method is used to implement 10871dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// VarListElementInit::resolveReferences. If the list element is resolvable 10881dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// now, we return the resolved value, otherwise we return null. 108905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, 109005bce0beee87512e52428d4b80f5a8e79a949576David Greene const RecordVal *RV, 109105bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 10921dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 10933aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 109405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 10951dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner}; 109607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 109707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// DefInit - AL - Represent a reference to a 'def' in the description 109807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1099beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass DefInit : public TypedInit { 1100e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *Def; 1101dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 110277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit(Record *D, RecordRecTy *T) : TypedInit(T), Def(D) {} 110377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen friend class Record; 1104dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1105dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DefInit(const DefInit &Other); // Do not define. 1106dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DefInit &operator=(const DefInit &Other); // Do not define. 1107dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1108e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 110905bce0beee87512e52428d4b80f5a8e79a949576David Greene static DefInit *get(Record*); 11103da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 111105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 111205bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<DefInit *>(this)); 1113e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1114e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1115e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getDef() const { return Def; } 1116e62c1185bee05facc25d1d725434f517261d308bChris Lattner 111705bce0beee87512e52428d4b80f5a8e79a949576David Greene //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits); 1118b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner 1119b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner virtual RecTy *getFieldType(const std::string &FieldName) const; 112005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getFieldInit(Record &R, const RecordVal *RV, 112105bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const; 11223da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 11233aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 1124beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 1125beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveBitReference - This method is used to implement 1126beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarBitInit::resolveReferences. If the bit is able to be resolved, we 1127beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// simply return the resolved value, otherwise we return null. 1128beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// 112905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 113005bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 113150bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal bit reference off def"); 1132beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 1133beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 1134beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveListElementReference - This method is used to implement 1135beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 1136beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// now, we return the resolved value, otherwise we return null. 113705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 113805bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 113950bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off def"); 1140beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 1141e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1142e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1143e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1144a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner/// FieldInit - X.Y - Represent a reference to a subfield of a variable 1145a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner/// 11467331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass FieldInit : public TypedInit { 114705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Rec; // Record we are referring to 1148a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner std::string FieldName; // Field we are accessing 1149dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 115005bce0beee87512e52428d4b80f5a8e79a949576David Greene FieldInit(Init *R, const std::string &FN) 1151dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : TypedInit(R->getFieldType(FN)), Rec(R), FieldName(FN) { 11527331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner assert(getType() && "FieldInit with non-record type!"); 1153a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner } 1154a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 1155dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene FieldInit(const FieldInit &Other); // Do not define. 1156dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene FieldInit &operator=(const FieldInit &Other); // Do not define. 1157dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1158dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 115905bce0beee87512e52428d4b80f5a8e79a949576David Greene static FieldInit *get(Init *R, const std::string &FN); 116005bce0beee87512e52428d4b80f5a8e79a949576David Greene static FieldInit *get(Init *R, const Init *FN); 1161dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 116205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 116305bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<FieldInit *>(this)); 1164a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner } 1165a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 116605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 116705bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const; 116805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, 116905bce0beee87512e52428d4b80f5a8e79a949576David Greene const RecordVal *RV, 117005bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 11717331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 117205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 117324151a6888c752ff1d7fc80b500f5a836c9ac528Chris Lattner 11743aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { 11753aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return Rec->getAsString() + "." + FieldName; 1176a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner } 1177a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner}; 1178a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 11798c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// DagInit - (v a, b) - Represent a DAG tree value. DAG inits are required 11808c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// to have at least one value then a (possibly empty) list of arguments. Each 11818c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// argument can have a name associated with it. 11828e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner/// 118378621a851ae84520de7d24a6d61e1dcf25749712David Greeneclass DagInit : public TypedInit, public FoldingSetNode { 118405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Val; 11857cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman std::string ValName; 118605bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Args; 118791290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner std::vector<std::string> ArgNames; 1188dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 118905bce0beee87512e52428d4b80f5a8e79a949576David Greene DagInit(Init *V, const std::string &VN, 119005bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init *> ArgRange, 119178621a851ae84520de7d24a6d61e1dcf25749712David Greene ArrayRef<std::string> NameRange) 119278621a851ae84520de7d24a6d61e1dcf25749712David Greene : TypedInit(DagRecTy::get()), Val(V), ValName(VN), 119378621a851ae84520de7d24a6d61e1dcf25749712David Greene Args(ArgRange.begin(), ArgRange.end()), 119478621a851ae84520de7d24a6d61e1dcf25749712David Greene ArgNames(NameRange.begin(), NameRange.end()) {} 119521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1196dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DagInit(const DagInit &Other); // Do not define. 1197dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DagInit &operator=(const DagInit &Other); // Do not define. 1198dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1199dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 120005bce0beee87512e52428d4b80f5a8e79a949576David Greene static DagInit *get(Init *V, const std::string &VN, 120105bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init *> ArgRange, 120205bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<std::string> NameRange); 120305bce0beee87512e52428d4b80f5a8e79a949576David Greene static DagInit *get(Init *V, const std::string &VN, 120405bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::vector< 120505bce0beee87512e52428d4b80f5a8e79a949576David Greene std::pair<Init*, std::string> > &args); 1206dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 120778621a851ae84520de7d24a6d61e1dcf25749712David Greene void Profile(FoldingSetNodeID &ID) const; 1208dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 120905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 121005bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<DagInit *>(this)); 12118e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner } 12128e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner 121305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperator() const { return Val; } 121491290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner 12157cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman const std::string &getName() const { return ValName; } 12167cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman 121791290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner unsigned getNumArgs() const { return Args.size(); } 121805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getArg(unsigned Num) const { 121991290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner assert(Num < Args.size() && "Arg number out of range!"); 122091290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner return Args[Num]; 122191290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner } 122291290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner const std::string &getArgName(unsigned Num) const { 122391290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner assert(Num < ArgNames.size() && "Arg number out of range!"); 122491290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner return ArgNames[Num]; 122591290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner } 12268e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner 122705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 1228990db46e9ae7faa742a152ca4126d0bee9f1df9cChris Lattner 12293aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 12307674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 123105bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::vector<Init*>::const_iterator const_arg_iterator; 12327674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov typedef std::vector<std::string>::const_iterator const_name_iterator; 12337674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 12347674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_arg_iterator arg_begin() const { return Args.begin(); } 12357674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_arg_iterator arg_end () const { return Args.end(); } 12367674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 12377674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline size_t arg_size () const { return Args.size(); } 12387674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline bool arg_empty() const { return Args.empty(); } 12397674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 12407674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_name_iterator name_begin() const { return ArgNames.begin(); } 12417674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_name_iterator name_end () const { return ArgNames.end(); } 12427674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 12437674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline size_t name_size () const { return ArgNames.size(); } 12447674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline bool name_empty() const { return ArgNames.empty(); } 12457674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 124605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveBitReference(Record &R, const RecordVal *RV, 124705bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Bit) const { 124850bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal bit reference off dag"); 1249beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 125021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 125105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 125205bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 125350bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off dag"); 1254beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 12558e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner}; 1256e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1257e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1258e62c1185bee05facc25d1d725434f517261d308bChris Lattner// High-Level Classes 1259e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1260e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1261e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordVal { 1262011dca7fac07100695dd3685bfaddbea58a468b9David Greene Init *Name; 1263e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecTy *Ty; 1264e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Prefix; 126505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Value; 1266e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1267011dca7fac07100695dd3685bfaddbea58a468b9David Greene RecordVal(Init *N, RecTy *T, unsigned P); 1268e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecordVal(const std::string &N, RecTy *T, unsigned P); 1269e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1270011dca7fac07100695dd3685bfaddbea58a468b9David Greene const std::string &getName() const; 1271de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene const Init *getNameInit() const { return Name; } 1272de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene std::string getNameInitAsString() const { 1273de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene return getNameInit()->getAsUnquotedString(); 1274de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene } 1275e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1276e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getPrefix() const { return Prefix; } 1277e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecTy *getType() const { return Ty; } 127805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getValue() const { return Value; } 1279e62c1185bee05facc25d1d725434f517261d308bChris Lattner 128005bce0beee87512e52428d4b80f5a8e79a949576David Greene bool setValue(Init *V) { 1281e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (V) { 1282e62c1185bee05facc25d1d725434f517261d308bChris Lattner Value = V->convertInitializerTo(Ty); 1283e62c1185bee05facc25d1d725434f517261d308bChris Lattner return Value == 0; 1284e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1285e62c1185bee05facc25d1d725434f517261d308bChris Lattner Value = 0; 1286e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1287e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1288e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1289e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 12901a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar void print(raw_ostream &OS, bool PrintSem = true) const; 1291e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1292e62c1185bee05facc25d1d725434f517261d308bChris Lattner 12931a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecordVal &RV) { 1294e62c1185bee05facc25d1d725434f517261d308bChris Lattner RV.print(OS << " "); 1295e62c1185bee05facc25d1d725434f517261d308bChris Lattner return OS; 1296e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1297e62c1185bee05facc25d1d725434f517261d308bChris Lattner 129889e0f74094a6a86170c2c70fe8c6c19cb99c97a0Chris Lattnerclass Record { 12996f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar static unsigned LastID; 13006f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar 13016f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar // Unique record ID. 13026f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar unsigned ID; 13030d886401b3ec09b0c2d267942b07702a2f0740f4David Greene Init *Name; 13041e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner SMLoc Loc; 1305e22b321d2276b634519165b101b02d92c2fcf5c7David Greene std::vector<Init *> TemplateArgs; 1306e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::vector<RecordVal> Values; 1307e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::vector<Record*> SuperClasses; 130867db883487fca3472fdde51e931657e22d4d0495Chris Lattner 130967db883487fca3472fdde51e931657e22d4d0495Chris Lattner // Tracks Record instances. Not owned by Record. 131067db883487fca3472fdde51e931657e22d4d0495Chris Lattner RecordKeeper &TrackedRecords; 131167db883487fca3472fdde51e931657e22d4d0495Chris Lattner 131277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit *TheInit; 131377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 1314f7931b7040de1c829e678b4e391308bc3376f8a0David Greene void init(); 13150d886401b3ec09b0c2d267942b07702a2f0740f4David Greene void checkName(); 13160d886401b3ec09b0c2d267942b07702a2f0740f4David Greene 1317e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1318e62c1185bee05facc25d1d725434f517261d308bChris Lattner 13199c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner // Constructs a record. 13209c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner explicit Record(const std::string &N, SMLoc loc, RecordKeeper &records) : 13210abdadbce7e04af76145154d75ca41dab749b8d6David Greene ID(LastID++), Name(StringInit::get(N)), Loc(loc), TrackedRecords(records), 13220abdadbce7e04af76145154d75ca41dab749b8d6David Greene TheInit(0) { 1323004adaf3452a355ada2a54bcb61dc8925a718651David Greene init(); 13240abdadbce7e04af76145154d75ca41dab749b8d6David Greene } 1325675f85d0f240930d571f4e557bb92237ee48124eDavid Greene explicit Record(Init *N, SMLoc loc, RecordKeeper &records) : 1326675f85d0f240930d571f4e557bb92237ee48124eDavid Greene ID(LastID++), Name(N), Loc(loc), TrackedRecords(records), TheInit(0) { 1327004adaf3452a355ada2a54bcb61dc8925a718651David Greene init(); 1328675f85d0f240930d571f4e557bb92237ee48124eDavid Greene } 1329e62c1185bee05facc25d1d725434f517261d308bChris Lattner ~Record() {} 133021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1331f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 1332117ccb7e518f05e4bf3df058fc402262f897ff0bChris Lattner static unsigned getNewUID() { return LastID++; } 1333f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 1334f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 13356f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar unsigned getID() const { return ID; } 13366f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar 13370d886401b3ec09b0c2d267942b07702a2f0740f4David Greene const std::string &getName() const; 1338d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene Init *getNameInit() const { 1339d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene return Name; 1340d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene } 1341d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene const std::string getNameInitAsString() const { 1342d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene return getNameInit()->getAsUnquotedString(); 1343d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene } 1344d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene 13450d886401b3ec09b0c2d267942b07702a2f0740f4David Greene void setName(Init *Name); // Also updates RecordKeeper. 1346936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void setName(const std::string &Name); // Also updates RecordKeeper. 134721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 13481e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner SMLoc getLoc() const { return Loc; } 134921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 135077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen /// get the corresponding DefInit. 135177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit *getDefInit(); 135277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 1353e22b321d2276b634519165b101b02d92c2fcf5c7David Greene const std::vector<Init *> &getTemplateArgs() const { 1354e62c1185bee05facc25d1d725434f517261d308bChris Lattner return TemplateArgs; 1355e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1356e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::vector<RecordVal> &getValues() const { return Values; } 1357e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::vector<Record*> &getSuperClasses() const { return SuperClasses; } 1358e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1359e22b321d2276b634519165b101b02d92c2fcf5c7David Greene bool isTemplateArg(Init *Name) const { 1360e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i) 1361e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (TemplateArgs[i] == Name) return true; 1362e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1363e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1364e22b321d2276b634519165b101b02d92c2fcf5c7David Greene bool isTemplateArg(StringRef Name) const { 1365e22b321d2276b634519165b101b02d92c2fcf5c7David Greene return isTemplateArg(StringInit::get(Name.str())); 1366e22b321d2276b634519165b101b02d92c2fcf5c7David Greene } 1367e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1368ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen const RecordVal *getValue(const Init *Name) const { 1369e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 1370ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen if (Values[i].getNameInit() == Name) return &Values[i]; 1371e62c1185bee05facc25d1d725434f517261d308bChris Lattner return 0; 1372e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1373ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen const RecordVal *getValue(StringRef Name) const { 1374ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen return getValue(StringInit::get(Name)); 1375ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen } 1376ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen RecordVal *getValue(const Init *Name) { 1377e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 1378ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen if (Values[i].getNameInit() == Name) return &Values[i]; 1379e62c1185bee05facc25d1d725434f517261d308bChris Lattner return 0; 1380e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1381ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen RecordVal *getValue(StringRef Name) { 1382ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen return getValue(StringInit::get(Name)); 1383ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen } 138496a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene 1385e22b321d2276b634519165b101b02d92c2fcf5c7David Greene void addTemplateArg(Init *Name) { 1386e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(!isTemplateArg(Name) && "Template arg already defined!"); 1387e62c1185bee05facc25d1d725434f517261d308bChris Lattner TemplateArgs.push_back(Name); 1388e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1389e22b321d2276b634519165b101b02d92c2fcf5c7David Greene void addTemplateArg(StringRef Name) { 1390e22b321d2276b634519165b101b02d92c2fcf5c7David Greene addTemplateArg(StringInit::get(Name.str())); 1391e22b321d2276b634519165b101b02d92c2fcf5c7David Greene } 1392e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1393e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addValue(const RecordVal &RV) { 1394ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen assert(getValue(RV.getNameInit()) == 0 && "Value already added!"); 1395e62c1185bee05facc25d1d725434f517261d308bChris Lattner Values.push_back(RV); 1396e338565757bfcfe9d762751c976684f66954fb45David Greene if (Values.size() > 1) 1397e338565757bfcfe9d762751c976684f66954fb45David Greene // Keep NAME at the end of the list. It makes record dumps a 1398e338565757bfcfe9d762751c976684f66954fb45David Greene // bit prettier and allows TableGen tests to be written more 1399e338565757bfcfe9d762751c976684f66954fb45David Greene // naturally. Tests can use CHECK-NEXT to look for Record 1400e338565757bfcfe9d762751c976684f66954fb45David Greene // fields they expect to see after a def. They can't do that if 1401e338565757bfcfe9d762751c976684f66954fb45David Greene // NAME is the first Record field. 1402e338565757bfcfe9d762751c976684f66954fb45David Greene std::swap(Values[Values.size() - 2], Values[Values.size() - 1]); 1403e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1404e62c1185bee05facc25d1d725434f517261d308bChris Lattner 140596a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene void removeValue(Init *Name) { 1406bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 140796a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene if (Values[i].getNameInit() == Name) { 1408bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner Values.erase(Values.begin()+i); 1409bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner return; 1410bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner } 141150bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Cannot remove an entry that does not exist!"); 1412bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner } 1413bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner 141496a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene void removeValue(StringRef Name) { 141596a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene removeValue(StringInit::get(Name.str())); 141696a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene } 141796a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene 141802475f1fd502fa1729d1fc447417087acf9e96c8Ted Kremenek bool isSubClassOf(const Record *R) const { 1419e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i) 1420e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (SuperClasses[i] == R) 1421ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen return true; 1422e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1423e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1424e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1425c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner bool isSubClassOf(StringRef Name) const { 1426a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i) 14277474c29d903d479e7f99eb0d1d097f75289c5f48David Greene if (SuperClasses[i]->getNameInitAsString() == Name) 1428a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner return true; 1429a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner return false; 1430a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner } 1431a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner 1432e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addSuperClass(Record *R) { 1433e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(!isSubClassOf(R) && "Already subclassing record!"); 1434e62c1185bee05facc25d1d725434f517261d308bChris Lattner SuperClasses.push_back(R); 1435e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1436e62c1185bee05facc25d1d725434f517261d308bChris Lattner 14377dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// resolveReferences - If there are any field references that refer to fields 14387dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// that have been filled in, we can propagate the values now. 14397dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// 14407dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner void resolveReferences() { resolveReferencesTo(0); } 14417dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner 14427dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// resolveReferencesTo - If anything in this record refers to RV, replace the 14437dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// reference to RV with the RHS of RV. If RV is null, we resolve all 14447dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// possible references. 14457dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner void resolveReferencesTo(const RecordVal *RV); 1446e62c1185bee05facc25d1d725434f517261d308bChris Lattner 144767db883487fca3472fdde51e931657e22d4d0495Chris Lattner RecordKeeper &getRecords() const { 14489c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner return TrackedRecords; 144967db883487fca3472fdde51e931657e22d4d0495Chris Lattner } 145067db883487fca3472fdde51e931657e22d4d0495Chris Lattner 1451e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 14525c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 14535c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner //===--------------------------------------------------------------------===// 14545c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner // High-level methods useful to tablegen back-ends 14555c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner // 14565c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 1457c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// getValueInit - Return the initializer for a value with the specified name, 1458c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// or throw an exception if the field does not exist. 1459c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// 146005bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getValueInit(StringRef FieldName) const; 1461c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 14625c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// getValueAsString - This method looks up the specified field and returns 14635c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// its value as a string, throwing an exception if the field does not exist 14645c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// or if the value is not a string. 14655c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// 1466c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::string getValueAsString(StringRef FieldName) const; 14675c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 14686f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// getValueAsBitsInit - This method looks up the specified field and returns 14696f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// its value as a BitsInit, throwing an exception if the field does not exist 14706f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// or if the value is not the right type. 14716f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// 147205bce0beee87512e52428d4b80f5a8e79a949576David Greene BitsInit *getValueAsBitsInit(StringRef FieldName) const; 14736f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner 147458c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// getValueAsListInit - This method looks up the specified field and returns 147558c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// its value as a ListInit, throwing an exception if the field does not exist 147658c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// or if the value is not the right type. 147758c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// 147805bce0beee87512e52428d4b80f5a8e79a949576David Greene ListInit *getValueAsListInit(StringRef FieldName) const; 147958c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner 1480b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner /// getValueAsListOfDefs - This method looks up the specified field and 1481af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov /// returns its value as a vector of records, throwing an exception if the 1482b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner /// field does not exist or if the value is not the right type. 1483fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey /// 1484c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::vector<Record*> getValueAsListOfDefs(StringRef FieldName) const; 1485fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey 1486f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// getValueAsListOfInts - This method looks up the specified field and 1487f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// returns its value as a vector of integers, throwing an exception if the 1488f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// field does not exist or if the value is not the right type. 1489af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov /// 1490c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const; 149121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1492bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// getValueAsListOfStrings - This method looks up the specified field and 1493bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// returns its value as a vector of strings, throwing an exception if the 1494bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// field does not exist or if the value is not the right type. 1495bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// 1496bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson std::vector<std::string> getValueAsListOfStrings(StringRef FieldName) const; 1497bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson 1498dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// getValueAsDef - This method looks up the specified field and returns its 1499dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// value as a Record, throwing an exception if the field does not exist or if 1500dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// the value is not the right type. 1501dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// 1502c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner Record *getValueAsDef(StringRef FieldName) const; 1503dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner 15040969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// getValueAsBit - This method looks up the specified field and returns its 15050969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// value as a bit, throwing an exception if the field does not exist or if 15060969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// the value is not the right type. 15070969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// 1508c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner bool getValueAsBit(StringRef FieldName) const; 15090969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner 151058c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// getValueAsInt - This method looks up the specified field and returns its 151163f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman /// value as an int64_t, throwing an exception if the field does not exist or 151263f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman /// if the value is not the right type. 151358c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// 1514c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner int64_t getValueAsInt(StringRef FieldName) const; 1515784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner 1516784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// getValueAsDag - This method looks up the specified field and returns its 1517784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// value as an Dag, throwing an exception if the field does not exist or if 1518784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// the value is not the right type. 1519784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// 152005bce0beee87512e52428d4b80f5a8e79a949576David Greene DagInit *getValueAsDag(StringRef FieldName) const; 1521e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1522e62c1185bee05facc25d1d725434f517261d308bChris Lattner 15231a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const Record &R); 1524e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1525c7cafcd815519b06318629b424abe746437e1389David Greenestruct MultiClass { 1526c7cafcd815519b06318629b424abe746437e1389David Greene Record Rec; // Placeholder for template args and Name. 1527c7cafcd815519b06318629b424abe746437e1389David Greene typedef std::vector<Record*> RecordVector; 1528c7cafcd815519b06318629b424abe746437e1389David Greene RecordVector DefPrototypes; 1529d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 1530d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene void dump() const; 1531d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 153267db883487fca3472fdde51e931657e22d4d0495Chris Lattner MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) : 153367db883487fca3472fdde51e931657e22d4d0495Chris Lattner Rec(Name, Loc, Records) {} 1534c7cafcd815519b06318629b424abe746437e1389David Greene}; 1535c7cafcd815519b06318629b424abe746437e1389David Greene 1536e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordKeeper { 1537e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*> Classes, Defs; 1538e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1539e62c1185bee05facc25d1d725434f517261d308bChris Lattner ~RecordKeeper() { 1540e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (std::map<std::string, Record*>::iterator I = Classes.begin(), 1541ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen E = Classes.end(); I != E; ++I) 1542e62c1185bee05facc25d1d725434f517261d308bChris Lattner delete I->second; 1543e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (std::map<std::string, Record*>::iterator I = Defs.begin(), 1544ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen E = Defs.end(); I != E; ++I) 1545e62c1185bee05facc25d1d725434f517261d308bChris Lattner delete I->second; 1546e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 15473da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 1548e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::map<std::string, Record*> &getClasses() const { return Classes; } 1549e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::map<std::string, Record*> &getDefs() const { return Defs; } 1550e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1551e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getClass(const std::string &Name) const { 1552e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*>::const_iterator I = Classes.find(Name); 1553e62c1185bee05facc25d1d725434f517261d308bChris Lattner return I == Classes.end() ? 0 : I->second; 1554e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1555e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getDef(const std::string &Name) const { 1556e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*>::const_iterator I = Defs.find(Name); 1557e62c1185bee05facc25d1d725434f517261d308bChris Lattner return I == Defs.end() ? 0 : I->second; 1558e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1559e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addClass(Record *R) { 15600615d6aac810059a37fbced0f315cce75476da49David Greene assert(getClass(R->getNameInitAsString()) == 0 && "Class already exists!"); 15610615d6aac810059a37fbced0f315cce75476da49David Greene Classes.insert(std::make_pair(R->getNameInitAsString(), R)); 1562e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1563e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addDef(Record *R) { 15640615d6aac810059a37fbced0f315cce75476da49David Greene assert(getDef(R->getNameInitAsString()) == 0 && "Def already exists!"); 15650615d6aac810059a37fbced0f315cce75476da49David Greene Defs.insert(std::make_pair(R->getNameInitAsString(), R)); 1566e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1567e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1568936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// removeClass - Remove, but do not delete, the specified record. 1569936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// 1570936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void removeClass(const std::string &Name) { 1571936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner assert(Classes.count(Name) && "Class does not exist!"); 1572936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner Classes.erase(Name); 1573936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner } 1574936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// removeDef - Remove, but do not delete, the specified record. 1575936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// 1576936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void removeDef(const std::string &Name) { 1577936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner assert(Defs.count(Name) && "Def does not exist!"); 1578936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner Defs.erase(Name); 1579936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner } 158021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1581ab47ae3381aa2372009a9054260461c20324b555Chris Lattner //===--------------------------------------------------------------------===// 1582ab47ae3381aa2372009a9054260461c20324b555Chris Lattner // High-level helper methods, useful for tablegen backends... 1583ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 1584ab47ae3381aa2372009a9054260461c20324b555Chris Lattner /// getAllDerivedDefinitions - This method returns all concrete definitions 1585ab47ae3381aa2372009a9054260461c20324b555Chris Lattner /// that derive from the specified class name. If a class with the specified 15865c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// name does not exist, an exception is thrown. 15875c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner std::vector<Record*> 15885c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner getAllDerivedDefinitions(const std::string &ClassName) const; 1589ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 1590e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 1591e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1592e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1593690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// LessRecord - Sorting predicate to sort record pointers by name. 1594690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// 1595690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecord { 1596690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner bool operator()(const Record *Rec1, const Record *Rec2) const { 1597160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0; 1598690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner } 1599690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner}; 1600690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner 160121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// LessRecordFieldName - Sorting predicate to sort record pointers by their 16027c9a7728d9dd248ebee8f2dd969d303711d487a9Jim Grosbach/// name field. 1603690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// 1604690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecordFieldName { 1605690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner bool operator()(const Record *Rec1, const Record *Rec2) const { 1606690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name"); 1607690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner } 1608690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner}; 1609690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner 16101a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK); 1611e62c1185bee05facc25d1d725434f517261d308bChris Lattner 161230c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring 161330c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name. 161430c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass, 161530c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene Init *Name, const std::string &Scoper); 161630c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 161730c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring 161830c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name. 161930c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass, 162030c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene const std::string &Name, const std::string &Scoper); 162130c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 1622d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 1623d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 1624e62c1185bee05facc25d1d725434f517261d308bChris Lattner#endif 1625