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. 4574b18691c3580674691875ec37c84a1c4edf2d586Jim Grosbach 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 } 512307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 513307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// getBit - This method is used to return the initializer for the specified 514307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// bit. 515307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const = 0; 516307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 517307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// getBitVar - This method is used to retrieve the initializer for bit 518307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// reference. For non-VarBitInit, it simply returns itself. 519307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBitVar() const { return const_cast<Init*>(this); } 520307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 521307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// getBitNum - This method is used to retrieve the bit number of a bit 522307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// reference. For non-VarBitInit, it simply returns 0. 523307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual unsigned getBitNum() const { return 0; } 524e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 525e62c1185bee05facc25d1d725434f517261d308bChris Lattner 5261a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const Init &I) { 527e62c1185bee05facc25d1d725434f517261d308bChris Lattner I.print(OS); return OS; 528e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 529e62c1185bee05facc25d1d725434f517261d308bChris Lattner 530beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// TypedInit - This is the common super-class of types that have a specific, 531beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// explicit, type. 532beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// 533beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass TypedInit : public Init { 534beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene RecTy *Ty; 535dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 536dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TypedInit(const TypedInit &Other); // Do not define. 537dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TypedInit &operator=(const TypedInit &Other); // Do not define. 538dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 539dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 540d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit TypedInit(RecTy *T) : Ty(T) {} 541d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher 542dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 543beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene RecTy *getType() const { return Ty; } 544beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 54505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 546f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const; 54705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 548f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitListSlice(const std::vector<unsigned> &Elements) const; 549beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 5509703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// getFieldType - This method is used to implement the FieldInit class. 5519703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// Implementors of this method should return the type of the named field if 5529703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// they are of record type. 5539703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// 5549703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene virtual RecTy *getFieldType(const std::string &FieldName) const; 5559703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene 556beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveListElementReference - This method is used to implement 557beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 558beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// now, we return the resolved value, otherwise we return null. 55905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 56005bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const = 0; 561beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene}; 562beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 56307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 56407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// UnsetInit - ? - Represents an uninitialized value 56507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 5661fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass UnsetInit : public Init { 567dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnsetInit() : Init() {} 568dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnsetInit(const UnsetInit &); // Do not define. 569dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnsetInit &operator=(const UnsetInit &Other); // Do not define. 5702d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 571dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 5721fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 57305bce0beee87512e52428d4b80f5a8e79a949576David Greene static UnsetInit *get(); 574dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 57505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 57605bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<UnsetInit *>(this)); 577e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 578e62c1185bee05facc25d1d725434f517261d308bChris Lattner 579307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const { 580307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<UnsetInit*>(this); 581307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 582307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 583e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual bool isComplete() const { return false; } 5843aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return "?"; } 585e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 586e62c1185bee05facc25d1d725434f517261d308bChris Lattner 58707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 58807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitInit - true/false - Represent a concrete initializer for a bit. 58907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 590e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit : public Init { 591e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool Value; 592dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 593d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit BitInit(bool V) : Value(V) {} 594dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitInit(const BitInit &Other); // Do not define. 595dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitInit &operator=(BitInit &Other); // Do not define. 5962d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 597dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 598dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 59905bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitInit *get(bool V); 600e62c1185bee05facc25d1d725434f517261d308bChris Lattner 601e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool getValue() const { return Value; } 602e62c1185bee05facc25d1d725434f517261d308bChris Lattner 60305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 60405bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<BitInit *>(this)); 605e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 606e62c1185bee05facc25d1d725434f517261d308bChris Lattner 607307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const { 608307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao assert(Bit < 1 && "Bit index out of range!"); 609307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<BitInit*>(this); 610307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 611307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 6123aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return Value ? "1" : "0"; } 613e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 614e62c1185bee05facc25d1d725434f517261d308bChris Lattner 61507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value. 61607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// It contains a vector of bits, whose size is determined by the type. 61707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 618726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greeneclass BitsInit : public Init, public FoldingSetNode { 61905bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Bits; 620dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 62105bce0beee87512e52428d4b80f5a8e79a949576David Greene BitsInit(ArrayRef<Init *> Range) : Bits(Range.begin(), Range.end()) {} 622e62c1185bee05facc25d1d725434f517261d308bChris Lattner 623dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitsInit(const BitsInit &Other); // Do not define. 624dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BitsInit &operator=(const BitsInit &Other); // Do not define. 625dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 626dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 62705bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitsInit *get(ArrayRef<Init *> Range); 628dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 629726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene void Profile(FoldingSetNodeID &ID) const; 630726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 631e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getNumBits() const { return Bits.size(); } 632e62c1185bee05facc25d1d725434f517261d308bChris Lattner 63305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 63405bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<BitsInit *>(this)); 635e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 63605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 637f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const; 638e62c1185bee05facc25d1d725434f517261d308bChris Lattner 639e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual bool isComplete() const { 640e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0; i != getNumBits(); ++i) 641e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (!getBit(i)->isComplete()) return false; 642e62c1185bee05facc25d1d725434f517261d308bChris Lattner return true; 643e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 6441808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen bool allInComplete() const { 6451808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen for (unsigned i = 0; i != getNumBits(); ++i) 6461808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen if (getBit(i)->isComplete()) return false; 6471808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen return true; 6481808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen } 6493aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 650e62c1185bee05facc25d1d725434f517261d308bChris Lattner 65105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 652307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 653307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const { 654307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao assert(Bit < Bits.size() && "Bit index out of range!"); 655307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return Bits[Bit]; 656307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 657e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 658e62c1185bee05facc25d1d725434f517261d308bChris Lattner 65907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 66007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntInit - 7 - Represent an initalization by a literal integer value. 66107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 662e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greeneclass IntInit : public TypedInit { 66363f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t Value; 664dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 66577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen explicit IntInit(int64_t V) : TypedInit(IntRecTy::get()), Value(V) {} 666e62c1185bee05facc25d1d725434f517261d308bChris Lattner 667dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene IntInit(const IntInit &Other); // Do not define. 668dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene IntInit &operator=(const IntInit &Other); // Do note define. 669dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 670dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 67105bce0beee87512e52428d4b80f5a8e79a949576David Greene static IntInit *get(int64_t V); 672dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 67363f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t getValue() const { return Value; } 674e62c1185bee05facc25d1d725434f517261d308bChris Lattner 67505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 67605bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<IntInit *>(this)); 677e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 67805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 679f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const; 680e62c1185bee05facc25d1d725434f517261d308bChris Lattner 6813aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 682e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 683e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveListElementReference - This method is used to implement 684e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 685e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// now, we return the resolved value, otherwise we return null. 68605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 68705bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 68850bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off int"); 689e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 690307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 691307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const { 692236bcf1fcd6164d624956c0858593c1a780b9a0bAaron Ballman return BitInit::get((Value & (1ULL << Bit)) != 0); 693307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 694e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 695e62c1185bee05facc25d1d725434f517261d308bChris Lattner 69607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 69707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringInit - "foo" - Represent an initialization by a string value. 69807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 699beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass StringInit : public TypedInit { 700e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::string Value; 701dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 702d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit StringInit(const std::string &V) 70377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen : TypedInit(StringRecTy::get()), Value(V) {} 704e62c1185bee05facc25d1d725434f517261d308bChris Lattner 705dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene StringInit(const StringInit &Other); // Do not define. 706dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene StringInit &operator=(const StringInit &Other); // Do not define. 7072d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 708dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 709dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 710ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen static StringInit *get(StringRef); 711dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 7125c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner const std::string &getValue() const { return Value; } 7135c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 71405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 71505bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<StringInit *>(this)); 716e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 717e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7183aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const { return "\"" + Value + "\""; } 7190b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene virtual std::string getAsUnquotedString() const { return Value; } 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 } 728307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 729307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const { 730307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao llvm_unreachable("Illegal bit reference off string"); 731307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 732e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 733e62c1185bee05facc25d1d725434f517261d308bChris Lattner 73407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// ListInit - [AL, AH, CL] - Represent a list of defs 73507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 736aad4c9fc37b38cae21343173084c81d789535446David Greeneclass ListInit : public TypedInit, public FoldingSetNode { 73705bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Values; 738e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 73905bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::vector<Init*>::const_iterator const_iterator; 7405f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene 741aad4c9fc37b38cae21343173084c81d789535446David Greeneprivate: 74205bce0beee87512e52428d4b80f5a8e79a949576David Greene explicit ListInit(ArrayRef<Init *> Range, RecTy *EltTy) 74360c04af7879c3eda957162737783de726dd177b6David Greene : TypedInit(ListRecTy::get(EltTy)), Values(Range.begin(), Range.end()) {} 744e62c1185bee05facc25d1d725434f517261d308bChris Lattner 745dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene ListInit(const ListInit &Other); // Do not define. 746dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene ListInit &operator=(const ListInit &Other); // Do not define. 747dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 748dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 74905bce0beee87512e52428d4b80f5a8e79a949576David Greene static ListInit *get(ArrayRef<Init *> Range, RecTy *EltTy); 750dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 751aad4c9fc37b38cae21343173084c81d789535446David Greene void Profile(FoldingSetNodeID &ID) const; 752aad4c9fc37b38cae21343173084c81d789535446David Greene 7537cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner unsigned getSize() const { return Values.size(); } 75405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getElement(unsigned i) const { 7557cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner assert(i < Values.size() && "List element index out of range!"); 7567cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return Values[i]; 757e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 758e62c1185bee05facc25d1d725434f517261d308bChris Lattner 75950d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner Record *getElementAsRecord(unsigned i) const; 76021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 76105bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *convertInitListSlice(const std::vector<unsigned> &Elements) const; 762b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner 76305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 76405bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<ListInit *>(this)); 765e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 766e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7671dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// resolveReferences - This method is used by classes that refer to other 7681dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// variables which may not be defined at the time they expression is formed. 7691dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// If a value is set for the variable later, this method will be called on 7701dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// users of the value to allow the value to propagate out. 7711dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// 77205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 7731dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 7743aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 77582137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov 77605bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init*> getValues() const { return Values; } 777c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene 77882137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline const_iterator begin() const { return Values.begin(); } 77982137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline const_iterator end () const { return Values.end(); } 78082137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov 78182137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline size_t size () const { return Values.size(); } 78282137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline bool empty() const { return Values.empty(); } 783e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 784e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveListElementReference - This method is used to implement 785e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 786e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// now, we return the resolved value, otherwise we return null. 78705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 78805bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 789307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 790307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const { 791307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao llvm_unreachable("Illegal bit reference off list"); 792307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 793e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 794e62c1185bee05facc25d1d725434f517261d308bChris Lattner 7957331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 796d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// OpInit - Base class for operators 797d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 798d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass OpInit : public TypedInit { 799dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit(const OpInit &Other); // Do not define. 800dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit &operator=(OpInit &Other); // Do not define. 801d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher 802dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 803dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene explicit OpInit(RecTy *Type) : TypedInit(Type) {} 804dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 805dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 806d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Clone - Clone this operator, replacing arguments with the new list 80705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const = 0; 808d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 809a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman virtual int getNumOperands() const = 0; 81005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getOperand(int i) const = 0; 811d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 812d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Fold - If possible, fold this to a simpler init. Return this if not 813d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // possible to fold. 81405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const = 0; 815d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 81605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 81705bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<OpInit *>(this)); 818d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 81921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 82005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 82105bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 822307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 823307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const; 824d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene}; 825d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 826d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 827d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// UnOpInit - !op (X) - Transform an init. 828d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 829e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit : public OpInit { 830e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic: 8311434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene enum UnaryOp { CAST, HEAD, TAIL, EMPTY }; 832e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneprivate: 833e6c27de069225e1122c78385ad22a2ff656db8e6David Greene UnaryOp Opc; 83405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS; 835dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 83605bce0beee87512e52428d4b80f5a8e79a949576David Greene UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type) 837dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : OpInit(Type), Opc(opc), LHS(lhs) {} 838dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 839dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnOpInit(const UnOpInit &Other); // Do not define. 840dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene UnOpInit &operator=(const UnOpInit &Other); // Do not define. 841dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 842e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic: 84305bce0beee87512e52428d4b80f5a8e79a949576David Greene static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type); 844d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 845e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // Clone - Clone this operator, replacing arguments with the new list 84605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const { 847aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 1 && 848aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for unary operation"); 849dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return UnOpInit::get(getOpcode(), *Operands.begin(), getType()); 850e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 851d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 852a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman int getNumOperands() const { return 1; } 85305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand(int i) const { 854e6c27de069225e1122c78385ad22a2ff656db8e6David Greene assert(i == 0 && "Invalid operand id for unary operator"); 855e6c27de069225e1122c78385ad22a2ff656db8e6David Greene return getOperand(); 856e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 85721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 858e6c27de069225e1122c78385ad22a2ff656db8e6David Greene UnaryOp getOpcode() const { return Opc; } 85905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand() const { return LHS; } 860d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 861e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // Fold - If possible, fold this to a simpler init. Return this if not 862e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // possible to fold. 86305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const; 864d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 86505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 86621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 867e6c27de069225e1122c78385ad22a2ff656db8e6David Greene virtual std::string getAsString() const; 868e6c27de069225e1122c78385ad22a2ff656db8e6David Greene}; 869e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 870e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// BinOpInit - !op (X, Y) - Combine two inits. 871e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// 872d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass BinOpInit : public OpInit { 873e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greenepublic: 874c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, EQ }; 875e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greeneprivate: 876e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene BinaryOp Opc; 87705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS, *RHS; 878dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 87905bce0beee87512e52428d4b80f5a8e79a949576David Greene BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) : 880dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit(Type), Opc(opc), LHS(lhs), RHS(rhs) {} 881dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 882dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BinOpInit(const BinOpInit &Other); // Do not define. 883dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene BinOpInit &operator=(const BinOpInit &Other); // Do not define. 884dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 885dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 88605bce0beee87512e52428d4b80f5a8e79a949576David Greene static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs, 88705bce0beee87512e52428d4b80f5a8e79a949576David Greene RecTy *Type); 88821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 889d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Clone - Clone this operator, replacing arguments with the new list 89005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const { 891aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 2 && 892aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for binary operation"); 893dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType()); 894d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 895d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 896a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman int getNumOperands() const { return 2; } 89705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand(int i) const { 898aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert((i == 0 || i == 1) && "Invalid operand id for binary operator"); 899d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene if (i == 0) { 900d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene return getLHS(); 90121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 902d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene return getRHS(); 903d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 904d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 905d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 906e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene BinaryOp getOpcode() const { return Opc; } 90705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getLHS() const { return LHS; } 90805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getRHS() const { return RHS; } 909e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 910e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene // Fold - If possible, fold this to a simpler init. Return this if not 911e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene // possible to fold. 91205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const; 913e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 91405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 91521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 916e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene virtual std::string getAsString() const; 917e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene}; 918e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 919d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// TernOpInit - !op (X, Y, Z) - Combine two inits. 920d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 9214afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit : public OpInit { 9224afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greenepublic: 923ffc0ab6037aa45bc22f57433148e5f586843b3a7David Greene enum TernaryOp { SUBST, FOREACH, IF }; 9244afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneprivate: 9254afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene TernaryOp Opc; 92605bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS, *MHS, *RHS; 927dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 92805bce0beee87512e52428d4b80f5a8e79a949576David Greene TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs, 929f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene RecTy *Type) : 930dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene OpInit(Type), Opc(opc), LHS(lhs), MHS(mhs), RHS(rhs) {} 931dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 932dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TernOpInit(const TernOpInit &Other); // Do not define. 933dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TernOpInit &operator=(const TernOpInit &Other); // Do not define. 934dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 935dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 93605bce0beee87512e52428d4b80f5a8e79a949576David Greene static TernOpInit *get(TernaryOp opc, Init *lhs, 93705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *mhs, Init *rhs, 93805bce0beee87512e52428d4b80f5a8e79a949576David Greene RecTy *Type); 93921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 9404afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // Clone - Clone this operator, replacing arguments with the new list 94105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const { 942aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 3 && 943aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for ternary operation"); 944dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return TernOpInit::get(getOpcode(), Operands[0], Operands[1], Operands[2], 945dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene getType()); 9464afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 9474afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 948a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman int getNumOperands() const { return 3; } 94905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand(int i) const { 950aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert((i == 0 || i == 1 || i == 2) && 951aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Invalid operand id for ternary operator"); 9524afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene if (i == 0) { 9534afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getLHS(); 95421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else if (i == 1) { 9554afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getMHS(); 95621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 9574afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getRHS(); 9584afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 9594afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 9604afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 9614afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene TernaryOp getOpcode() const { return Opc; } 96205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getLHS() const { return LHS; } 96305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getMHS() const { return MHS; } 96405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getRHS() const { return RHS; } 9654afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 9664afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // Fold - If possible, fold this to a simpler init. Return this if not 9674afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // possible to fold. 96805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const; 96921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 970548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling virtual bool isComplete() const { return false; } 971548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling 97205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 97321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 9744afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene virtual std::string getAsString() const; 9754afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene}; 976d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 977e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 97807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// VarInit - 'Opcode' - Represent a reference to an entire variable object. 97907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 9807331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass VarInit : public TypedInit { 981ee6dca17252de152720655282fb4b74b76fb2fe9David Greene Init *VarName; 982dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 983d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit VarInit(const std::string &VN, RecTy *T) 984ee6dca17252de152720655282fb4b74b76fb2fe9David Greene : TypedInit(T), VarName(StringInit::get(VN)) {} 985ee6dca17252de152720655282fb4b74b76fb2fe9David Greene explicit VarInit(Init *VN, RecTy *T) 986dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : TypedInit(T), VarName(VN) {} 987dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 988dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarInit(const VarInit &Other); // Do not define. 989dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarInit &operator=(const VarInit &Other); // Do not define. 990dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 991dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 99205bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarInit *get(const std::string &VN, RecTy *T); 99305bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarInit *get(Init *VN, RecTy *T); 9943da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 99505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 99605bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarInit *>(this)); 997e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 998e62c1185bee05facc25d1d725434f517261d308bChris Lattner 999ee6dca17252de152720655282fb4b74b76fb2fe9David Greene const std::string &getName() const; 1000ee6dca17252de152720655282fb4b74b76fb2fe9David Greene Init *getNameInit() const { return VarName; } 1001ee6dca17252de152720655282fb4b74b76fb2fe9David Greene std::string getNameInitAsString() const { 1002ee6dca17252de152720655282fb4b74b76fb2fe9David Greene return getNameInit()->getAsUnquotedString(); 1003ee6dca17252de152720655282fb4b74b76fb2fe9David Greene } 1004e62c1185bee05facc25d1d725434f517261d308bChris Lattner 100505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 100605bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 10077331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 1008a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner virtual RecTy *getFieldType(const std::string &FieldName) const; 100905bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getFieldInit(Record &R, const RecordVal *RV, 101005bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const; 10119b929aa7495ee0b5d389370baeb332456632b2feChris Lattner 10129b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// resolveReferences - This method is used by classes that refer to other 10139b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// variables which may not be defined at the time they expression is formed. 10149b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// If a value is set for the variable later, this method will be called on 10159b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// users of the value to allow the value to propagate out. 10169b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// 101705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 10183da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 1019307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const; 1020307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 1021ee6dca17252de152720655282fb4b74b76fb2fe9David Greene virtual std::string getAsString() const { return getName(); } 1022e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1023e62c1185bee05facc25d1d725434f517261d308bChris Lattner 102407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 10257331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner/// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field. 102607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1027e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass VarBitInit : public Init { 102805bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *TI; 1029e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Bit; 1030dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 103105bce0beee87512e52428d4b80f5a8e79a949576David Greene VarBitInit(TypedInit *T, unsigned B) : TI(T), Bit(B) { 1032307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao assert(T->getType() && 1033307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao (dynamic_cast<IntRecTy*>(T->getType()) || 1034307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao (dynamic_cast<BitsRecTy*>(T->getType()) && 1035307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao dynamic_cast<BitsRecTy*>(T->getType())->getNumBits() > B)) && 10367331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner "Illegal VarBitInit expression!"); 10377331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner } 1038e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1039dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarBitInit(const VarBitInit &Other); // Do not define. 1040dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarBitInit &operator=(const VarBitInit &Other); // Do not define. 1041dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1042dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 104305bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarBitInit *get(TypedInit *T, unsigned B); 1044dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 104505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 104605bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarBitInit *>(this)); 1047e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1048e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1049307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBitVar() const { return TI; } 1050307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual unsigned getBitNum() const { return Bit; } 10513da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 10523aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 105305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 1054307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 1055307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned B) const { 1056307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao assert(B < 1 && "Bit index out of range!"); 1057307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<VarBitInit*>(this); 1058307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 1059e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1060e62c1185bee05facc25d1d725434f517261d308bChris Lattner 10613da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman/// VarListElementInit - List[4] - Represent access to one element of a var or 10621dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner/// field. 10631dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit : public TypedInit { 106405bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *TI; 10651dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner unsigned Element; 1066dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 106705bce0beee87512e52428d4b80f5a8e79a949576David Greene VarListElementInit(TypedInit *T, unsigned E) 1068dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene : TypedInit(dynamic_cast<ListRecTy*>(T->getType())->getElementType()), 1069dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene TI(T), Element(E) { 10701dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner assert(T->getType() && dynamic_cast<ListRecTy*>(T->getType()) && 10711dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner "Illegal VarBitInit expression!"); 10721dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 10731dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 1074dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarListElementInit(const VarListElementInit &Other); // Do not define. 1075dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene VarListElementInit &operator=(const VarListElementInit &Other); // Do 1076dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene // not 1077dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene // define. 1078dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1079dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 108005bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarListElementInit *get(TypedInit *T, unsigned E); 1081dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 108205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 108305bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarListElementInit *>(this)); 10841dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 10851dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 108605bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *getVariable() const { return TI; } 10871dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner unsigned getElementNum() const { return Element; } 10881dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 10891dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// resolveListElementReference - This method is used to implement 10901dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// VarListElementInit::resolveReferences. If the list element is resolvable 10911dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// now, we return the resolved value, otherwise we return null. 109205bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, 109305bce0beee87512e52428d4b80f5a8e79a949576David Greene const RecordVal *RV, 109405bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const; 10951dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 10963aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 109705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const; 1098307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 1099307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const; 11001dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner}; 110107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 110207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// DefInit - AL - Represent a reference to a 'def' in the description 110307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1104beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass DefInit : public TypedInit { 1105e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *Def; 1106dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 110777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit(Record *D, RecordRecTy *T) : TypedInit(T), Def(D) {} 110877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen friend class Record; 1109dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1110dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DefInit(const DefInit &Other); // Do not define. 1111dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene DefInit &operator=(const DefInit &Other); // Do not define. 1112dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1113e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 111405bce0beee87512e52428d4b80f5a8e79a949576David Greene static DefInit *get(Record*); 11153da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 111605bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const { 111705bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<DefInit *>(this)); 1118e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1119e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1120e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getDef() const { return Def; } 1121e62c1185bee05facc25d1d725434f517261d308bChris Lattner 112205bce0beee87512e52428d4b80f5a8e79a949576David Greene //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits); 1123b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner 1124b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner virtual RecTy *getFieldType(const std::string &FieldName) const; 112505bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getFieldInit(Record &R, const RecordVal *RV, 112605bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const; 11273da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 11283aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const; 1129beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 1130307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(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 1166307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const; 1167307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 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 1246307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const { 124750bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal bit reference off dag"); 1248beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 124921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 125005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 125105bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const { 125250bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off dag"); 1253beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 12548e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner}; 1255e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1256e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1257e62c1185bee05facc25d1d725434f517261d308bChris Lattner// High-Level Classes 1258e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1259e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1260e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordVal { 1261011dca7fac07100695dd3685bfaddbea58a468b9David Greene Init *Name; 1262e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecTy *Ty; 1263e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Prefix; 126405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Value; 1265e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1266011dca7fac07100695dd3685bfaddbea58a468b9David Greene RecordVal(Init *N, RecTy *T, unsigned P); 1267e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecordVal(const std::string &N, RecTy *T, unsigned P); 1268e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1269011dca7fac07100695dd3685bfaddbea58a468b9David Greene const std::string &getName() const; 1270de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene const Init *getNameInit() const { return Name; } 1271de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene std::string getNameInitAsString() const { 1272de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene return getNameInit()->getAsUnquotedString(); 1273de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene } 1274e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1275e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getPrefix() const { return Prefix; } 1276e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecTy *getType() const { return Ty; } 127705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getValue() const { return Value; } 1278e62c1185bee05facc25d1d725434f517261d308bChris Lattner 127905bce0beee87512e52428d4b80f5a8e79a949576David Greene bool setValue(Init *V) { 1280e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (V) { 1281e62c1185bee05facc25d1d725434f517261d308bChris Lattner Value = V->convertInitializerTo(Ty); 1282e62c1185bee05facc25d1d725434f517261d308bChris Lattner return Value == 0; 1283e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1284e62c1185bee05facc25d1d725434f517261d308bChris Lattner Value = 0; 1285e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1286e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1287e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1288e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 12891a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar void print(raw_ostream &OS, bool PrintSem = true) const; 1290e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1291e62c1185bee05facc25d1d725434f517261d308bChris Lattner 12921a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecordVal &RV) { 1293e62c1185bee05facc25d1d725434f517261d308bChris Lattner RV.print(OS << " "); 1294e62c1185bee05facc25d1d725434f517261d308bChris Lattner return OS; 1295e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1296e62c1185bee05facc25d1d725434f517261d308bChris Lattner 129789e0f74094a6a86170c2c70fe8c6c19cb99c97a0Chris Lattnerclass Record { 12986f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar static unsigned LastID; 12996f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar 13006f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar // Unique record ID. 13016f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar unsigned ID; 13020d886401b3ec09b0c2d267942b07702a2f0740f4David Greene Init *Name; 1303376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen // Location where record was instantiated, followed by the location of 1304376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen // multiclass prototypes used. 1305376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen SmallVector<SMLoc, 4> Locs; 1306e22b321d2276b634519165b101b02d92c2fcf5c7David Greene std::vector<Init *> TemplateArgs; 1307e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::vector<RecordVal> Values; 1308e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::vector<Record*> SuperClasses; 130967db883487fca3472fdde51e931657e22d4d0495Chris Lattner 131067db883487fca3472fdde51e931657e22d4d0495Chris Lattner // Tracks Record instances. Not owned by Record. 131167db883487fca3472fdde51e931657e22d4d0495Chris Lattner RecordKeeper &TrackedRecords; 131267db883487fca3472fdde51e931657e22d4d0495Chris Lattner 131377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit *TheInit; 131477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 1315f7931b7040de1c829e678b4e391308bc3376f8a0David Greene void init(); 13160d886401b3ec09b0c2d267942b07702a2f0740f4David Greene void checkName(); 13170d886401b3ec09b0c2d267942b07702a2f0740f4David Greene 1318e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1319e62c1185bee05facc25d1d725434f517261d308bChris Lattner 13209c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner // Constructs a record. 1321376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen explicit Record(const std::string &N, ArrayRef<SMLoc> locs, 1322376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen RecordKeeper &records) : 1323376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen ID(LastID++), Name(StringInit::get(N)), Locs(locs.begin(), locs.end()), 1324376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen TrackedRecords(records), TheInit(0) { 1325004adaf3452a355ada2a54bcb61dc8925a718651David Greene init(); 13260abdadbce7e04af76145154d75ca41dab749b8d6David Greene } 1327376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen explicit Record(Init *N, ArrayRef<SMLoc> locs, RecordKeeper &records) : 1328376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen ID(LastID++), Name(N), Locs(locs.begin(), locs.end()), 1329376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen TrackedRecords(records), TheInit(0) { 1330004adaf3452a355ada2a54bcb61dc8925a718651David Greene init(); 1331675f85d0f240930d571f4e557bb92237ee48124eDavid Greene } 1332e62c1185bee05facc25d1d725434f517261d308bChris Lattner ~Record() {} 133321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1334f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 1335117ccb7e518f05e4bf3df058fc402262f897ff0bChris Lattner static unsigned getNewUID() { return LastID++; } 1336f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 1337f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 13386f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar unsigned getID() const { return ID; } 13396f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar 13400d886401b3ec09b0c2d267942b07702a2f0740f4David Greene const std::string &getName() const; 1341d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene Init *getNameInit() const { 1342d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene return Name; 1343d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene } 1344d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene const std::string getNameInitAsString() const { 1345d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene return getNameInit()->getAsUnquotedString(); 1346d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene } 1347d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene 13480d886401b3ec09b0c2d267942b07702a2f0740f4David Greene void setName(Init *Name); // Also updates RecordKeeper. 1349936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void setName(const std::string &Name); // Also updates RecordKeeper. 135021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1351376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen ArrayRef<SMLoc> getLoc() const { return Locs; } 135221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 135377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen /// get the corresponding DefInit. 135477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit *getDefInit(); 135577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 1356e22b321d2276b634519165b101b02d92c2fcf5c7David Greene const std::vector<Init *> &getTemplateArgs() const { 1357e62c1185bee05facc25d1d725434f517261d308bChris Lattner return TemplateArgs; 1358e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1359e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::vector<RecordVal> &getValues() const { return Values; } 1360e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::vector<Record*> &getSuperClasses() const { return SuperClasses; } 1361e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1362e22b321d2276b634519165b101b02d92c2fcf5c7David Greene bool isTemplateArg(Init *Name) const { 1363e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i) 1364e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (TemplateArgs[i] == Name) return true; 1365e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1366e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1367e22b321d2276b634519165b101b02d92c2fcf5c7David Greene bool isTemplateArg(StringRef Name) const { 1368e22b321d2276b634519165b101b02d92c2fcf5c7David Greene return isTemplateArg(StringInit::get(Name.str())); 1369e22b321d2276b634519165b101b02d92c2fcf5c7David Greene } 1370e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1371ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen const RecordVal *getValue(const Init *Name) const { 1372e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 1373ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen if (Values[i].getNameInit() == Name) return &Values[i]; 1374e62c1185bee05facc25d1d725434f517261d308bChris Lattner return 0; 1375e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1376ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen const RecordVal *getValue(StringRef Name) const { 1377ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen return getValue(StringInit::get(Name)); 1378ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen } 1379ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen RecordVal *getValue(const Init *Name) { 1380e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 1381ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen if (Values[i].getNameInit() == Name) return &Values[i]; 1382e62c1185bee05facc25d1d725434f517261d308bChris Lattner return 0; 1383e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1384ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen RecordVal *getValue(StringRef Name) { 1385ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen return getValue(StringInit::get(Name)); 1386ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen } 138796a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene 1388e22b321d2276b634519165b101b02d92c2fcf5c7David Greene void addTemplateArg(Init *Name) { 1389e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(!isTemplateArg(Name) && "Template arg already defined!"); 1390e62c1185bee05facc25d1d725434f517261d308bChris Lattner TemplateArgs.push_back(Name); 1391e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1392e22b321d2276b634519165b101b02d92c2fcf5c7David Greene void addTemplateArg(StringRef Name) { 1393e22b321d2276b634519165b101b02d92c2fcf5c7David Greene addTemplateArg(StringInit::get(Name.str())); 1394e22b321d2276b634519165b101b02d92c2fcf5c7David Greene } 1395e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1396e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addValue(const RecordVal &RV) { 1397ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen assert(getValue(RV.getNameInit()) == 0 && "Value already added!"); 1398e62c1185bee05facc25d1d725434f517261d308bChris Lattner Values.push_back(RV); 1399e338565757bfcfe9d762751c976684f66954fb45David Greene if (Values.size() > 1) 1400e338565757bfcfe9d762751c976684f66954fb45David Greene // Keep NAME at the end of the list. It makes record dumps a 1401e338565757bfcfe9d762751c976684f66954fb45David Greene // bit prettier and allows TableGen tests to be written more 1402e338565757bfcfe9d762751c976684f66954fb45David Greene // naturally. Tests can use CHECK-NEXT to look for Record 1403e338565757bfcfe9d762751c976684f66954fb45David Greene // fields they expect to see after a def. They can't do that if 1404e338565757bfcfe9d762751c976684f66954fb45David Greene // NAME is the first Record field. 1405e338565757bfcfe9d762751c976684f66954fb45David Greene std::swap(Values[Values.size() - 2], Values[Values.size() - 1]); 1406e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1407e62c1185bee05facc25d1d725434f517261d308bChris Lattner 140896a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene void removeValue(Init *Name) { 1409bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 141096a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene if (Values[i].getNameInit() == Name) { 1411bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner Values.erase(Values.begin()+i); 1412bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner return; 1413bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner } 141450bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Cannot remove an entry that does not exist!"); 1415bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner } 1416bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner 141796a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene void removeValue(StringRef Name) { 141896a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene removeValue(StringInit::get(Name.str())); 141996a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene } 142096a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene 142102475f1fd502fa1729d1fc447417087acf9e96c8Ted Kremenek bool isSubClassOf(const Record *R) const { 1422e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i) 1423e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (SuperClasses[i] == R) 1424ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen return true; 1425e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1426e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1427e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1428c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner bool isSubClassOf(StringRef Name) const { 1429a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i) 14307474c29d903d479e7f99eb0d1d097f75289c5f48David Greene if (SuperClasses[i]->getNameInitAsString() == Name) 1431a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner return true; 1432a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner return false; 1433a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner } 1434a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner 1435e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addSuperClass(Record *R) { 1436e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(!isSubClassOf(R) && "Already subclassing record!"); 1437e62c1185bee05facc25d1d725434f517261d308bChris Lattner SuperClasses.push_back(R); 1438e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1439e62c1185bee05facc25d1d725434f517261d308bChris Lattner 14407dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// resolveReferences - If there are any field references that refer to fields 14417dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// that have been filled in, we can propagate the values now. 14427dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// 14437dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner void resolveReferences() { resolveReferencesTo(0); } 14447dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner 14457dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// resolveReferencesTo - If anything in this record refers to RV, replace the 14467dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// reference to RV with the RHS of RV. If RV is null, we resolve all 14477dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// possible references. 14487dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner void resolveReferencesTo(const RecordVal *RV); 1449e62c1185bee05facc25d1d725434f517261d308bChris Lattner 145067db883487fca3472fdde51e931657e22d4d0495Chris Lattner RecordKeeper &getRecords() const { 14519c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner return TrackedRecords; 145267db883487fca3472fdde51e931657e22d4d0495Chris Lattner } 145367db883487fca3472fdde51e931657e22d4d0495Chris Lattner 1454e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 14555c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 14565c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner //===--------------------------------------------------------------------===// 14575c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner // High-level methods useful to tablegen back-ends 14585c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner // 14595c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 1460c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// getValueInit - Return the initializer for a value with the specified name, 1461c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// or throw an exception if the field does not exist. 1462c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// 146305bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getValueInit(StringRef FieldName) const; 1464c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 14655c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// getValueAsString - This method looks up the specified field and returns 14665c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// its value as a string, throwing an exception if the field does not exist 14675c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// or if the value is not a string. 14685c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// 1469c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::string getValueAsString(StringRef FieldName) const; 14705c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 14716f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// getValueAsBitsInit - This method looks up the specified field and returns 14726f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// its value as a BitsInit, throwing an exception if the field does not exist 14736f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// or if the value is not the right type. 14746f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// 147505bce0beee87512e52428d4b80f5a8e79a949576David Greene BitsInit *getValueAsBitsInit(StringRef FieldName) const; 14766f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner 147758c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// getValueAsListInit - This method looks up the specified field and returns 147858c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// its value as a ListInit, throwing an exception if the field does not exist 147958c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// or if the value is not the right type. 148058c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// 148105bce0beee87512e52428d4b80f5a8e79a949576David Greene ListInit *getValueAsListInit(StringRef FieldName) const; 148258c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner 1483b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner /// getValueAsListOfDefs - This method looks up the specified field and 1484af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov /// returns its value as a vector of records, throwing an exception if the 1485b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner /// field does not exist or if the value is not the right type. 1486fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey /// 1487c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::vector<Record*> getValueAsListOfDefs(StringRef FieldName) const; 1488fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey 1489f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// getValueAsListOfInts - This method looks up the specified field and 1490f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// returns its value as a vector of integers, throwing an exception if the 1491f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// field does not exist or if the value is not the right type. 1492af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov /// 1493c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const; 149421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1495bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// getValueAsListOfStrings - This method looks up the specified field and 1496bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// returns its value as a vector of strings, throwing an exception if the 1497bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// field does not exist or if the value is not the right type. 1498bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// 1499bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson std::vector<std::string> getValueAsListOfStrings(StringRef FieldName) const; 1500bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson 1501dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// getValueAsDef - This method looks up the specified field and returns its 1502dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// value as a Record, throwing an exception if the field does not exist or if 1503dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// the value is not the right type. 1504dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// 1505c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner Record *getValueAsDef(StringRef FieldName) const; 1506dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner 15070969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// getValueAsBit - This method looks up the specified field and returns its 15080969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// value as a bit, throwing an exception if the field does not exist or if 15090969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// the value is not the right type. 15100969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// 1511c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner bool getValueAsBit(StringRef FieldName) const; 15120969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner 1513c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen /// getValueAsBitOrUnset - This method looks up the specified field and 1514c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen /// returns its value as a bit. If the field is unset, sets Unset to true and 1515c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen /// retunrs false. 1516c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen /// 1517c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen bool getValueAsBitOrUnset(StringRef FieldName, bool &Unset) const; 1518c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen 151958c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// getValueAsInt - This method looks up the specified field and returns its 152063f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman /// value as an int64_t, throwing an exception if the field does not exist or 152163f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman /// if the value is not the right type. 152258c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// 1523c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner int64_t getValueAsInt(StringRef FieldName) const; 1524784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner 1525784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// getValueAsDag - This method looks up the specified field and returns its 1526784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// value as an Dag, throwing an exception if the field does not exist or if 1527784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// the value is not the right type. 1528784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// 152905bce0beee87512e52428d4b80f5a8e79a949576David Greene DagInit *getValueAsDag(StringRef FieldName) const; 1530e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1531e62c1185bee05facc25d1d725434f517261d308bChris Lattner 15321a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const Record &R); 1533e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1534c7cafcd815519b06318629b424abe746437e1389David Greenestruct MultiClass { 1535c7cafcd815519b06318629b424abe746437e1389David Greene Record Rec; // Placeholder for template args and Name. 1536c7cafcd815519b06318629b424abe746437e1389David Greene typedef std::vector<Record*> RecordVector; 1537c7cafcd815519b06318629b424abe746437e1389David Greene RecordVector DefPrototypes; 1538d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 1539d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene void dump() const; 1540d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 15414b18691c3580674691875ec37c84a1c4edf2d586Jim Grosbach MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) : 154267db883487fca3472fdde51e931657e22d4d0495Chris Lattner Rec(Name, Loc, Records) {} 1543c7cafcd815519b06318629b424abe746437e1389David Greene}; 1544c7cafcd815519b06318629b424abe746437e1389David Greene 1545e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordKeeper { 1546e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*> Classes, Defs; 1547cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 1548e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1549e62c1185bee05facc25d1d725434f517261d308bChris Lattner ~RecordKeeper() { 1550e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (std::map<std::string, Record*>::iterator I = Classes.begin(), 1551ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen E = Classes.end(); I != E; ++I) 1552e62c1185bee05facc25d1d725434f517261d308bChris Lattner delete I->second; 1553e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (std::map<std::string, Record*>::iterator I = Defs.begin(), 1554ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen E = Defs.end(); I != E; ++I) 1555e62c1185bee05facc25d1d725434f517261d308bChris Lattner delete I->second; 1556e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 15573da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 1558e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::map<std::string, Record*> &getClasses() const { return Classes; } 1559e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::map<std::string, Record*> &getDefs() const { return Defs; } 1560e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1561e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getClass(const std::string &Name) const { 1562e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*>::const_iterator I = Classes.find(Name); 1563e62c1185bee05facc25d1d725434f517261d308bChris Lattner return I == Classes.end() ? 0 : I->second; 1564e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1565e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getDef(const std::string &Name) const { 1566e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*>::const_iterator I = Defs.find(Name); 1567e62c1185bee05facc25d1d725434f517261d308bChris Lattner return I == Defs.end() ? 0 : I->second; 1568e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1569e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addClass(Record *R) { 157072cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen bool Ins = Classes.insert(std::make_pair(R->getName(), R)).second; 157172cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen (void)Ins; 157272cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen assert(Ins && "Class already exists"); 1573e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1574e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addDef(Record *R) { 157572cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen bool Ins = Defs.insert(std::make_pair(R->getName(), R)).second; 157672cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen (void)Ins; 157772cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen assert(Ins && "Record already exists"); 1578e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1579e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1580936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// removeClass - Remove, but do not delete, the specified record. 1581936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// 1582936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void removeClass(const std::string &Name) { 1583936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner assert(Classes.count(Name) && "Class does not exist!"); 1584936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner Classes.erase(Name); 1585936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner } 1586936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// removeDef - Remove, but do not delete, the specified record. 1587936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// 1588936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void removeDef(const std::string &Name) { 1589936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner assert(Defs.count(Name) && "Def does not exist!"); 1590936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner Defs.erase(Name); 1591936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner } 159221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1593ab47ae3381aa2372009a9054260461c20324b555Chris Lattner //===--------------------------------------------------------------------===// 1594ab47ae3381aa2372009a9054260461c20324b555Chris Lattner // High-level helper methods, useful for tablegen backends... 1595ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 1596ab47ae3381aa2372009a9054260461c20324b555Chris Lattner /// getAllDerivedDefinitions - This method returns all concrete definitions 1597ab47ae3381aa2372009a9054260461c20324b555Chris Lattner /// that derive from the specified class name. If a class with the specified 15985c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// name does not exist, an exception is thrown. 15995c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner std::vector<Record*> 16005c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner getAllDerivedDefinitions(const std::string &ClassName) const; 1601ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 1602e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 1603e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1604e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1605690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// LessRecord - Sorting predicate to sort record pointers by name. 1606690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// 1607690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecord { 1608690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner bool operator()(const Record *Rec1, const Record *Rec2) const { 1609160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0; 1610690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner } 1611690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner}; 1612690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner 161321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// LessRecordFieldName - Sorting predicate to sort record pointers by their 16147c9a7728d9dd248ebee8f2dd969d303711d487a9Jim Grosbach/// name field. 1615690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// 1616690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecordFieldName { 1617690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner bool operator()(const Record *Rec1, const Record *Rec2) const { 1618690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name"); 1619690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner } 1620690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner}; 1621690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner 16221a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK); 1623e62c1185bee05facc25d1d725434f517261d308bChris Lattner 162430c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring 162530c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name. 162630c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass, 162730c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene Init *Name, const std::string &Scoper); 162830c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 162930c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring 163030c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name. 163130c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass, 163230c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene const std::string &Name, const std::string &Scoper); 163330c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 1634d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 1635d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 1636e62c1185bee05facc25d1d725434f517261d308bChris Lattner#endif 1637