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