Record.h revision 0abdadbce7e04af76145154d75ca41dab749b8d6
17c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne//===- llvm/TableGen/Record.h - Classes for Table Records -------*- C++ -*-===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//                     The LLVM Compiler Infrastructure
401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details.
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===//
9e62c1185bee05facc25d1d725434f517261d308bChris Lattner//
1014d7c59491347a2f8f29e120fd75a4cad42f68e7Chris Lattner// This file defines the main TableGen data structures, including the TableGen
1114d7c59491347a2f8f29e120fd75a4cad42f68e7Chris Lattner// types, values, and high-level data structures.
12e62c1185bee05facc25d1d725434f517261d308bChris Lattner//
13e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
14e62c1185bee05facc25d1d725434f517261d308bChris Lattner
157c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#ifndef LLVM_TABLEGEN_RECORD_H
167c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#define LLVM_TABLEGEN_RECORD_H
17e62c1185bee05facc25d1d725434f517261d308bChris Lattner
18c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene#include "llvm/ADT/ArrayRef.h"
19726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene#include "llvm/ADT/FoldingSet.h"
20dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene#include "llvm/Support/Allocator.h"
21099e198ae84c1a6cfe2a7c79ee9f47fa67caac8fChris Lattner#include "llvm/Support/SourceMgr.h"
223cc52ea33c0b96d1682f14fc45c45b57df0f39b6Michael J. Spencer#include "llvm/Support/DataTypes.h"
231a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar#include "llvm/Support/raw_ostream.h"
24e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include <map>
25028936ada14335bb04f377d46a6261dc4c66dafdJohn Criswell
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
271a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarclass raw_ostream;
2821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
297dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// RecTy subclasses.
307cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitRecTy;
317cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitsRecTy;
327cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass IntRecTy;
337cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass StringRecTy;
347cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass ListRecTy;
357cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass CodeRecTy;
3640f71134b9fef0ca06c516f033cc9403394a913cChris Lattnerclass DagRecTy;
377cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass RecordRecTy;
387cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
397dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// Init subclasses.
40afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init;
41e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass UnsetInit;
42e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit;
43e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsInit;
44e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass IntInit;
45e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass StringInit;
46e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattnerclass CodeInit;
47e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListInit;
48e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit;
49711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattnerclass BinOpInit;
504afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit;
51e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass DefInit;
528e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattnerclass DagInit;
53b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass TypedInit;
54b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarInit;
55a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattnerclass FieldInit;
56b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarBitInit;
571dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit;
587cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
597dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// Other classes.
60e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass Record;
617dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattnerclass RecordVal;
62293b13350c2fbae8a64b0b0beb440cb859968c8cBob Wilsonstruct MultiClass;
6367db883487fca3472fdde51e931657e22d4d0495Chris Lattnerclass RecordKeeper;
64e62c1185bee05facc25d1d725434f517261d308bChris Lattner
65e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
66e62c1185bee05facc25d1d725434f517261d308bChris Lattner//  Type Classes
67e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
68e62c1185bee05facc25d1d725434f517261d308bChris Lattner
6977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenclass RecTy {
7077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  ListRecTy *ListTy;
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(  CodeInit *CI) { return 0; }
10305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
10405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
10505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
10605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI) { return 0; }
10705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) {
10805bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)VI);
109b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner  }
11005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) {
11105bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)FI);
112b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner  }
113e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1147cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerpublic:   // These methods should only be called by subclasses of RecTy.
1157cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  // baseClassOf - These virtual methods should be overloaded to return true iff
1167cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  // all values of type 'RHS' can be converted to the 'this' type.
1177cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
1187cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
1197cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
1207cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
1217cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
1227cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
12340f71134b9fef0ca06c516f033cc9403394a913cChris Lattner  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
1247cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
125e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
126e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1271a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecTy &Ty) {
128e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Ty.print(OS);
129e62c1185bee05facc25d1d725434f517261d308bChris Lattner  return OS;
130e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
131e62c1185bee05facc25d1d725434f517261d308bChris Lattner
13207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
13307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitRecTy - 'bit' - Represent a single bit
13407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
1351fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass BitRecTy : public RecTy {
13677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static BitRecTy Shared;
13777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  BitRecTy() {}
1381fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
13977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static BitRecTy *get() { return &Shared; }
14077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
14105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
14205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return (Init*)BI; }
14305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI);
14405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II);
14505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
14605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
14705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  CodeInit *CI) { return 0; }
14805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return (Init*)VB; }
14905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
15005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
15105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
15205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
15305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
15405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
15505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
15605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
157e62c1185bee05facc25d1d725434f517261d308bChris Lattner
15899ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const { return "bit"; }
1597cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
1607cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
1617cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
1627cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
163ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return true; }
164ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const;
165ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
166ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
167ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
168ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
169ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
170ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
171ead87b671278379f92890fddd859a301bb68f462Reid Spencer
172e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
173e62c1185bee05facc25d1d725434f517261d308bChris Lattner
17407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
175234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// BitsRecTy - 'bits<n>' - Represent a fixed number of bits
176234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// BitsRecTy - 'bits&lt;n&gt;' - Represent a fixed number of bits
17707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
178e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsRecTy : public RecTy {
179e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned Size;
1801002c0203450620594a85454c6a095ca94b87cb2Dan Gohman  explicit BitsRecTy(unsigned Sz) : Size(Sz) {}
18177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
18277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static BitsRecTy *get(unsigned Sz);
183e62c1185bee05facc25d1d725434f517261d308bChris Lattner
184e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getNumBits() const { return Size; }
185e62c1185bee05facc25d1d725434f517261d308bChris Lattner
18605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI);
18705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *UI);
18805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI);
18905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II);
19005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
19105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
19205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  CodeInit *CI) { return 0; }
19305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
19405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
19505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
19605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
19705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
19805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
19905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
20005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
20105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
202ead87b671278379f92890fddd859a301bb68f462Reid Spencer
20399ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const;
2047cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
2057cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
2067cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
2077cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
208ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return Size == 1; }
209ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const {
2107cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->Size == Size;
2117cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
212ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
213ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
214ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
215ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
216ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
217ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
218ead87b671278379f92890fddd859a301bb68f462Reid Spencer
219e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
220e62c1185bee05facc25d1d725434f517261d308bChris Lattner
22107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
22207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntRecTy - 'int' - Represent an integer value of no particular size
22307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
2241fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass IntRecTy : public RecTy {
22577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static IntRecTy Shared;
22677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  IntRecTy() {}
2271fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
22877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static IntRecTy *get() { return &Shared; }
22977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
23005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
23105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI);
23205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI);
23305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return (Init*)II; }
23405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
23505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
23605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  CodeInit *CI) { return 0; }
23705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
23805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
23905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
24005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
24105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
24205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
24305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
24405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
24505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
246ead87b671278379f92890fddd859a301bb68f462Reid Spencer
24799ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const { return "int"; }
2487cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
2497cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
2507cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
2517cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
2527cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
253ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return true; }
254ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return true; }
255ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
256ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
257ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
258ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
259ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
260ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
261ead87b671278379f92890fddd859a301bb68f462Reid Spencer
262e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
263e62c1185bee05facc25d1d725434f517261d308bChris Lattner
26407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringRecTy - 'string' - Represent an string value
26507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
2661fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass StringRecTy : public RecTy {
26777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static StringRecTy Shared;
26877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  StringRecTy() {}
2691fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
27077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static StringRecTy *get() { return &Shared; }
27177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
27205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
27305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
27405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
27505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
27605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return (Init*)SI; }
27705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
27805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *BO);
27905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *BO);
28005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
28105bce0beee87512e52428d4b80f5a8e79a949576David Greene
28205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  CodeInit *CI) { return 0; }
28305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
28405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
28505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
28605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
28705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
28805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
289ead87b671278379f92890fddd859a301bb68f462Reid Spencer
29099ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const { return "string"; }
2917cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
2927cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
2937cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
2947cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
2957cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
296ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
297ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
298ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
2997cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const StringRecTy *RHS) const { return true; }
300ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
301ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
302ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
303ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
304e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
305e62c1185bee05facc25d1d725434f517261d308bChris Lattner
306234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of
307234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// the specified type.
308234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// ListRecTy - 'list&lt;Ty&gt;' - Represent a list of values, all of which must
309234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// be of the specified type.
31007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
311e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListRecTy : public RecTy {
3127cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  RecTy *Ty;
3131002c0203450620594a85454c6a095ca94b87cb2Dan Gohman  explicit ListRecTy(RecTy *T) : Ty(T) {}
31477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  friend ListRecTy *RecTy::getListTy();
31577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
31677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static ListRecTy *get(RecTy *T) { return T->getListTy(); }
3177cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  RecTy *getElementType() const { return Ty; }
318f1b36f9a71eb267f04b7bd3a32aca9bc69f71e97Chris Lattner
31905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
32005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
32105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
32205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
32305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
32405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI);
32505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  CodeInit *CI) { return 0; }
32605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
32705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
32805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
32905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
33005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
33105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
33205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
33305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
33405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
3353da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
33699ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const;
3377cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
3387cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
3397cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
3407cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
3417cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
342ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
343ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
344ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
345ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
346ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const {
3473da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman    return RHS->getElementType()->typeIsConvertibleTo(Ty);
3487cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
349ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
350ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
351ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
352e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
353e62c1185bee05facc25d1d725434f517261d308bChris Lattner
354f05760de76b4ec26474da18c97770ca369972cfdChris Lattner/// CodeRecTy - 'code' - Represent an code fragment, function or method.
355f05760de76b4ec26474da18c97770ca369972cfdChris Lattner///
3561fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass CodeRecTy : public RecTy {
35777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static CodeRecTy Shared;
35877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  CodeRecTy() {}
3591fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
36077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static CodeRecTy *get() { return &Shared; }
36177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
36205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
36305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
36405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
36505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
36605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
36705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
36805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  CodeInit *CI) { return (Init*)CI; }
36905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
37005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
37105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
37205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
37305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
37405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
37505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
37605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
37705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
378ead87b671278379f92890fddd859a301bb68f462Reid Spencer
37999ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const { return "code"; }
3807cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
3817cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
3827cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
3837cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
384ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
385ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
386ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
387ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
388ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
389ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const CodeRecTy   *RHS) const { return true; }
390ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
391ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
392f05760de76b4ec26474da18c97770ca369972cfdChris Lattner};
393f05760de76b4ec26474da18c97770ca369972cfdChris Lattner
39440f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/// DagRecTy - 'dag' - Represent a dag fragment
39540f71134b9fef0ca06c516f033cc9403394a913cChris Lattner///
3961fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass DagRecTy : public RecTy {
39777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static DagRecTy Shared;
39877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DagRecTy() {}
3991fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
40077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static DagRecTy *get() { return &Shared; }
40177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
40205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
40305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
40405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
40505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
40605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
40705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
40805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  CodeInit *CI) { return 0; }
40905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
41005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
41105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *BO);
41205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *BO);
41305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
41405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *CI) { return (Init*)CI; }
41505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
41605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
41705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
41840f71134b9fef0ca06c516f033cc9403394a913cChris Lattner
41999ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const { return "dag"; }
42040f71134b9fef0ca06c516f033cc9403394a913cChris Lattner
42140f71134b9fef0ca06c516f033cc9403394a913cChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
42240f71134b9fef0ca06c516f033cc9403394a913cChris Lattner    return RHS->baseClassOf(this);
42340f71134b9fef0ca06c516f033cc9403394a913cChris Lattner  }
424ead87b671278379f92890fddd859a301bb68f462Reid Spencer
425ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
426ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
427ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
428ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
429ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
430ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
431ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return true; }
432ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
43340f71134b9fef0ca06c516f033cc9403394a913cChris Lattner};
43440f71134b9fef0ca06c516f033cc9403394a913cChris Lattner
435f05760de76b4ec26474da18c97770ca369972cfdChris Lattner
436234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// RecordRecTy - '[classname]' - Represent an instance of a class, such as:
43707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// (R32 X = EAX).
43807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
439e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordRecTy : public RecTy {
440e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *Rec;
4411002c0203450620594a85454c6a095ca94b87cb2Dan Gohman  explicit RecordRecTy(Record *R) : Rec(R) {}
44277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  friend class Record;
44377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
44477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static RecordRecTy *get(Record *R);
445e62c1185bee05facc25d1d725434f517261d308bChris Lattner
446a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  Record *getRecord() const { return Rec; }
447a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
44805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
44905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
45005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
45105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
45205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
45305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
45405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  CodeInit *CI) { return 0; }
45505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
45605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
45705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
45805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
45905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI);
46005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
46105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *VI);
46205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
46305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
464e62c1185bee05facc25d1d725434f517261d308bChris Lattner
46599ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const;
4667cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
4677cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
4687cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
4697cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
470ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
471ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
472ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
473ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
474ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
475ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
476ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
4777cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const RecordRecTy *RHS) const;
478e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
479e62c1185bee05facc25d1d725434f517261d308bChris Lattner
48021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// resolveTypes - Find a common type that T1 and T2 convert to.
481e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene/// Return 0 if no such type exists.
482e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene///
483e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid GreeneRecTy *resolveTypes(RecTy *T1, RecTy *T2);
48407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
485e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
486e62c1185bee05facc25d1d725434f517261d308bChris Lattner//  Initializer Classes
487e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
488e62c1185bee05facc25d1d725434f517261d308bChris Lattner
489afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init {
490dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  Init(const Init &);  // Do not define.
491dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  Init &operator=(const Init &);  // Do not define.
492dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
493dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected:
494dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  Init(void) {}
495dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
496afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greenepublic:
497e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual ~Init() {}
498e62c1185bee05facc25d1d725434f517261d308bChris Lattner
499f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// isComplete - This virtual method should be overridden by values that may
500f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// not be completely specified yet.
501f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  virtual bool isComplete() const { return true; }
502f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner
503f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// print - Print out this value.
5041a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  void print(raw_ostream &OS) const { OS << getAsString(); }
5053aba4d39fd101238ac06871895c28f26736d80cbChris Lattner
5063aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  /// getAsString - Convert this value to a string form.
5073aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const = 0;
5080b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// getAsUnquotedString - Convert this value to a string form,
5090b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// without adding quote markers.  This primaruly affects
5100b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// StringInits where we will not surround the string value with
5110b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// quotes.
5120b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  virtual std::string getAsUnquotedString() const { return getAsString(); }
513f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner
514f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// dump - Debugging method that may be called through a debugger, just
5151a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  /// invokes print on stderr.
516e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
517e62c1185bee05facc25d1d725434f517261d308bChris Lattner
518f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// convertInitializerTo - This virtual function is a simple call-back
519f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// function that should be overridden to call the appropriate
520f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// RecTy::convertValue method.
521f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  ///
52205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const = 0;
523f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner
524f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// convertInitializerBitRange - This method is used to implement the bitrange
525f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// selection operator.  Given an initializer, it selects the specified bits
5267331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner  /// out, returning them as a new init of bits type.  If it is not legal to use
5277331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner  /// the bit subscript operator on this initializer, return null.
528f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  ///
52905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
530f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const {
531e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return 0;
532e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
533e62c1185bee05facc25d1d725434f517261d308bChris Lattner
534b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// convertInitListSlice - This method is used to implement the list slice
535b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// selection operator.  Given an initializer, it selects the specified list
536b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// elements, returning them as a new init of list type.  If it is not legal
537b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// to take a slice of this, return null.
538b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  ///
53905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
540f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitListSlice(const std::vector<unsigned> &Elements) const {
541b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner    return 0;
542b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  }
543b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner
544a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  /// getFieldType - This method is used to implement the FieldInit class.
545a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  /// Implementors of this method should return the type of the named field if
546a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  /// they are of record type.
547a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  ///
548a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  virtual RecTy *getFieldType(const std::string &FieldName) const { return 0; }
549a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
550b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  /// getFieldInit - This method complements getFieldType to return the
551b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  /// initializer for the specified field.  If getFieldType returns non-null
552b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  /// this method should return non-null, otherwise it returns null.
553b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  ///
55405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getFieldInit(Record &R, const RecordVal *RV,
55505bce0beee87512e52428d4b80f5a8e79a949576David Greene                             const std::string &FieldName) const {
556b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner    return 0;
557b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  }
5583da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
559f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// resolveReferences - This method is used by classes that refer to other
560a8449e6aaa6f494d85e75d4755f9c47abf1e06ceBob Wilson  /// variables which may not be defined at the time the expression is formed.
561f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// If a value is set for the variable later, this method will be called on
562f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// users of the value to allow the value to propagate out.
563f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  ///
56405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const {
56505bce0beee87512e52428d4b80f5a8e79a949576David Greene    return const_cast<Init *>(this);
5667dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  }
567e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
568e62c1185bee05facc25d1d725434f517261d308bChris Lattner
5691a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const Init &I) {
570e62c1185bee05facc25d1d725434f517261d308bChris Lattner  I.print(OS); return OS;
571e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
572e62c1185bee05facc25d1d725434f517261d308bChris Lattner
573beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// TypedInit - This is the common super-class of types that have a specific,
574beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// explicit, type.
575beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene///
576beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass TypedInit : public Init {
577beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  RecTy *Ty;
578dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
579dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  TypedInit(const TypedInit &Other);  // Do not define.
580dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  TypedInit &operator=(const TypedInit &Other);  // Do not define.
581dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
582dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected:
583d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit TypedInit(RecTy *T) : Ty(T) {}
584d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher
585dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
586beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  RecTy *getType() const { return Ty; }
587beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
58805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
589f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
59005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
591f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitListSlice(const std::vector<unsigned> &Elements) const;
592beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
5939703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  /// getFieldType - This method is used to implement the FieldInit class.
5949703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  /// Implementors of this method should return the type of the named field if
5959703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  /// they are of record type.
5969703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  ///
5979703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  virtual RecTy *getFieldType(const std::string &FieldName) const;
5989703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene
599beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveBitReference - This method is used to implement
600beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
601beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// simply return the resolved value, otherwise we return null.
602beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  ///
60305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
60405bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const = 0;
605beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
606beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveListElementReference - This method is used to implement
607beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
608beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// now, we return the resolved value, otherwise we return null.
60905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
61005bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const = 0;
611beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene};
612beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
61307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
61407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// UnsetInit - ? - Represents an uninitialized value
61507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
6161fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass UnsetInit : public Init {
617dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnsetInit() : Init() {}
618dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnsetInit(const UnsetInit &);  // Do not define.
619dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnsetInit &operator=(const UnsetInit &Other);  // Do not define.
620dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
6211fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
62205bce0beee87512e52428d4b80f5a8e79a949576David Greene  static UnsetInit *get();
623dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
62405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
62505bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<UnsetInit *>(this));
626e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
627e62c1185bee05facc25d1d725434f517261d308bChris Lattner
628e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual bool isComplete() const { return false; }
6293aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return "?"; }
630e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
631e62c1185bee05facc25d1d725434f517261d308bChris Lattner
63207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
63307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitInit - true/false - Represent a concrete initializer for a bit.
63407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
635e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit : public Init {
636e62c1185bee05facc25d1d725434f517261d308bChris Lattner  bool Value;
637dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
638d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit BitInit(bool V) : Value(V) {}
639dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BitInit(const BitInit &Other);  // Do not define.
640dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BitInit &operator=(BitInit &Other);  // Do not define.
641dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
642dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
64305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static BitInit *get(bool V);
644e62c1185bee05facc25d1d725434f517261d308bChris Lattner
645e62c1185bee05facc25d1d725434f517261d308bChris Lattner  bool getValue() const { return Value; }
646e62c1185bee05facc25d1d725434f517261d308bChris Lattner
64705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
64805bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<BitInit *>(this));
649e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
650e62c1185bee05facc25d1d725434f517261d308bChris Lattner
6513aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return Value ? "1" : "0"; }
652e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
653e62c1185bee05facc25d1d725434f517261d308bChris Lattner
65407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value.
65507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// It contains a vector of bits, whose size is determined by the type.
65607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
657726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greeneclass BitsInit : public Init, public FoldingSetNode {
65805bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<Init*> Bits;
659dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
66005bce0beee87512e52428d4b80f5a8e79a949576David Greene  BitsInit(ArrayRef<Init *> Range) : Bits(Range.begin(), Range.end()) {}
661e62c1185bee05facc25d1d725434f517261d308bChris Lattner
662dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BitsInit(const BitsInit &Other);  // Do not define.
663dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BitsInit &operator=(const BitsInit &Other);  // Do not define.
664dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
665dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
66605bce0beee87512e52428d4b80f5a8e79a949576David Greene  static BitsInit *get(ArrayRef<Init *> Range);
667dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
668726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene  void Profile(FoldingSetNodeID &ID) const;
669726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene
670e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getNumBits() const { return Bits.size(); }
671e62c1185bee05facc25d1d725434f517261d308bChris Lattner
67205bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getBit(unsigned Bit) const {
673e62c1185bee05facc25d1d725434f517261d308bChris Lattner    assert(Bit < Bits.size() && "Bit index out of range!");
674e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return Bits[Bit];
675e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
676e62c1185bee05facc25d1d725434f517261d308bChris Lattner
67705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
67805bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<BitsInit *>(this));
679e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
68005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
681f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
682e62c1185bee05facc25d1d725434f517261d308bChris Lattner
683e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual bool isComplete() const {
684e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0; i != getNumBits(); ++i)
685e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (!getBit(i)->isComplete()) return false;
686e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return true;
687e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
6881808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen  bool allInComplete() const {
6891808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen    for (unsigned i = 0; i != getNumBits(); ++i)
6901808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen      if (getBit(i)->isComplete()) return false;
6911808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen    return true;
6921808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen  }
6933aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
694e62c1185bee05facc25d1d725434f517261d308bChris Lattner
69505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
696e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
697e62c1185bee05facc25d1d725434f517261d308bChris Lattner
69807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
69907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntInit - 7 - Represent an initalization by a literal integer value.
70007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
701e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greeneclass IntInit : public TypedInit {
70263f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t Value;
703dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
70477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  explicit IntInit(int64_t V) : TypedInit(IntRecTy::get()), Value(V) {}
705e62c1185bee05facc25d1d725434f517261d308bChris Lattner
706dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  IntInit(const IntInit &Other);  // Do not define.
707dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  IntInit &operator=(const IntInit &Other);  // Do note define.
708dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
709dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
71005bce0beee87512e52428d4b80f5a8e79a949576David Greene  static IntInit *get(int64_t V);
711dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
71263f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t getValue() const { return Value; }
713e62c1185bee05facc25d1d725434f517261d308bChris Lattner
71405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
71505bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<IntInit *>(this));
716e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
71705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
718f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
719e62c1185bee05facc25d1d725434f517261d308bChris Lattner
7203aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
721e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene
722e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// resolveBitReference - This method is used to implement
723e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
724e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// simply return the resolved value, otherwise we return null.
725e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  ///
72605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
72705bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const {
728e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene    assert(0 && "Illegal bit reference off int");
729e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene    return 0;
730e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  }
731e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene
732e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// resolveListElementReference - This method is used to implement
733e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
734e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// now, we return the resolved value, otherwise we return null.
73505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
73605bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
737e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene    assert(0 && "Illegal element reference off int");
738e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene    return 0;
739e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  }
740e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
741e62c1185bee05facc25d1d725434f517261d308bChris Lattner
74207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
74307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringInit - "foo" - Represent an initialization by a string value.
74407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
745beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass StringInit : public TypedInit {
746e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::string Value;
747dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
748d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit StringInit(const std::string &V)
74977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen    : TypedInit(StringRecTy::get()), Value(V) {}
750e62c1185bee05facc25d1d725434f517261d308bChris Lattner
751dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  StringInit(const StringInit &Other);  // Do not define.
752dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  StringInit &operator=(const StringInit &Other);  // Do not define.
753dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
754dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
75505bce0beee87512e52428d4b80f5a8e79a949576David Greene  static StringInit *get(const std::string &V);
756dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
7575c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  const std::string &getValue() const { return Value; }
7585c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
75905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
76005bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<StringInit *>(this));
761e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
762e62c1185bee05facc25d1d725434f517261d308bChris Lattner
7633aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return "\"" + Value + "\""; }
7640b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  virtual std::string getAsUnquotedString() const { return Value; }
765beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
766beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveBitReference - This method is used to implement
767beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
768beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// simply return the resolved value, otherwise we return null.
769beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  ///
77005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
77105bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const {
772beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    assert(0 && "Illegal bit reference off string");
773beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    return 0;
774beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
775beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
776beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveListElementReference - This method is used to implement
777beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
778beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// now, we return the resolved value, otherwise we return null.
77905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
78005bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
781beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    assert(0 && "Illegal element reference off string");
782beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    return 0;
783beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
784e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
785e62c1185bee05facc25d1d725434f517261d308bChris Lattner
786e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner/// CodeInit - "[{...}]" - Represent a code fragment.
787e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner///
788e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattnerclass CodeInit : public Init {
789e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner  std::string Value;
790dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
791d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit CodeInit(const std::string &V) : Value(V) {}
792e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner
793dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  CodeInit(const CodeInit &Other);  // Do not define.
794dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  CodeInit &operator=(const CodeInit &Other);  // Do not define.
795dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
796dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
79705bce0beee87512e52428d4b80f5a8e79a949576David Greene  static CodeInit *get(const std::string &V);
798dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
7997ed1391ff66012e4963081cfb20b6166e8784f50Chris Lattner  const std::string &getValue() const { return Value; }
800c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner
80105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
80205bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<CodeInit *>(this));
803e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner  }
804e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner
8053aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return "[{" + Value + "}]"; }
806e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner};
807e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner
80807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// ListInit - [AL, AH, CL] - Represent a list of defs
80907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
810aad4c9fc37b38cae21343173084c81d789535446David Greeneclass ListInit : public TypedInit, public FoldingSetNode {
81105bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<Init*> Values;
812e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
81305bce0beee87512e52428d4b80f5a8e79a949576David Greene  typedef std::vector<Init*>::const_iterator const_iterator;
8145f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene
815aad4c9fc37b38cae21343173084c81d789535446David Greeneprivate:
81605bce0beee87512e52428d4b80f5a8e79a949576David Greene  explicit ListInit(ArrayRef<Init *> Range, RecTy *EltTy)
81760c04af7879c3eda957162737783de726dd177b6David Greene      : TypedInit(ListRecTy::get(EltTy)), Values(Range.begin(), Range.end()) {}
818e62c1185bee05facc25d1d725434f517261d308bChris Lattner
819dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  ListInit(const ListInit &Other);  // Do not define.
820dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  ListInit &operator=(const ListInit &Other);  // Do not define.
821dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
822dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
82305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static ListInit *get(ArrayRef<Init *> Range, RecTy *EltTy);
824dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
825aad4c9fc37b38cae21343173084c81d789535446David Greene  void Profile(FoldingSetNodeID &ID) const;
826aad4c9fc37b38cae21343173084c81d789535446David Greene
8277cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  unsigned getSize() const { return Values.size(); }
82805bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getElement(unsigned i) const {
8297cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    assert(i < Values.size() && "List element index out of range!");
8307cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return Values[i];
831e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
832e62c1185bee05facc25d1d725434f517261d308bChris Lattner
83350d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner  Record *getElementAsRecord(unsigned i) const;
83421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
83505bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *convertInitListSlice(const std::vector<unsigned> &Elements) const;
836b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner
83705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
83805bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<ListInit *>(this));
839e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
840e62c1185bee05facc25d1d725434f517261d308bChris Lattner
8411dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// resolveReferences - This method is used by classes that refer to other
8421dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// variables which may not be defined at the time they expression is formed.
8431dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// If a value is set for the variable later, this method will be called on
8441dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// users of the value to allow the value to propagate out.
8451dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  ///
84605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
8471dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
8483aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
84982137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov
85005bce0beee87512e52428d4b80f5a8e79a949576David Greene  ArrayRef<Init*> getValues() const { return Values; }
851c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene
85282137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline const_iterator begin() const { return Values.begin(); }
85382137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline const_iterator end  () const { return Values.end();   }
85482137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov
85582137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline size_t         size () const { return Values.size();  }
85682137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline bool           empty() const { return Values.empty(); }
857e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene
858e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// resolveBitReference - This method is used to implement
859e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
860e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// simply return the resolved value, otherwise we return null.
861e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  ///
86205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
86305bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const {
864e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene    assert(0 && "Illegal bit reference off list");
865e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene    return 0;
866e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  }
867e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene
868e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// resolveListElementReference - This method is used to implement
869e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
870e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// now, we return the resolved value, otherwise we return null.
87105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
87205bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
873e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
874e62c1185bee05facc25d1d725434f517261d308bChris Lattner
8757331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner
876d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// OpInit - Base class for operators
877d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene///
878d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass OpInit : public TypedInit {
879dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  OpInit(const OpInit &Other);  // Do not define.
880dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  OpInit &operator=(OpInit &Other);  // Do not define.
881d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher
882dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected:
883dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  explicit OpInit(RecTy *Type) : TypedInit(Type) {}
884dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
885dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
886d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // Clone - Clone this operator, replacing arguments with the new list
88705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const = 0;
888d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
889a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  virtual int getNumOperands() const = 0;
89005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getOperand(int i) const = 0;
891d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
892d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
893d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // possible to fold.
89405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const = 0;
895d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
89605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
89705bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<OpInit *>(this));
898d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  }
89921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
90005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
90105bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const;
90205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
90305bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
904d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene};
905d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
906d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
907d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// UnOpInit - !op (X) - Transform an init.
908d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene///
909e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit : public OpInit {
910e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic:
9111434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene  enum UnaryOp { CAST, HEAD, TAIL, EMPTY };
912e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneprivate:
913e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  UnaryOp Opc;
91405bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *LHS;
915dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
91605bce0beee87512e52428d4b80f5a8e79a949576David Greene  UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type)
917dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      : OpInit(Type), Opc(opc), LHS(lhs) {}
918dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
919dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnOpInit(const UnOpInit &Other);  // Do not define.
920dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnOpInit &operator=(const UnOpInit &Other);  // Do not define.
921dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
922e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic:
92305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type);
924d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
925e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  // Clone - Clone this operator, replacing arguments with the new list
92605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const {
927aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert(Operands.size() == 1 &&
928aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Wrong number of operands for unary operation");
929dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene    return UnOpInit::get(getOpcode(), *Operands.begin(), getType());
930e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  }
931d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
932a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  int getNumOperands() const { return 1; }
93305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperand(int i) const {
934e6c27de069225e1122c78385ad22a2ff656db8e6David Greene    assert(i == 0 && "Invalid operand id for unary operator");
935e6c27de069225e1122c78385ad22a2ff656db8e6David Greene    return getOperand();
936e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  }
93721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
938e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  UnaryOp getOpcode() const { return Opc; }
93905bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperand() const { return LHS; }
940d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
941e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
942e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  // possible to fold.
94305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
944d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
94505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
94621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
947e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  virtual std::string getAsString() const;
948e6c27de069225e1122c78385ad22a2ff656db8e6David Greene};
949e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
950e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// BinOpInit - !op (X, Y) - Combine two inits.
951e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene///
952d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass BinOpInit : public OpInit {
953e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greenepublic:
954c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner  enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, EQ };
955e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greeneprivate:
956e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  BinaryOp Opc;
95705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *LHS, *RHS;
958dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
95905bce0beee87512e52428d4b80f5a8e79a949576David Greene  BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) :
960dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      OpInit(Type), Opc(opc), LHS(lhs), RHS(rhs) {}
961dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
962dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BinOpInit(const BinOpInit &Other);  // Do not define.
963dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BinOpInit &operator=(const BinOpInit &Other);  // Do not define.
964dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
965dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
96605bce0beee87512e52428d4b80f5a8e79a949576David Greene  static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs,
96705bce0beee87512e52428d4b80f5a8e79a949576David Greene                        RecTy *Type);
96821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
969d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // Clone - Clone this operator, replacing arguments with the new list
97005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const {
971aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert(Operands.size() == 2 &&
972aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Wrong number of operands for binary operation");
973dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene    return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType());
974d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  }
975d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
976a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  int getNumOperands() const { return 2; }
97705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperand(int i) const {
978aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert((i == 0 || i == 1) && "Invalid operand id for binary operator");
979d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene    if (i == 0) {
980d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene      return getLHS();
98121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson    } else {
982d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene      return getRHS();
983d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene    }
984d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  }
985d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
986e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  BinaryOp getOpcode() const { return Opc; }
98705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getLHS() const { return LHS; }
98805bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getRHS() const { return RHS; }
989e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
990e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
991e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  // possible to fold.
99205bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
993e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
99405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
99521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
996e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  virtual std::string getAsString() const;
997e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene};
998e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
999d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// TernOpInit - !op (X, Y, Z) - Combine two inits.
1000d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene///
10014afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit : public OpInit {
10024afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greenepublic:
1003ffc0ab6037aa45bc22f57433148e5f586843b3a7David Greene  enum TernaryOp { SUBST, FOREACH, IF };
10044afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneprivate:
10054afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  TernaryOp Opc;
100605bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *LHS, *MHS, *RHS;
1007dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
100805bce0beee87512e52428d4b80f5a8e79a949576David Greene  TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs,
1009f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene             RecTy *Type) :
1010dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      OpInit(Type), Opc(opc), LHS(lhs), MHS(mhs), RHS(rhs) {}
1011dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1012dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  TernOpInit(const TernOpInit &Other);  // Do not define.
1013dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  TernOpInit &operator=(const TernOpInit &Other);  // Do not define.
1014dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1015dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
101605bce0beee87512e52428d4b80f5a8e79a949576David Greene  static TernOpInit *get(TernaryOp opc, Init *lhs,
101705bce0beee87512e52428d4b80f5a8e79a949576David Greene                         Init *mhs, Init *rhs,
101805bce0beee87512e52428d4b80f5a8e79a949576David Greene                         RecTy *Type);
101921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
10204afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  // Clone - Clone this operator, replacing arguments with the new list
102105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const {
1022aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert(Operands.size() == 3 &&
1023aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Wrong number of operands for ternary operation");
1024dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene    return TernOpInit::get(getOpcode(), Operands[0], Operands[1], Operands[2],
1025dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene                           getType());
10264afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  }
10274afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene
1028a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  int getNumOperands() const { return 3; }
102905bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperand(int i) const {
1030aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert((i == 0 || i == 1 || i == 2) &&
1031aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Invalid operand id for ternary operator");
10324afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene    if (i == 0) {
10334afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene      return getLHS();
103421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson    } else if (i == 1) {
10354afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene      return getMHS();
103621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson    } else {
10374afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene      return getRHS();
10384afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene    }
10394afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  }
10404afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene
10414afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  TernaryOp getOpcode() const { return Opc; }
104205bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getLHS() const { return LHS; }
104305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getMHS() const { return MHS; }
104405bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getRHS() const { return RHS; }
10454afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene
10464afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
10474afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  // possible to fold.
104805bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
104921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1050548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling  virtual bool isComplete() const { return false; }
1051548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling
105205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
105321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
10544afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  virtual std::string getAsString() const;
10554afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene};
1056d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
1057e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
105807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// VarInit - 'Opcode' - Represent a reference to an entire variable object.
105907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
10607331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass VarInit : public TypedInit {
1061ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  Init *VarName;
1062dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1063d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit VarInit(const std::string &VN, RecTy *T)
1064ee6dca17252de152720655282fb4b74b76fb2fe9David Greene      : TypedInit(T), VarName(StringInit::get(VN)) {}
1065ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  explicit VarInit(Init *VN, RecTy *T)
1066dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      : TypedInit(T), VarName(VN) {}
1067dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1068dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarInit(const VarInit &Other);  // Do not define.
1069dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarInit &operator=(const VarInit &Other);  // Do not define.
1070dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1071dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
107205bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarInit *get(const std::string &VN, RecTy *T);
107305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarInit *get(Init *VN, RecTy *T);
10743da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
107505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
107605bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<VarInit *>(this));
1077e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1078e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1079ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  const std::string &getName() const;
1080ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  Init *getNameInit() const { return VarName; }
1081ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  std::string getNameInitAsString() const {
1082ee6dca17252de152720655282fb4b74b76fb2fe9David Greene    return getNameInit()->getAsUnquotedString();
1083ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  }
1084e62c1185bee05facc25d1d725434f517261d308bChris Lattner
108505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
108605bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const;
108705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
108805bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
10897331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner
1090a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  virtual RecTy *getFieldType(const std::string &FieldName) const;
109105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getFieldInit(Record &R, const RecordVal *RV,
109205bce0beee87512e52428d4b80f5a8e79a949576David Greene                             const std::string &FieldName) const;
10939b929aa7495ee0b5d389370baeb332456632b2feChris Lattner
10949b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// resolveReferences - This method is used by classes that refer to other
10959b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// variables which may not be defined at the time they expression is formed.
10969b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// If a value is set for the variable later, this method will be called on
10979b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// users of the value to allow the value to propagate out.
10989b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  ///
109905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
11003da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
1101ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  virtual std::string getAsString() const { return getName(); }
1102e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1103e62c1185bee05facc25d1d725434f517261d308bChris Lattner
110407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
11057331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner/// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field.
110607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
1107e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass VarBitInit : public Init {
110805bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *TI;
1109e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned Bit;
1110dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
111105bce0beee87512e52428d4b80f5a8e79a949576David Greene  VarBitInit(TypedInit *T, unsigned B) : TI(T), Bit(B) {
11127331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner    assert(T->getType() && dynamic_cast<BitsRecTy*>(T->getType()) &&
11137331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner           ((BitsRecTy*)T->getType())->getNumBits() > B &&
11147331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner           "Illegal VarBitInit expression!");
11157331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner  }
1116e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1117dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarBitInit(const VarBitInit &Other);  // Do not define.
1118dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarBitInit &operator=(const VarBitInit &Other);  // Do not define.
1119dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1120dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
112105bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarBitInit *get(TypedInit *T, unsigned B);
1122dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
112305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
112405bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<VarBitInit *>(this));
1125e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1126e62c1185bee05facc25d1d725434f517261d308bChris Lattner
112705bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *getVariable() const { return TI; }
1128e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getBitNum() const { return Bit; }
11293da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
11303aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
113105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1132e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1133e62c1185bee05facc25d1d725434f517261d308bChris Lattner
11343da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman/// VarListElementInit - List[4] - Represent access to one element of a var or
11351dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner/// field.
11361dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit : public TypedInit {
113705bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *TI;
11381dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  unsigned Element;
1139dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
114005bce0beee87512e52428d4b80f5a8e79a949576David Greene  VarListElementInit(TypedInit *T, unsigned E)
1141dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      : TypedInit(dynamic_cast<ListRecTy*>(T->getType())->getElementType()),
1142dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene          TI(T), Element(E) {
11431dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner    assert(T->getType() && dynamic_cast<ListRecTy*>(T->getType()) &&
11441dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner           "Illegal VarBitInit expression!");
11451dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  }
11461dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
1147dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarListElementInit(const VarListElementInit &Other);  // Do not define.
1148dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarListElementInit &operator=(const VarListElementInit &Other);  // Do
1149dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene                                                                   // not
1150dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene                                                                   // define.
1151dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1152dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
115305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarListElementInit *get(TypedInit *T, unsigned E);
1154dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
115505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
115605bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<VarListElementInit *>(this));
11571dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  }
11581dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
115905bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *getVariable() const { return TI; }
11601dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  unsigned getElementNum() const { return Element; }
11611dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
116205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
116305bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const;
11641dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
11651dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// resolveListElementReference - This method is used to implement
11661dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// VarListElementInit::resolveReferences.  If the list element is resolvable
11671dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// now, we return the resolved value, otherwise we return null.
116805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R,
116905bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            const RecordVal *RV,
117005bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
11711dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
11723aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
117305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
11741dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner};
117507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
117607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// DefInit - AL - Represent a reference to a 'def' in the description
117707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
1178beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass DefInit : public TypedInit {
1179e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *Def;
1180dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
118177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DefInit(Record *D, RecordRecTy *T) : TypedInit(T), Def(D) {}
118277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  friend class Record;
1183dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1184dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  DefInit(const DefInit &Other);  // Do not define.
1185dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  DefInit &operator=(const DefInit &Other);  // Do not define.
1186dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1187e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
118805bce0beee87512e52428d4b80f5a8e79a949576David Greene  static DefInit *get(Record*);
11893da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
119005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
119105bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<DefInit *>(this));
1192e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1193e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1194e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *getDef() const { return Def; }
1195e62c1185bee05facc25d1d725434f517261d308bChris Lattner
119605bce0beee87512e52428d4b80f5a8e79a949576David Greene  //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
1197b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner
1198b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  virtual RecTy *getFieldType(const std::string &FieldName) const;
119905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getFieldInit(Record &R, const RecordVal *RV,
120005bce0beee87512e52428d4b80f5a8e79a949576David Greene                             const std::string &FieldName) const;
12013da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
12023aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
1203beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
1204beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveBitReference - This method is used to implement
1205beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
1206beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// simply return the resolved value, otherwise we return null.
1207beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  ///
120805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
120905bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const {
1210beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    assert(0 && "Illegal bit reference off def");
1211beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    return 0;
1212beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
1213beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
1214beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveListElementReference - This method is used to implement
1215beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
1216beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// now, we return the resolved value, otherwise we return null.
121705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
121805bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
1219beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    assert(0 && "Illegal element reference off def");
1220beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    return 0;
1221beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
1222e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1223e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1224e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1225a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner/// FieldInit - X.Y - Represent a reference to a subfield of a variable
1226a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner///
12277331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass FieldInit : public TypedInit {
122805bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Rec;                // Record we are referring to
1229a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  std::string FieldName;    // Field we are accessing
1230dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
123105bce0beee87512e52428d4b80f5a8e79a949576David Greene  FieldInit(Init *R, const std::string &FN)
1232dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      : TypedInit(R->getFieldType(FN)), Rec(R), FieldName(FN) {
12337331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner    assert(getType() && "FieldInit with non-record type!");
1234a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  }
1235a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
1236dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  FieldInit(const FieldInit &Other);  // Do not define.
1237dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  FieldInit &operator=(const FieldInit &Other);  // Do not define.
1238dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1239dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
124005bce0beee87512e52428d4b80f5a8e79a949576David Greene  static FieldInit *get(Init *R, const std::string &FN);
124105bce0beee87512e52428d4b80f5a8e79a949576David Greene  static FieldInit *get(Init *R, const Init *FN);
1242dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
124305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
124405bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<FieldInit *>(this));
1245a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  }
1246a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
124705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
124805bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const;
124905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R,
125005bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            const RecordVal *RV,
125105bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
12527331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner
125305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
125424151a6888c752ff1d7fc80b500f5a836c9ac528Chris Lattner
12553aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const {
12563aba4d39fd101238ac06871895c28f26736d80cbChris Lattner    return Rec->getAsString() + "." + FieldName;
1257a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  }
1258a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner};
1259a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
12608c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// DagInit - (v a, b) - Represent a DAG tree value.  DAG inits are required
12618c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// to have at least one value then a (possibly empty) list of arguments.  Each
12628c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// argument can have a name associated with it.
12638e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner///
126478621a851ae84520de7d24a6d61e1dcf25749712David Greeneclass DagInit : public TypedInit, public FoldingSetNode {
126505bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Val;
12667cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman  std::string ValName;
126705bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<Init*> Args;
126891290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  std::vector<std::string> ArgNames;
1269dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
127005bce0beee87512e52428d4b80f5a8e79a949576David Greene  DagInit(Init *V, const std::string &VN,
127105bce0beee87512e52428d4b80f5a8e79a949576David Greene          ArrayRef<Init *> ArgRange,
127278621a851ae84520de7d24a6d61e1dcf25749712David Greene          ArrayRef<std::string> NameRange)
127378621a851ae84520de7d24a6d61e1dcf25749712David Greene      : TypedInit(DagRecTy::get()), Val(V), ValName(VN),
127478621a851ae84520de7d24a6d61e1dcf25749712David Greene          Args(ArgRange.begin(), ArgRange.end()),
127578621a851ae84520de7d24a6d61e1dcf25749712David Greene          ArgNames(NameRange.begin(), NameRange.end()) {}
127621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1277dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  DagInit(const DagInit &Other);  // Do not define.
1278dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  DagInit &operator=(const DagInit &Other);  // Do not define.
1279dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1280dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
128105bce0beee87512e52428d4b80f5a8e79a949576David Greene  static DagInit *get(Init *V, const std::string &VN,
128205bce0beee87512e52428d4b80f5a8e79a949576David Greene                      ArrayRef<Init *> ArgRange,
128305bce0beee87512e52428d4b80f5a8e79a949576David Greene                      ArrayRef<std::string> NameRange);
128405bce0beee87512e52428d4b80f5a8e79a949576David Greene  static DagInit *get(Init *V, const std::string &VN,
128505bce0beee87512e52428d4b80f5a8e79a949576David Greene                      const std::vector<
128605bce0beee87512e52428d4b80f5a8e79a949576David Greene                        std::pair<Init*, std::string> > &args);
1287dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
128878621a851ae84520de7d24a6d61e1dcf25749712David Greene  void Profile(FoldingSetNodeID &ID) const;
1289dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
129005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
129105bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<DagInit *>(this));
12928e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner  }
12938e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner
129405bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperator() const { return Val; }
129591290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner
12967cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman  const std::string &getName() const { return ValName; }
12977cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman
129891290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  unsigned getNumArgs() const { return Args.size(); }
129905bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getArg(unsigned Num) const {
130091290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    assert(Num < Args.size() && "Arg number out of range!");
130191290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    return Args[Num];
130291290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  }
130391290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  const std::string &getArgName(unsigned Num) const {
130491290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    assert(Num < ArgNames.size() && "Arg number out of range!");
130591290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    return ArgNames[Num];
130691290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  }
13078e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner
130805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1309990db46e9ae7faa742a152ca4126d0bee9f1df9cChris Lattner
13103aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
13117674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
131205bce0beee87512e52428d4b80f5a8e79a949576David Greene  typedef std::vector<Init*>::const_iterator       const_arg_iterator;
13137674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  typedef std::vector<std::string>::const_iterator const_name_iterator;
13147674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
13157674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_arg_iterator  arg_begin() const { return Args.begin(); }
13167674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_arg_iterator  arg_end  () const { return Args.end();   }
13177674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
13187674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline size_t              arg_size () const { return Args.size();  }
13197674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline bool                arg_empty() const { return Args.empty(); }
13207674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
13217674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_name_iterator name_begin() const { return ArgNames.begin(); }
13227674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_name_iterator name_end  () const { return ArgNames.end();   }
13237674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
13247674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline size_t              name_size () const { return ArgNames.size();  }
13257674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline bool                name_empty() const { return ArgNames.empty(); }
13267674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
132705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
132805bce0beee87512e52428d4b80f5a8e79a949576David Greene                                    unsigned Bit) const {
1329beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    assert(0 && "Illegal bit reference off dag");
1330beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    return 0;
1331beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
133221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
133305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
133405bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
1335beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    assert(0 && "Illegal element reference off dag");
1336beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene    return 0;
1337beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
13388e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner};
1339e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1340e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
1341e62c1185bee05facc25d1d725434f517261d308bChris Lattner//  High-Level Classes
1342e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
1343e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1344e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordVal {
1345011dca7fac07100695dd3685bfaddbea58a468b9David Greene  Init *Name;
1346e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RecTy *Ty;
1347e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned Prefix;
134805bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Value;
1349e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1350011dca7fac07100695dd3685bfaddbea58a468b9David Greene  RecordVal(Init *N, RecTy *T, unsigned P);
1351e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RecordVal(const std::string &N, RecTy *T, unsigned P);
1352e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1353011dca7fac07100695dd3685bfaddbea58a468b9David Greene  const std::string &getName() const;
1354de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene  const Init *getNameInit() const { return Name; }
1355de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene  std::string getNameInitAsString() const {
1356de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene    return getNameInit()->getAsUnquotedString();
1357de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene  }
1358e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1359e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getPrefix() const { return Prefix; }
1360e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RecTy *getType() const { return Ty; }
136105bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getValue() const { return Value; }
1362e62c1185bee05facc25d1d725434f517261d308bChris Lattner
136305bce0beee87512e52428d4b80f5a8e79a949576David Greene  bool setValue(Init *V) {
1364e62c1185bee05facc25d1d725434f517261d308bChris Lattner    if (V) {
1365e62c1185bee05facc25d1d725434f517261d308bChris Lattner      Value = V->convertInitializerTo(Ty);
1366e62c1185bee05facc25d1d725434f517261d308bChris Lattner      return Value == 0;
1367e62c1185bee05facc25d1d725434f517261d308bChris Lattner    }
1368e62c1185bee05facc25d1d725434f517261d308bChris Lattner    Value = 0;
1369e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return false;
1370e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1371e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1372e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
13731a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  void print(raw_ostream &OS, bool PrintSem = true) const;
1374e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1375e62c1185bee05facc25d1d725434f517261d308bChris Lattner
13761a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecordVal &RV) {
1377e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RV.print(OS << "  ");
1378e62c1185bee05facc25d1d725434f517261d308bChris Lattner  return OS;
1379e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
1380e62c1185bee05facc25d1d725434f517261d308bChris Lattner
138189e0f74094a6a86170c2c70fe8c6c19cb99c97a0Chris Lattnerclass Record {
13826f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  static unsigned LastID;
13836f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar
13846f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  // Unique record ID.
13856f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  unsigned ID;
13860d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  Init *Name;
13871e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner  SMLoc Loc;
1388e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  std::vector<Init *> TemplateArgs;
1389e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::vector<RecordVal> Values;
1390e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::vector<Record*> SuperClasses;
139167db883487fca3472fdde51e931657e22d4d0495Chris Lattner
139267db883487fca3472fdde51e931657e22d4d0495Chris Lattner  // Tracks Record instances. Not owned by Record.
139367db883487fca3472fdde51e931657e22d4d0495Chris Lattner  RecordKeeper &TrackedRecords;
139467db883487fca3472fdde51e931657e22d4d0495Chris Lattner
139577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DefInit *TheInit;
139677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
1397f7931b7040de1c829e678b4e391308bc3376f8a0David Greene  void init();
13980d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  void checkName();
13990d886401b3ec09b0c2d267942b07702a2f0740f4David Greene
1400e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1401e62c1185bee05facc25d1d725434f517261d308bChris Lattner
14029c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner  // Constructs a record.
14039c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner  explicit Record(const std::string &N, SMLoc loc, RecordKeeper &records) :
14040abdadbce7e04af76145154d75ca41dab749b8d6David Greene    ID(LastID++), Name(StringInit::get(N)), Loc(loc), TrackedRecords(records),
14050abdadbce7e04af76145154d75ca41dab749b8d6David Greene      TheInit(0) {
14060abdadbce7e04af76145154d75ca41dab749b8d6David Greene  }
1407e62c1185bee05facc25d1d725434f517261d308bChris Lattner  ~Record() {}
140821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1409f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov
1410117ccb7e518f05e4bf3df058fc402262f897ff0bChris Lattner  static unsigned getNewUID() { return LastID++; }
1411f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov
1412f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov
14136f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  unsigned getID() const { return ID; }
14146f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar
14150d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  const std::string &getName() const;
1416d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  Init *getNameInit() const {
1417d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene    return Name;
1418d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  }
1419d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  const std::string getNameInitAsString() const {
1420d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene    return getNameInit()->getAsUnquotedString();
1421d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  }
1422d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene
14230d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  void setName(Init *Name);               // Also updates RecordKeeper.
1424936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  void setName(const std::string &Name);  // Also updates RecordKeeper.
142521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
14261e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner  SMLoc getLoc() const { return Loc; }
142721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
142877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  /// get the corresponding DefInit.
142977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DefInit *getDefInit();
143077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
1431e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  const std::vector<Init *> &getTemplateArgs() const {
1432e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return TemplateArgs;
1433e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1434e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::vector<RecordVal> &getValues() const { return Values; }
1435e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::vector<Record*>   &getSuperClasses() const { return SuperClasses; }
1436e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1437e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  bool isTemplateArg(Init *Name) const {
1438e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i)
1439e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (TemplateArgs[i] == Name) return true;
1440e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return false;
1441e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1442e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  bool isTemplateArg(StringRef Name) const {
1443e22b321d2276b634519165b101b02d92c2fcf5c7David Greene    return isTemplateArg(StringInit::get(Name.str()));
1444e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  }
1445e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1446c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  const RecordVal *getValue(StringRef Name) const {
1447e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = Values.size(); i != e; ++i)
1448e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (Values[i].getName() == Name) return &Values[i];
1449e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return 0;
1450e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1451c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  RecordVal *getValue(StringRef Name) {
1452e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = Values.size(); i != e; ++i)
1453e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (Values[i].getName() == Name) return &Values[i];
1454e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return 0;
1455e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1456e62c1185bee05facc25d1d725434f517261d308bChris Lattner
145796a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  const RecordVal *getValue(Init *Name) const;
145896a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  RecordVal *getValue(Init *Name);
145996a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene
1460e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  void addTemplateArg(Init *Name) {
1461e62c1185bee05facc25d1d725434f517261d308bChris Lattner    assert(!isTemplateArg(Name) && "Template arg already defined!");
1462e62c1185bee05facc25d1d725434f517261d308bChris Lattner    TemplateArgs.push_back(Name);
1463e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1464e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  void addTemplateArg(StringRef Name) {
1465e22b321d2276b634519165b101b02d92c2fcf5c7David Greene    addTemplateArg(StringInit::get(Name.str()));
1466e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  }
1467e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1468e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addValue(const RecordVal &RV) {
1469e62c1185bee05facc25d1d725434f517261d308bChris Lattner    assert(getValue(RV.getName()) == 0 && "Value already added!");
1470e62c1185bee05facc25d1d725434f517261d308bChris Lattner    Values.push_back(RV);
1471e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1472e62c1185bee05facc25d1d725434f517261d308bChris Lattner
147396a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  void removeValue(Init *Name) {
1474bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner    for (unsigned i = 0, e = Values.size(); i != e; ++i)
147596a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene      if (Values[i].getNameInit() == Name) {
1476bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner        Values.erase(Values.begin()+i);
1477bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner        return;
1478bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner      }
14798478a5bcfba9ff80674ee78aa4447597c449fb43Bob Wilson    assert(0 && "Cannot remove an entry that does not exist!");
1480bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner  }
1481bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner
148296a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  void removeValue(StringRef Name) {
148396a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene    removeValue(StringInit::get(Name.str()));
148496a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  }
148596a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene
148602475f1fd502fa1729d1fc447417087acf9e96c8Ted Kremenek  bool isSubClassOf(const Record *R) const {
1487e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
1488e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (SuperClasses[i] == R)
1489ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen        return true;
1490e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return false;
1491e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1492e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1493c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  bool isSubClassOf(StringRef Name) const {
1494a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner    for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
14957474c29d903d479e7f99eb0d1d097f75289c5f48David Greene      if (SuperClasses[i]->getNameInitAsString() == Name)
1496a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner        return true;
1497a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner    return false;
1498a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner  }
1499a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner
1500e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addSuperClass(Record *R) {
1501e62c1185bee05facc25d1d725434f517261d308bChris Lattner    assert(!isSubClassOf(R) && "Already subclassing record!");
1502e62c1185bee05facc25d1d725434f517261d308bChris Lattner    SuperClasses.push_back(R);
1503e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1504e62c1185bee05facc25d1d725434f517261d308bChris Lattner
15057dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// resolveReferences - If there are any field references that refer to fields
15067dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// that have been filled in, we can propagate the values now.
15077dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  ///
15087dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  void resolveReferences() { resolveReferencesTo(0); }
15097dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner
15107dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// resolveReferencesTo - If anything in this record refers to RV, replace the
15117dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// reference to RV with the RHS of RV.  If RV is null, we resolve all
15127dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// possible references.
15137dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  void resolveReferencesTo(const RecordVal *RV);
1514e62c1185bee05facc25d1d725434f517261d308bChris Lattner
151567db883487fca3472fdde51e931657e22d4d0495Chris Lattner  RecordKeeper &getRecords() const {
15169c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner    return TrackedRecords;
151767db883487fca3472fdde51e931657e22d4d0495Chris Lattner  }
151867db883487fca3472fdde51e931657e22d4d0495Chris Lattner
1519e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
15205c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
15215c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  //===--------------------------------------------------------------------===//
15225c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  // High-level methods useful to tablegen back-ends
15235c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  //
15245c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
1525c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner  /// getValueInit - Return the initializer for a value with the specified name,
1526c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner  /// or throw an exception if the field does not exist.
1527c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner  ///
152805bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getValueInit(StringRef FieldName) const;
1529c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner
15305c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// getValueAsString - This method looks up the specified field and returns
15315c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// its value as a string, throwing an exception if the field does not exist
15325c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// or if the value is not a string.
15335c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  ///
1534c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::string getValueAsString(StringRef FieldName) const;
15355c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
15366f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  /// getValueAsBitsInit - This method looks up the specified field and returns
15376f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  /// its value as a BitsInit, throwing an exception if the field does not exist
15386f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  /// or if the value is not the right type.
15396f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  ///
154005bce0beee87512e52428d4b80f5a8e79a949576David Greene  BitsInit *getValueAsBitsInit(StringRef FieldName) const;
15416f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner
154258c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// getValueAsListInit - This method looks up the specified field and returns
154358c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// its value as a ListInit, throwing an exception if the field does not exist
154458c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// or if the value is not the right type.
154558c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  ///
154605bce0beee87512e52428d4b80f5a8e79a949576David Greene  ListInit *getValueAsListInit(StringRef FieldName) const;
154758c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner
1548b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner  /// getValueAsListOfDefs - This method looks up the specified field and
1549af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov  /// returns its value as a vector of records, throwing an exception if the
1550b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner  /// field does not exist or if the value is not the right type.
1551fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey  ///
1552c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::vector<Record*> getValueAsListOfDefs(StringRef FieldName) const;
1553fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey
1554f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov  /// getValueAsListOfInts - This method looks up the specified field and
1555f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov  /// returns its value as a vector of integers, throwing an exception if the
1556f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov  /// field does not exist or if the value is not the right type.
1557af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov  ///
1558c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const;
155921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1560bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  /// getValueAsListOfStrings - This method looks up the specified field and
1561bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  /// returns its value as a vector of strings, throwing an exception if the
1562bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  /// field does not exist or if the value is not the right type.
1563bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  ///
1564bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  std::vector<std::string> getValueAsListOfStrings(StringRef FieldName) const;
1565bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson
1566dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  /// getValueAsDef - This method looks up the specified field and returns its
1567dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  /// value as a Record, throwing an exception if the field does not exist or if
1568dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  /// the value is not the right type.
1569dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  ///
1570c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  Record *getValueAsDef(StringRef FieldName) const;
1571dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner
15720969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  /// getValueAsBit - This method looks up the specified field and returns its
15730969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  /// value as a bit, throwing an exception if the field does not exist or if
15740969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  /// the value is not the right type.
15750969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  ///
1576c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  bool getValueAsBit(StringRef FieldName) const;
15770969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner
157858c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// getValueAsInt - This method looks up the specified field and returns its
157963f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  /// value as an int64_t, throwing an exception if the field does not exist or
158063f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  /// if the value is not the right type.
158158c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  ///
1582c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  int64_t getValueAsInt(StringRef FieldName) const;
1583784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner
1584784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  /// getValueAsDag - This method looks up the specified field and returns its
1585784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  /// value as an Dag, throwing an exception if the field does not exist or if
1586784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  /// the value is not the right type.
1587784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  ///
158805bce0beee87512e52428d4b80f5a8e79a949576David Greene  DagInit *getValueAsDag(StringRef FieldName) const;
158921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
15908f493130bb51dea34c49e08aeab161e6a32dfdc6Chris Lattner  /// getValueAsCode - This method looks up the specified field and returns
15918f493130bb51dea34c49e08aeab161e6a32dfdc6Chris Lattner  /// its value as the string data in a CodeInit, throwing an exception if the
15928f493130bb51dea34c49e08aeab161e6a32dfdc6Chris Lattner  /// field does not exist or if the value is not a code object.
15938f493130bb51dea34c49e08aeab161e6a32dfdc6Chris Lattner  ///
1594c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::string getValueAsCode(StringRef FieldName) const;
1595e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1596e62c1185bee05facc25d1d725434f517261d308bChris Lattner
15971a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const Record &R);
1598e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1599c7cafcd815519b06318629b424abe746437e1389David Greenestruct MultiClass {
1600c7cafcd815519b06318629b424abe746437e1389David Greene  Record Rec;  // Placeholder for template args and Name.
1601c7cafcd815519b06318629b424abe746437e1389David Greene  typedef std::vector<Record*> RecordVector;
1602c7cafcd815519b06318629b424abe746437e1389David Greene  RecordVector DefPrototypes;
1603d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene
1604d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene  void dump() const;
1605d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene
160667db883487fca3472fdde51e931657e22d4d0495Chris Lattner  MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) :
160767db883487fca3472fdde51e931657e22d4d0495Chris Lattner    Rec(Name, Loc, Records) {}
1608c7cafcd815519b06318629b424abe746437e1389David Greene};
1609c7cafcd815519b06318629b424abe746437e1389David Greene
1610e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordKeeper {
1611e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::map<std::string, Record*> Classes, Defs;
1612e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1613e62c1185bee05facc25d1d725434f517261d308bChris Lattner  ~RecordKeeper() {
1614e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (std::map<std::string, Record*>::iterator I = Classes.begin(),
1615ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen           E = Classes.end(); I != E; ++I)
1616e62c1185bee05facc25d1d725434f517261d308bChris Lattner      delete I->second;
1617e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (std::map<std::string, Record*>::iterator I = Defs.begin(),
1618ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen           E = Defs.end(); I != E; ++I)
1619e62c1185bee05facc25d1d725434f517261d308bChris Lattner      delete I->second;
1620e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
16213da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
1622e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::map<std::string, Record*> &getClasses() const { return Classes; }
1623e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::map<std::string, Record*> &getDefs() const { return Defs; }
1624e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1625e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *getClass(const std::string &Name) const {
1626e62c1185bee05facc25d1d725434f517261d308bChris Lattner    std::map<std::string, Record*>::const_iterator I = Classes.find(Name);
1627e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return I == Classes.end() ? 0 : I->second;
1628e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1629e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *getDef(const std::string &Name) const {
1630e62c1185bee05facc25d1d725434f517261d308bChris Lattner    std::map<std::string, Record*>::const_iterator I = Defs.find(Name);
1631e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return I == Defs.end() ? 0 : I->second;
1632e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1633e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addClass(Record *R) {
16340615d6aac810059a37fbced0f315cce75476da49David Greene    assert(getClass(R->getNameInitAsString()) == 0 && "Class already exists!");
16350615d6aac810059a37fbced0f315cce75476da49David Greene    Classes.insert(std::make_pair(R->getNameInitAsString(), R));
1636e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1637e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addDef(Record *R) {
16380615d6aac810059a37fbced0f315cce75476da49David Greene    assert(getDef(R->getNameInitAsString()) == 0 && "Def already exists!");
16390615d6aac810059a37fbced0f315cce75476da49David Greene    Defs.insert(std::make_pair(R->getNameInitAsString(), R));
1640e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1641e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1642936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  /// removeClass - Remove, but do not delete, the specified record.
1643936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  ///
1644936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  void removeClass(const std::string &Name) {
1645936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    assert(Classes.count(Name) && "Class does not exist!");
1646936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    Classes.erase(Name);
1647936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  }
1648936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  /// removeDef - Remove, but do not delete, the specified record.
1649936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  ///
1650936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  void removeDef(const std::string &Name) {
1651936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    assert(Defs.count(Name) && "Def does not exist!");
1652936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    Defs.erase(Name);
1653936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  }
165421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1655ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  //===--------------------------------------------------------------------===//
1656ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  // High-level helper methods, useful for tablegen backends...
1657ab47ae3381aa2372009a9054260461c20324b555Chris Lattner
1658ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  /// getAllDerivedDefinitions - This method returns all concrete definitions
1659ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  /// that derive from the specified class name.  If a class with the specified
16605c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// name does not exist, an exception is thrown.
16615c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  std::vector<Record*>
16625c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  getAllDerivedDefinitions(const std::string &ClassName) const;
1663ab47ae3381aa2372009a9054260461c20324b555Chris Lattner
1664e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
1665e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1666e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1667690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// LessRecord - Sorting predicate to sort record pointers by name.
1668690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner///
1669690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecord {
1670690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  bool operator()(const Record *Rec1, const Record *Rec2) const {
1671160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen    return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0;
1672690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  }
1673690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner};
1674690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner
167521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// LessRecordFieldName - Sorting predicate to sort record pointers by their
16767c9a7728d9dd248ebee8f2dd969d303711d487a9Jim Grosbach/// name field.
1677690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner///
1678690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecordFieldName {
1679690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  bool operator()(const Record *Rec1, const Record *Rec2) const {
1680690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner    return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name");
1681690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  }
1682690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner};
1683690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner
16841a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK);
1685e62c1185bee05facc25d1d725434f517261d308bChris Lattner
168630c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring
168730c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name.
168830c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass,
168930c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene                  Init *Name, const std::string &Scoper);
169030c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene
169130c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring
169230c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name.
169330c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass,
169430c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene                  const std::string &Name, const std::string &Scoper);
169530c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene
1696d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
1697d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
1698e62c1185bee05facc25d1d725434f517261d308bChris Lattner#endif
1699