17c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne//===- llvm/TableGen/Record.h - Classes for Table Records -------*- C++ -*-===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//                     The LLVM Compiler Infrastructure
401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details.
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===//
9e62c1185bee05facc25d1d725434f517261d308bChris Lattner//
1014d7c59491347a2f8f29e120fd75a4cad42f68e7Chris Lattner// This file defines the main TableGen data structures, including the TableGen
1114d7c59491347a2f8f29e120fd75a4cad42f68e7Chris Lattner// types, values, and high-level data structures.
12e62c1185bee05facc25d1d725434f517261d308bChris Lattner//
13e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
14e62c1185bee05facc25d1d725434f517261d308bChris Lattner
157c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#ifndef LLVM_TABLEGEN_RECORD_H
167c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#define LLVM_TABLEGEN_RECORD_H
17e62c1185bee05facc25d1d725434f517261d308bChris Lattner
18c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene#include "llvm/ADT/ArrayRef.h"
19726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene#include "llvm/ADT/FoldingSet.h"
20dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene#include "llvm/Support/Allocator.h"
21099e198ae84c1a6cfe2a7c79ee9f47fa67caac8fChris Lattner#include "llvm/Support/SourceMgr.h"
223cc52ea33c0b96d1682f14fc45c45b57df0f39b6Michael J. Spencer#include "llvm/Support/DataTypes.h"
2350bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper#include "llvm/Support/ErrorHandling.h"
241a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar#include "llvm/Support/raw_ostream.h"
25e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include <map>
26028936ada14335bb04f377d46a6261dc4c66dafdJohn Criswell
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
281a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarclass raw_ostream;
2921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
307dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// RecTy subclasses.
317cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitRecTy;
327cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitsRecTy;
337cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass IntRecTy;
347cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass StringRecTy;
357cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass ListRecTy;
3640f71134b9fef0ca06c516f033cc9403394a913cChris Lattnerclass DagRecTy;
377cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass RecordRecTy;
387cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
397dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// Init subclasses.
40afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init;
41e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass UnsetInit;
42e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit;
43e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsInit;
44e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass IntInit;
45e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass StringInit;
46e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListInit;
47e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit;
48711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattnerclass BinOpInit;
494afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit;
50e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass DefInit;
518e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattnerclass DagInit;
52b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass TypedInit;
53b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarInit;
54a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattnerclass FieldInit;
55b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarBitInit;
561dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit;
577cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
587dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// Other classes.
59e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass Record;
607dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattnerclass RecordVal;
61293b13350c2fbae8a64b0b0beb440cb859968c8cBob Wilsonstruct MultiClass;
6267db883487fca3472fdde51e931657e22d4d0495Chris Lattnerclass RecordKeeper;
63e62c1185bee05facc25d1d725434f517261d308bChris Lattner
64e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
65e62c1185bee05facc25d1d725434f517261d308bChris Lattner//  Type Classes
66e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
67e62c1185bee05facc25d1d725434f517261d308bChris Lattner
6877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenclass RecTy {
6977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  ListRecTy *ListTy;
702d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
7177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
7277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  RecTy() : ListTy(0) {}
73e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual ~RecTy() {}
74e62c1185bee05facc25d1d725434f517261d308bChris Lattner
7599ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  virtual std::string getAsString() const = 0;
761a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  void print(raw_ostream &OS) const { OS << getAsString(); }
777cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  void dump() const;
787cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
797cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  /// typeIsConvertibleTo - Return true if all values of 'this' type can be
807cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  /// converted to the specified type.
817cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool typeIsConvertibleTo(const RecTy *RHS) const = 0;
827cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
8377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  /// getListTy - Returns the type representing list<this>.
8477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  ListRecTy *getListTy();
8577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
867cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerpublic:   // These methods should only be called from subclasses of Init
8705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return 0; }
8805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
8905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
9005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
9105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
9205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
9305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) {
9405bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)UI);
95e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  }
9605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) {
9705bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)UI);
98e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  }
9905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) {
10005bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)UI);
1014afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  }
10205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
10305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
10405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
10505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI) { return 0; }
10605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) {
10705bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)VI);
108b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner  }
10905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) {
11005bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)FI);
111b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner  }
112e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1137cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerpublic:   // These methods should only be called by subclasses of RecTy.
1147cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  // baseClassOf - These virtual methods should be overloaded to return true iff
1157cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  // all values of type 'RHS' can be converted to the 'this' type.
1167cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
1177cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
1187cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
1197cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
1207cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
12140f71134b9fef0ca06c516f033cc9403394a913cChris Lattner  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
1227cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
123e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
124e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1251a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecTy &Ty) {
126e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Ty.print(OS);
127e62c1185bee05facc25d1d725434f517261d308bChris Lattner  return OS;
128e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
129e62c1185bee05facc25d1d725434f517261d308bChris Lattner
13007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
13107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitRecTy - 'bit' - Represent a single bit
13207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
1331fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass BitRecTy : public RecTy {
13477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static BitRecTy Shared;
13577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  BitRecTy() {}
1361fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
13777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static BitRecTy *get() { return &Shared; }
13877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
13905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
14005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return (Init*)BI; }
14105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI);
14205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II);
14305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
14405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
14505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return (Init*)VB; }
14605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
14705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
14805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
14905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
15005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
15105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
15205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
15305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
154e62c1185bee05facc25d1d725434f517261d308bChris Lattner
15599ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const { return "bit"; }
1567cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
1577cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
1587cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
1597cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
160ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return true; }
161ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const;
162ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
163ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
164ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
165ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
166ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
167ead87b671278379f92890fddd859a301bb68f462Reid Spencer
168e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
169e62c1185bee05facc25d1d725434f517261d308bChris Lattner
17007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
171234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// BitsRecTy - 'bits<n>' - Represent a fixed number of bits
172234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// BitsRecTy - 'bits&lt;n&gt;' - Represent a fixed number of bits
17307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
174e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsRecTy : public RecTy {
175e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned Size;
1761002c0203450620594a85454c6a095ca94b87cb2Dan Gohman  explicit BitsRecTy(unsigned Sz) : Size(Sz) {}
17777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
17877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static BitsRecTy *get(unsigned Sz);
179e62c1185bee05facc25d1d725434f517261d308bChris Lattner
180e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getNumBits() const { return Size; }
181e62c1185bee05facc25d1d725434f517261d308bChris Lattner
18205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI);
18305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *UI);
18405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI);
18505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II);
18605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
18705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
18805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
18905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
19005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
19105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
19205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
19305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
19405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
19505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
19605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
197ead87b671278379f92890fddd859a301bb68f462Reid Spencer
19899ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const;
1997cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
2007cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
2017cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
2027cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
203ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return Size == 1; }
204ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const {
2057cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->Size == Size;
2067cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
207ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
208ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
209ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
210ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
211ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
212ead87b671278379f92890fddd859a301bb68f462Reid Spencer
213e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
214e62c1185bee05facc25d1d725434f517261d308bChris Lattner
21507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
21607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntRecTy - 'int' - Represent an integer value of no particular size
21707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
2181fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass IntRecTy : public RecTy {
21977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static IntRecTy Shared;
22077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  IntRecTy() {}
2211fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
22277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static IntRecTy *get() { return &Shared; }
22377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
22405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
22505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI);
22605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI);
22705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return (Init*)II; }
22805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
22905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
23005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
23105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
23205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
23305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
23405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
23505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
23605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
23705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
23805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
239ead87b671278379f92890fddd859a301bb68f462Reid Spencer
24099ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const { return "int"; }
2417cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
2427cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
2437cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
2447cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
2457cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
246ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return true; }
247ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return true; }
248ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
249ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
250ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
251ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
252ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
253ead87b671278379f92890fddd859a301bb68f462Reid Spencer
254e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
255e62c1185bee05facc25d1d725434f517261d308bChris Lattner
25607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringRecTy - 'string' - Represent an string value
25707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
2581fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass StringRecTy : public RecTy {
25977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static StringRecTy Shared;
26077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  StringRecTy() {}
2611fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
26277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static StringRecTy *get() { return &Shared; }
26377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
26405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
26505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
26605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
26705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
26805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return (Init*)SI; }
26905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
27005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *BO);
27105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *BO);
27205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
27305bce0beee87512e52428d4b80f5a8e79a949576David Greene
27405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
27505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
27605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
27705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
27805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
27905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
280ead87b671278379f92890fddd859a301bb68f462Reid Spencer
28199ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const { return "string"; }
2827cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
2837cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
2847cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
2857cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
2867cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
287ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
288ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
289ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
2907cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const StringRecTy *RHS) const { return true; }
291ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
292ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
293ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
294e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
295e62c1185bee05facc25d1d725434f517261d308bChris Lattner
296234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of
297234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman// the specified type.
298234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// ListRecTy - 'list&lt;Ty&gt;' - Represent a list of values, all of which must
299234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// be of the specified type.
30007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
301e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListRecTy : public RecTy {
3027cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  RecTy *Ty;
3031002c0203450620594a85454c6a095ca94b87cb2Dan Gohman  explicit ListRecTy(RecTy *T) : Ty(T) {}
30477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  friend ListRecTy *RecTy::getListTy();
30577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
30677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static ListRecTy *get(RecTy *T) { return T->getListTy(); }
3077cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  RecTy *getElementType() const { return Ty; }
308f1b36f9a71eb267f04b7bd3a32aca9bc69f71e97Chris Lattner
30905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
31005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
31105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
31205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
31305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
31405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI);
31505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
31605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
31705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
31805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
31905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
32005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
32105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
32205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
32305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
3243da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
32599ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const;
3267cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
3277cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
3287cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
3297cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
3307cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
331ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
332ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
333ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
334ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
335ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const {
3363da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman    return RHS->getElementType()->typeIsConvertibleTo(Ty);
3377cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
338ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
339ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
340f05760de76b4ec26474da18c97770ca369972cfdChris Lattner};
341f05760de76b4ec26474da18c97770ca369972cfdChris Lattner
34240f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/// DagRecTy - 'dag' - Represent a dag fragment
34340f71134b9fef0ca06c516f033cc9403394a913cChris Lattner///
3441fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass DagRecTy : public RecTy {
34577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static DagRecTy Shared;
34677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DagRecTy() {}
3471fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
34877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static DagRecTy *get() { return &Shared; }
34977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
35005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
35105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
35205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
35305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
35405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
35505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
35605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
35705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
35805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *BO);
35905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *BO);
36005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
36105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *CI) { return (Init*)CI; }
36205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
36305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
36405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
36540f71134b9fef0ca06c516f033cc9403394a913cChris Lattner
36699ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const { return "dag"; }
36740f71134b9fef0ca06c516f033cc9403394a913cChris Lattner
36840f71134b9fef0ca06c516f033cc9403394a913cChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
36940f71134b9fef0ca06c516f033cc9403394a913cChris Lattner    return RHS->baseClassOf(this);
37040f71134b9fef0ca06c516f033cc9403394a913cChris Lattner  }
371ead87b671278379f92890fddd859a301bb68f462Reid Spencer
372ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
373ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
374ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
375ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
376ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
377ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return true; }
378ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
37940f71134b9fef0ca06c516f033cc9403394a913cChris Lattner};
38040f71134b9fef0ca06c516f033cc9403394a913cChris Lattner
381f05760de76b4ec26474da18c97770ca369972cfdChris Lattner
382234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// RecordRecTy - '[classname]' - Represent an instance of a class, such as:
38307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// (R32 X = EAX).
38407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
385e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordRecTy : public RecTy {
386e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *Rec;
3871002c0203450620594a85454c6a095ca94b87cb2Dan Gohman  explicit RecordRecTy(Record *R) : Rec(R) {}
38877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  friend class Record;
38977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
39077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static RecordRecTy *get(Record *R);
391e62c1185bee05facc25d1d725434f517261d308bChris Lattner
392a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  Record *getRecord() const { return Rec; }
393a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
39405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
39505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
39605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
39705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
39805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
39905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
40005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
40105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
40205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
40305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
40405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI);
40505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
40605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *VI);
40705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
40805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
409e62c1185bee05facc25d1d725434f517261d308bChris Lattner
41099ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  std::string getAsString() const;
4117cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
4127cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  bool typeIsConvertibleTo(const RecTy *RHS) const {
4137cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
4147cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
415ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
416ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
417ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
418ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
419ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
420ead87b671278379f92890fddd859a301bb68f462Reid Spencer  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
4217cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool baseClassOf(const RecordRecTy *RHS) const;
422e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
423e62c1185bee05facc25d1d725434f517261d308bChris Lattner
42421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// resolveTypes - Find a common type that T1 and T2 convert to.
425e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene/// Return 0 if no such type exists.
426e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene///
427e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid GreeneRecTy *resolveTypes(RecTy *T1, RecTy *T2);
42807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
429e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
430e62c1185bee05facc25d1d725434f517261d308bChris Lattner//  Initializer Classes
431e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
432e62c1185bee05facc25d1d725434f517261d308bChris Lattner
433afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init {
434dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  Init(const Init &);  // Do not define.
435dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  Init &operator=(const Init &);  // Do not define.
4362d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
437dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
438dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected:
439dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  Init(void) {}
440dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
441afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greenepublic:
442e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual ~Init() {}
443e62c1185bee05facc25d1d725434f517261d308bChris Lattner
444f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// isComplete - This virtual method should be overridden by values that may
445f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// not be completely specified yet.
446f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  virtual bool isComplete() const { return true; }
447f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner
448f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// print - Print out this value.
4491a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  void print(raw_ostream &OS) const { OS << getAsString(); }
4503aba4d39fd101238ac06871895c28f26736d80cbChris Lattner
4513aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  /// getAsString - Convert this value to a string form.
4523aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const = 0;
4530b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// getAsUnquotedString - Convert this value to a string form,
4540b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// without adding quote markers.  This primaruly affects
4550b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// StringInits where we will not surround the string value with
4560b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// quotes.
4574b18691c3580674691875ec37c84a1c4edf2d586Jim Grosbach  virtual std::string getAsUnquotedString() const { return getAsString(); }
458f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner
459f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// dump - Debugging method that may be called through a debugger, just
4601a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  /// invokes print on stderr.
461e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
462e62c1185bee05facc25d1d725434f517261d308bChris Lattner
463f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// convertInitializerTo - This virtual function is a simple call-back
464f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// function that should be overridden to call the appropriate
465f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// RecTy::convertValue method.
466f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  ///
46705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const = 0;
468f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner
469f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// convertInitializerBitRange - This method is used to implement the bitrange
470f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// selection operator.  Given an initializer, it selects the specified bits
4717331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner  /// out, returning them as a new init of bits type.  If it is not legal to use
4727331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner  /// the bit subscript operator on this initializer, return null.
473f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  ///
47405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
475f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const {
476e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return 0;
477e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
478e62c1185bee05facc25d1d725434f517261d308bChris Lattner
479b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// convertInitListSlice - This method is used to implement the list slice
480b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// selection operator.  Given an initializer, it selects the specified list
481b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// elements, returning them as a new init of list type.  If it is not legal
482b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// to take a slice of this, return null.
483b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  ///
48405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
485f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitListSlice(const std::vector<unsigned> &Elements) const {
486b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner    return 0;
487b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  }
488b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner
489a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  /// getFieldType - This method is used to implement the FieldInit class.
490a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  /// Implementors of this method should return the type of the named field if
491a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  /// they are of record type.
492a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  ///
493a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  virtual RecTy *getFieldType(const std::string &FieldName) const { return 0; }
494a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
495b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  /// getFieldInit - This method complements getFieldType to return the
496b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  /// initializer for the specified field.  If getFieldType returns non-null
497b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  /// this method should return non-null, otherwise it returns null.
498b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  ///
49905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getFieldInit(Record &R, const RecordVal *RV,
50005bce0beee87512e52428d4b80f5a8e79a949576David Greene                             const std::string &FieldName) const {
501b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner    return 0;
502b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  }
5033da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
504f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// resolveReferences - This method is used by classes that refer to other
505a8449e6aaa6f494d85e75d4755f9c47abf1e06ceBob Wilson  /// variables which may not be defined at the time the expression is formed.
506f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// If a value is set for the variable later, this method will be called on
507f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// users of the value to allow the value to propagate out.
508f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  ///
50905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const {
51005bce0beee87512e52428d4b80f5a8e79a949576David Greene    return const_cast<Init *>(this);
5117dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  }
512307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
513307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// getBit - This method is used to return the initializer for the specified
514307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// bit.
515307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const = 0;
516307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
517307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// getBitVar - This method is used to retrieve the initializer for bit
518307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// reference. For non-VarBitInit, it simply returns itself.
519307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBitVar() const { return const_cast<Init*>(this); }
520307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
521307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// getBitNum - This method is used to retrieve the bit number of a bit
522307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// reference. For non-VarBitInit, it simply returns 0.
523307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual unsigned getBitNum() const { return 0; }
524e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
525e62c1185bee05facc25d1d725434f517261d308bChris Lattner
5261a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const Init &I) {
527e62c1185bee05facc25d1d725434f517261d308bChris Lattner  I.print(OS); return OS;
528e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
529e62c1185bee05facc25d1d725434f517261d308bChris Lattner
530beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// TypedInit - This is the common super-class of types that have a specific,
531beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// explicit, type.
532beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene///
533beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass TypedInit : public Init {
534beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  RecTy *Ty;
535dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
536dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  TypedInit(const TypedInit &Other);  // Do not define.
537dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  TypedInit &operator=(const TypedInit &Other);  // Do not define.
538dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
539dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected:
540d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit TypedInit(RecTy *T) : Ty(T) {}
541d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher
542dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
543beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  RecTy *getType() const { return Ty; }
544beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
54505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
546f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
54705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
548f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitListSlice(const std::vector<unsigned> &Elements) const;
549beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
5509703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  /// getFieldType - This method is used to implement the FieldInit class.
5519703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  /// Implementors of this method should return the type of the named field if
5529703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  /// they are of record type.
5539703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  ///
5549703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  virtual RecTy *getFieldType(const std::string &FieldName) const;
5559703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene
556beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveListElementReference - This method is used to implement
557beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
558beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// now, we return the resolved value, otherwise we return null.
55905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
56005bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const = 0;
561beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene};
562beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
56307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
56407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// UnsetInit - ? - Represents an uninitialized value
56507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
5661fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass UnsetInit : public Init {
567dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnsetInit() : Init() {}
568dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnsetInit(const UnsetInit &);  // Do not define.
569dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnsetInit &operator=(const UnsetInit &Other);  // Do not define.
5702d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
571dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
5721fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
57305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static UnsetInit *get();
574dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
57505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
57605bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<UnsetInit *>(this));
577e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
578e62c1185bee05facc25d1d725434f517261d308bChris Lattner
579307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
580307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    return const_cast<UnsetInit*>(this);
581307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
582307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
583e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual bool isComplete() const { return false; }
5843aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return "?"; }
585e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
586e62c1185bee05facc25d1d725434f517261d308bChris Lattner
58707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
58807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitInit - true/false - Represent a concrete initializer for a bit.
58907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
590e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit : public Init {
591e62c1185bee05facc25d1d725434f517261d308bChris Lattner  bool Value;
592dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
593d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit BitInit(bool V) : Value(V) {}
594dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BitInit(const BitInit &Other);  // Do not define.
595dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BitInit &operator=(BitInit &Other);  // Do not define.
5962d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
597dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
598dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
59905bce0beee87512e52428d4b80f5a8e79a949576David Greene  static BitInit *get(bool V);
600e62c1185bee05facc25d1d725434f517261d308bChris Lattner
601e62c1185bee05facc25d1d725434f517261d308bChris Lattner  bool getValue() const { return Value; }
602e62c1185bee05facc25d1d725434f517261d308bChris Lattner
60305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
60405bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<BitInit *>(this));
605e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
606e62c1185bee05facc25d1d725434f517261d308bChris Lattner
607307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
608307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    assert(Bit < 1 && "Bit index out of range!");
609307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    return const_cast<BitInit*>(this);
610307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
611307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
6123aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return Value ? "1" : "0"; }
613e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
614e62c1185bee05facc25d1d725434f517261d308bChris Lattner
61507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value.
61607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// It contains a vector of bits, whose size is determined by the type.
61707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
618726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greeneclass BitsInit : public Init, public FoldingSetNode {
61905bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<Init*> Bits;
620dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
62105bce0beee87512e52428d4b80f5a8e79a949576David Greene  BitsInit(ArrayRef<Init *> Range) : Bits(Range.begin(), Range.end()) {}
622e62c1185bee05facc25d1d725434f517261d308bChris Lattner
623dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BitsInit(const BitsInit &Other);  // Do not define.
624dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BitsInit &operator=(const BitsInit &Other);  // Do not define.
625dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
626dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
62705bce0beee87512e52428d4b80f5a8e79a949576David Greene  static BitsInit *get(ArrayRef<Init *> Range);
628dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
629726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene  void Profile(FoldingSetNodeID &ID) const;
630726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene
631e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getNumBits() const { return Bits.size(); }
632e62c1185bee05facc25d1d725434f517261d308bChris Lattner
63305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
63405bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<BitsInit *>(this));
635e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
63605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
637f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
638e62c1185bee05facc25d1d725434f517261d308bChris Lattner
639e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual bool isComplete() const {
640e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0; i != getNumBits(); ++i)
641e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (!getBit(i)->isComplete()) return false;
642e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return true;
643e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
6441808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen  bool allInComplete() const {
6451808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen    for (unsigned i = 0; i != getNumBits(); ++i)
6461808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen      if (getBit(i)->isComplete()) return false;
6471808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen    return true;
6481808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen  }
6493aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
650e62c1185bee05facc25d1d725434f517261d308bChris Lattner
65105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
652307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
653307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
654307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    assert(Bit < Bits.size() && "Bit index out of range!");
655307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    return Bits[Bit];
656307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
657e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
658e62c1185bee05facc25d1d725434f517261d308bChris Lattner
65907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
66007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntInit - 7 - Represent an initalization by a literal integer value.
66107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
662e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greeneclass IntInit : public TypedInit {
66363f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t Value;
664dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
66577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  explicit IntInit(int64_t V) : TypedInit(IntRecTy::get()), Value(V) {}
666e62c1185bee05facc25d1d725434f517261d308bChris Lattner
667dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  IntInit(const IntInit &Other);  // Do not define.
668dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  IntInit &operator=(const IntInit &Other);  // Do note define.
669dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
670dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
67105bce0beee87512e52428d4b80f5a8e79a949576David Greene  static IntInit *get(int64_t V);
672dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
67363f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t getValue() const { return Value; }
674e62c1185bee05facc25d1d725434f517261d308bChris Lattner
67505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
67605bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<IntInit *>(this));
677e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
67805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
679f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
680e62c1185bee05facc25d1d725434f517261d308bChris Lattner
6813aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
682e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene
683e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// resolveListElementReference - This method is used to implement
684e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
685e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// now, we return the resolved value, otherwise we return null.
68605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
68705bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
68850bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal element reference off int");
689e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  }
690307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
691307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
692236bcf1fcd6164d624956c0858593c1a780b9a0bAaron Ballman    return BitInit::get((Value & (1ULL << Bit)) != 0);
693307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
694e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
695e62c1185bee05facc25d1d725434f517261d308bChris Lattner
69607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
69707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringInit - "foo" - Represent an initialization by a string value.
69807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
699beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass StringInit : public TypedInit {
700e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::string Value;
701dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
702d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit StringInit(const std::string &V)
70377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen    : TypedInit(StringRecTy::get()), Value(V) {}
704e62c1185bee05facc25d1d725434f517261d308bChris Lattner
705dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  StringInit(const StringInit &Other);  // Do not define.
706dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  StringInit &operator=(const StringInit &Other);  // Do not define.
7072d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
708dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
709dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
710ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  static StringInit *get(StringRef);
711dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
7125c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  const std::string &getValue() const { return Value; }
7135c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
71405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
71505bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<StringInit *>(this));
716e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
717e62c1185bee05facc25d1d725434f517261d308bChris Lattner
7183aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return "\"" + Value + "\""; }
7190b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  virtual std::string getAsUnquotedString() const { return Value; }
720beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
721beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveListElementReference - This method is used to implement
722beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
723beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// now, we return the resolved value, otherwise we return null.
72405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
72505bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
72650bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal element reference off string");
727beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
728307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
729307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
730307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    llvm_unreachable("Illegal bit reference off string");
731307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
732e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
733e62c1185bee05facc25d1d725434f517261d308bChris Lattner
73407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// ListInit - [AL, AH, CL] - Represent a list of defs
73507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
736aad4c9fc37b38cae21343173084c81d789535446David Greeneclass ListInit : public TypedInit, public FoldingSetNode {
73705bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<Init*> Values;
738e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
73905bce0beee87512e52428d4b80f5a8e79a949576David Greene  typedef std::vector<Init*>::const_iterator const_iterator;
7405f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene
741aad4c9fc37b38cae21343173084c81d789535446David Greeneprivate:
74205bce0beee87512e52428d4b80f5a8e79a949576David Greene  explicit ListInit(ArrayRef<Init *> Range, RecTy *EltTy)
74360c04af7879c3eda957162737783de726dd177b6David Greene      : TypedInit(ListRecTy::get(EltTy)), Values(Range.begin(), Range.end()) {}
744e62c1185bee05facc25d1d725434f517261d308bChris Lattner
745dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  ListInit(const ListInit &Other);  // Do not define.
746dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  ListInit &operator=(const ListInit &Other);  // Do not define.
747dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
748dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
74905bce0beee87512e52428d4b80f5a8e79a949576David Greene  static ListInit *get(ArrayRef<Init *> Range, RecTy *EltTy);
750dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
751aad4c9fc37b38cae21343173084c81d789535446David Greene  void Profile(FoldingSetNodeID &ID) const;
752aad4c9fc37b38cae21343173084c81d789535446David Greene
7537cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  unsigned getSize() const { return Values.size(); }
75405bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getElement(unsigned i) const {
7557cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    assert(i < Values.size() && "List element index out of range!");
7567cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return Values[i];
757e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
758e62c1185bee05facc25d1d725434f517261d308bChris Lattner
75950d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner  Record *getElementAsRecord(unsigned i) const;
76021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
76105bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *convertInitListSlice(const std::vector<unsigned> &Elements) const;
762b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner
76305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
76405bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<ListInit *>(this));
765e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
766e62c1185bee05facc25d1d725434f517261d308bChris Lattner
7671dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// resolveReferences - This method is used by classes that refer to other
7681dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// variables which may not be defined at the time they expression is formed.
7691dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// If a value is set for the variable later, this method will be called on
7701dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// users of the value to allow the value to propagate out.
7711dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  ///
77205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
7731dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
7743aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
77582137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov
77605bce0beee87512e52428d4b80f5a8e79a949576David Greene  ArrayRef<Init*> getValues() const { return Values; }
777c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene
77882137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline const_iterator begin() const { return Values.begin(); }
77982137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline const_iterator end  () const { return Values.end();   }
78082137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov
78182137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline size_t         size () const { return Values.size();  }
78282137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline bool           empty() const { return Values.empty(); }
783e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene
784e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// resolveListElementReference - This method is used to implement
785e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
786e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// now, we return the resolved value, otherwise we return null.
78705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
78805bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
789307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
790307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
791307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    llvm_unreachable("Illegal bit reference off list");
792307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
793e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
794e62c1185bee05facc25d1d725434f517261d308bChris Lattner
7957331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner
796d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// OpInit - Base class for operators
797d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene///
798d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass OpInit : public TypedInit {
799dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  OpInit(const OpInit &Other);  // Do not define.
800dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  OpInit &operator=(OpInit &Other);  // Do not define.
801d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher
802dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected:
803dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  explicit OpInit(RecTy *Type) : TypedInit(Type) {}
804dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
805dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
806d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // Clone - Clone this operator, replacing arguments with the new list
80705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const = 0;
808d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
809a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  virtual int getNumOperands() const = 0;
81005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getOperand(int i) const = 0;
811d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
812d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
813d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // possible to fold.
81405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const = 0;
815d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
81605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
81705bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<OpInit *>(this));
818d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  }
81921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
82005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
82105bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
822307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
823307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const;
824d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene};
825d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
826d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
827d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// UnOpInit - !op (X) - Transform an init.
828d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene///
829e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit : public OpInit {
830e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic:
8311434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene  enum UnaryOp { CAST, HEAD, TAIL, EMPTY };
832e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneprivate:
833e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  UnaryOp Opc;
83405bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *LHS;
835dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
83605bce0beee87512e52428d4b80f5a8e79a949576David Greene  UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type)
837dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      : OpInit(Type), Opc(opc), LHS(lhs) {}
838dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
839dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnOpInit(const UnOpInit &Other);  // Do not define.
840dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  UnOpInit &operator=(const UnOpInit &Other);  // Do not define.
841dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
842e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic:
84305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type);
844d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
845e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  // Clone - Clone this operator, replacing arguments with the new list
84605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const {
847aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert(Operands.size() == 1 &&
848aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Wrong number of operands for unary operation");
849dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene    return UnOpInit::get(getOpcode(), *Operands.begin(), getType());
850e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  }
851d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
852a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  int getNumOperands() const { return 1; }
85305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperand(int i) const {
854e6c27de069225e1122c78385ad22a2ff656db8e6David Greene    assert(i == 0 && "Invalid operand id for unary operator");
855e6c27de069225e1122c78385ad22a2ff656db8e6David Greene    return getOperand();
856e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  }
85721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
858e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  UnaryOp getOpcode() const { return Opc; }
85905bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperand() const { return LHS; }
860d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
861e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
862e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  // possible to fold.
86305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
864d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
86505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
86621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
867e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  virtual std::string getAsString() const;
868e6c27de069225e1122c78385ad22a2ff656db8e6David Greene};
869e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
870e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// BinOpInit - !op (X, Y) - Combine two inits.
871e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene///
872d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass BinOpInit : public OpInit {
873e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greenepublic:
874c7252ce74324e44efa7ec2506035a8e2d2e93d2fChris Lattner  enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, EQ };
875e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greeneprivate:
876e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  BinaryOp Opc;
87705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *LHS, *RHS;
878dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
87905bce0beee87512e52428d4b80f5a8e79a949576David Greene  BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) :
880dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      OpInit(Type), Opc(opc), LHS(lhs), RHS(rhs) {}
881dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
882dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BinOpInit(const BinOpInit &Other);  // Do not define.
883dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  BinOpInit &operator=(const BinOpInit &Other);  // Do not define.
884dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
885dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
88605bce0beee87512e52428d4b80f5a8e79a949576David Greene  static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs,
88705bce0beee87512e52428d4b80f5a8e79a949576David Greene                        RecTy *Type);
88821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
889d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // Clone - Clone this operator, replacing arguments with the new list
89005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const {
891aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert(Operands.size() == 2 &&
892aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Wrong number of operands for binary operation");
893dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene    return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType());
894d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  }
895d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
896a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  int getNumOperands() const { return 2; }
89705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperand(int i) const {
898aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert((i == 0 || i == 1) && "Invalid operand id for binary operator");
899d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene    if (i == 0) {
900d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene      return getLHS();
90121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson    } else {
902d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene      return getRHS();
903d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene    }
904d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  }
905d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
906e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  BinaryOp getOpcode() const { return Opc; }
90705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getLHS() const { return LHS; }
90805bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getRHS() const { return RHS; }
909e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
910e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
911e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  // possible to fold.
91205bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
913e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
91405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
91521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
916e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  virtual std::string getAsString() const;
917e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene};
918e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
919d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// TernOpInit - !op (X, Y, Z) - Combine two inits.
920d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene///
9214afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit : public OpInit {
9224afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greenepublic:
923ffc0ab6037aa45bc22f57433148e5f586843b3a7David Greene  enum TernaryOp { SUBST, FOREACH, IF };
9244afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneprivate:
9254afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  TernaryOp Opc;
92605bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *LHS, *MHS, *RHS;
927dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
92805bce0beee87512e52428d4b80f5a8e79a949576David Greene  TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs,
929f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene             RecTy *Type) :
930dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      OpInit(Type), Opc(opc), LHS(lhs), MHS(mhs), RHS(rhs) {}
931dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
932dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  TernOpInit(const TernOpInit &Other);  // Do not define.
933dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  TernOpInit &operator=(const TernOpInit &Other);  // Do not define.
934dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
935dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
93605bce0beee87512e52428d4b80f5a8e79a949576David Greene  static TernOpInit *get(TernaryOp opc, Init *lhs,
93705bce0beee87512e52428d4b80f5a8e79a949576David Greene                         Init *mhs, Init *rhs,
93805bce0beee87512e52428d4b80f5a8e79a949576David Greene                         RecTy *Type);
93921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
9404afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  // Clone - Clone this operator, replacing arguments with the new list
94105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const {
942aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert(Operands.size() == 3 &&
943aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Wrong number of operands for ternary operation");
944dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene    return TernOpInit::get(getOpcode(), Operands[0], Operands[1], Operands[2],
945dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene                           getType());
9464afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  }
9474afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene
948a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  int getNumOperands() const { return 3; }
94905bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperand(int i) const {
950aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert((i == 0 || i == 1 || i == 2) &&
951aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Invalid operand id for ternary operator");
9524afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene    if (i == 0) {
9534afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene      return getLHS();
95421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson    } else if (i == 1) {
9554afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene      return getMHS();
95621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson    } else {
9574afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene      return getRHS();
9584afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene    }
9594afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  }
9604afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene
9614afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  TernaryOp getOpcode() const { return Opc; }
96205bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getLHS() const { return LHS; }
96305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getMHS() const { return MHS; }
96405bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getRHS() const { return RHS; }
9654afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene
9664afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
9674afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  // possible to fold.
96805bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
96921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
970548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling  virtual bool isComplete() const { return false; }
971548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling
97205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
97321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
9744afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  virtual std::string getAsString() const;
9754afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene};
976d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
977e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
97807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// VarInit - 'Opcode' - Represent a reference to an entire variable object.
97907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
9807331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass VarInit : public TypedInit {
981ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  Init *VarName;
982dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
983d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit VarInit(const std::string &VN, RecTy *T)
984ee6dca17252de152720655282fb4b74b76fb2fe9David Greene      : TypedInit(T), VarName(StringInit::get(VN)) {}
985ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  explicit VarInit(Init *VN, RecTy *T)
986dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      : TypedInit(T), VarName(VN) {}
987dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
988dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarInit(const VarInit &Other);  // Do not define.
989dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarInit &operator=(const VarInit &Other);  // Do not define.
990dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
991dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
99205bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarInit *get(const std::string &VN, RecTy *T);
99305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarInit *get(Init *VN, RecTy *T);
9943da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
99505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
99605bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<VarInit *>(this));
997e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
998e62c1185bee05facc25d1d725434f517261d308bChris Lattner
999ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  const std::string &getName() const;
1000ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  Init *getNameInit() const { return VarName; }
1001ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  std::string getNameInitAsString() const {
1002ee6dca17252de152720655282fb4b74b76fb2fe9David Greene    return getNameInit()->getAsUnquotedString();
1003ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  }
1004e62c1185bee05facc25d1d725434f517261d308bChris Lattner
100505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
100605bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
10077331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner
1008a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  virtual RecTy *getFieldType(const std::string &FieldName) const;
100905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getFieldInit(Record &R, const RecordVal *RV,
101005bce0beee87512e52428d4b80f5a8e79a949576David Greene                             const std::string &FieldName) const;
10119b929aa7495ee0b5d389370baeb332456632b2feChris Lattner
10129b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// resolveReferences - This method is used by classes that refer to other
10139b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// variables which may not be defined at the time they expression is formed.
10149b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// If a value is set for the variable later, this method will be called on
10159b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// users of the value to allow the value to propagate out.
10169b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  ///
101705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
10183da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
1019307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const;
1020307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
1021ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  virtual std::string getAsString() const { return getName(); }
1022e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1023e62c1185bee05facc25d1d725434f517261d308bChris Lattner
102407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
10257331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner/// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field.
102607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
1027e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass VarBitInit : public Init {
102805bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *TI;
1029e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned Bit;
1030dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
103105bce0beee87512e52428d4b80f5a8e79a949576David Greene  VarBitInit(TypedInit *T, unsigned B) : TI(T), Bit(B) {
1032307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    assert(T->getType() &&
1033307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao           (dynamic_cast<IntRecTy*>(T->getType()) ||
1034307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao            (dynamic_cast<BitsRecTy*>(T->getType()) &&
1035307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao             dynamic_cast<BitsRecTy*>(T->getType())->getNumBits() > B)) &&
10367331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner           "Illegal VarBitInit expression!");
10377331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner  }
1038e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1039dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarBitInit(const VarBitInit &Other);  // Do not define.
1040dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarBitInit &operator=(const VarBitInit &Other);  // Do not define.
1041dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1042dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
104305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarBitInit *get(TypedInit *T, unsigned B);
1044dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
104505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
104605bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<VarBitInit *>(this));
1047e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1048e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1049307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBitVar() const { return TI; }
1050307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual unsigned getBitNum() const { return Bit; }
10513da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
10523aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
105305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1054307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
1055307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned B) const {
1056307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    assert(B < 1 && "Bit index out of range!");
1057307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    return const_cast<VarBitInit*>(this);
1058307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
1059e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1060e62c1185bee05facc25d1d725434f517261d308bChris Lattner
10613da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman/// VarListElementInit - List[4] - Represent access to one element of a var or
10621dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner/// field.
10631dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit : public TypedInit {
106405bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *TI;
10651dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  unsigned Element;
1066dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
106705bce0beee87512e52428d4b80f5a8e79a949576David Greene  VarListElementInit(TypedInit *T, unsigned E)
1068dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      : TypedInit(dynamic_cast<ListRecTy*>(T->getType())->getElementType()),
1069dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene          TI(T), Element(E) {
10701dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner    assert(T->getType() && dynamic_cast<ListRecTy*>(T->getType()) &&
10711dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner           "Illegal VarBitInit expression!");
10721dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  }
10731dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
1074dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarListElementInit(const VarListElementInit &Other);  // Do not define.
1075dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  VarListElementInit &operator=(const VarListElementInit &Other);  // Do
1076dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene                                                                   // not
1077dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene                                                                   // define.
1078dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1079dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
108005bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarListElementInit *get(TypedInit *T, unsigned E);
1081dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
108205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
108305bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<VarListElementInit *>(this));
10841dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  }
10851dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
108605bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *getVariable() const { return TI; }
10871dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  unsigned getElementNum() const { return Element; }
10881dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
10891dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// resolveListElementReference - This method is used to implement
10901dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// VarListElementInit::resolveReferences.  If the list element is resolvable
10911dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// now, we return the resolved value, otherwise we return null.
109205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R,
109305bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            const RecordVal *RV,
109405bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
10951dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
10963aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
109705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1098307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
1099307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const;
11001dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner};
110107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
110207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// DefInit - AL - Represent a reference to a 'def' in the description
110307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
1104beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass DefInit : public TypedInit {
1105e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *Def;
1106dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
110777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DefInit(Record *D, RecordRecTy *T) : TypedInit(T), Def(D) {}
110877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  friend class Record;
1109dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1110dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  DefInit(const DefInit &Other);  // Do not define.
1111dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  DefInit &operator=(const DefInit &Other);  // Do not define.
1112dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1113e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
111405bce0beee87512e52428d4b80f5a8e79a949576David Greene  static DefInit *get(Record*);
11153da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
111605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
111705bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<DefInit *>(this));
1118e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1119e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1120e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *getDef() const { return Def; }
1121e62c1185bee05facc25d1d725434f517261d308bChris Lattner
112205bce0beee87512e52428d4b80f5a8e79a949576David Greene  //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
1123b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner
1124b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  virtual RecTy *getFieldType(const std::string &FieldName) const;
112505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getFieldInit(Record &R, const RecordVal *RV,
112605bce0beee87512e52428d4b80f5a8e79a949576David Greene                             const std::string &FieldName) const;
11273da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
11283aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
1129beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
1130307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
113150bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal bit reference off def");
1132beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
1133beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
1134beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveListElementReference - This method is used to implement
1135beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
1136beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// now, we return the resolved value, otherwise we return null.
113705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
113805bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
113950bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal element reference off def");
1140beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
1141e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1142e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1143e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1144a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner/// FieldInit - X.Y - Represent a reference to a subfield of a variable
1145a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner///
11467331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass FieldInit : public TypedInit {
114705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Rec;                // Record we are referring to
1148a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  std::string FieldName;    // Field we are accessing
1149dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
115005bce0beee87512e52428d4b80f5a8e79a949576David Greene  FieldInit(Init *R, const std::string &FN)
1151dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene      : TypedInit(R->getFieldType(FN)), Rec(R), FieldName(FN) {
11527331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner    assert(getType() && "FieldInit with non-record type!");
1153a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  }
1154a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
1155dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  FieldInit(const FieldInit &Other);  // Do not define.
1156dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  FieldInit &operator=(const FieldInit &Other);  // Do not define.
1157dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1158dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
115905bce0beee87512e52428d4b80f5a8e79a949576David Greene  static FieldInit *get(Init *R, const std::string &FN);
116005bce0beee87512e52428d4b80f5a8e79a949576David Greene  static FieldInit *get(Init *R, const Init *FN);
1161dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
116205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
116305bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<FieldInit *>(this));
1164a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  }
1165a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
1166307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const;
1167307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
116805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R,
116905bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            const RecordVal *RV,
117005bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
11717331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner
117205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
117324151a6888c752ff1d7fc80b500f5a836c9ac528Chris Lattner
11743aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const {
11753aba4d39fd101238ac06871895c28f26736d80cbChris Lattner    return Rec->getAsString() + "." + FieldName;
1176a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  }
1177a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner};
1178a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
11798c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// DagInit - (v a, b) - Represent a DAG tree value.  DAG inits are required
11808c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// to have at least one value then a (possibly empty) list of arguments.  Each
11818c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// argument can have a name associated with it.
11828e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner///
118378621a851ae84520de7d24a6d61e1dcf25749712David Greeneclass DagInit : public TypedInit, public FoldingSetNode {
118405bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Val;
11857cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman  std::string ValName;
118605bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<Init*> Args;
118791290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  std::vector<std::string> ArgNames;
1188dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
118905bce0beee87512e52428d4b80f5a8e79a949576David Greene  DagInit(Init *V, const std::string &VN,
119005bce0beee87512e52428d4b80f5a8e79a949576David Greene          ArrayRef<Init *> ArgRange,
119178621a851ae84520de7d24a6d61e1dcf25749712David Greene          ArrayRef<std::string> NameRange)
119278621a851ae84520de7d24a6d61e1dcf25749712David Greene      : TypedInit(DagRecTy::get()), Val(V), ValName(VN),
119378621a851ae84520de7d24a6d61e1dcf25749712David Greene          Args(ArgRange.begin(), ArgRange.end()),
119478621a851ae84520de7d24a6d61e1dcf25749712David Greene          ArgNames(NameRange.begin(), NameRange.end()) {}
119521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1196dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  DagInit(const DagInit &Other);  // Do not define.
1197dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene  DagInit &operator=(const DagInit &Other);  // Do not define.
1198dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1199dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
120005bce0beee87512e52428d4b80f5a8e79a949576David Greene  static DagInit *get(Init *V, const std::string &VN,
120105bce0beee87512e52428d4b80f5a8e79a949576David Greene                      ArrayRef<Init *> ArgRange,
120205bce0beee87512e52428d4b80f5a8e79a949576David Greene                      ArrayRef<std::string> NameRange);
120305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static DagInit *get(Init *V, const std::string &VN,
120405bce0beee87512e52428d4b80f5a8e79a949576David Greene                      const std::vector<
120505bce0beee87512e52428d4b80f5a8e79a949576David Greene                        std::pair<Init*, std::string> > &args);
1206dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
120778621a851ae84520de7d24a6d61e1dcf25749712David Greene  void Profile(FoldingSetNodeID &ID) const;
1208dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
120905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
121005bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<DagInit *>(this));
12118e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner  }
12128e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner
121305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperator() const { return Val; }
121491290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner
12157cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman  const std::string &getName() const { return ValName; }
12167cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman
121791290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  unsigned getNumArgs() const { return Args.size(); }
121805bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getArg(unsigned Num) const {
121991290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    assert(Num < Args.size() && "Arg number out of range!");
122091290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    return Args[Num];
122191290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  }
122291290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  const std::string &getArgName(unsigned Num) const {
122391290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    assert(Num < ArgNames.size() && "Arg number out of range!");
122491290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    return ArgNames[Num];
122591290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  }
12268e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner
122705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1228990db46e9ae7faa742a152ca4126d0bee9f1df9cChris Lattner
12293aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
12307674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
123105bce0beee87512e52428d4b80f5a8e79a949576David Greene  typedef std::vector<Init*>::const_iterator       const_arg_iterator;
12327674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  typedef std::vector<std::string>::const_iterator const_name_iterator;
12337674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
12347674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_arg_iterator  arg_begin() const { return Args.begin(); }
12357674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_arg_iterator  arg_end  () const { return Args.end();   }
12367674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
12377674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline size_t              arg_size () const { return Args.size();  }
12387674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline bool                arg_empty() const { return Args.empty(); }
12397674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
12407674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_name_iterator name_begin() const { return ArgNames.begin(); }
12417674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_name_iterator name_end  () const { return ArgNames.end();   }
12427674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
12437674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline size_t              name_size () const { return ArgNames.size();  }
12447674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline bool                name_empty() const { return ArgNames.empty(); }
12457674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
1246307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
124750bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal bit reference off dag");
1248beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
124921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
125005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
125105bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
125250bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal element reference off dag");
1253beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
12548e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner};
1255e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1256e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
1257e62c1185bee05facc25d1d725434f517261d308bChris Lattner//  High-Level Classes
1258e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
1259e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1260e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordVal {
1261011dca7fac07100695dd3685bfaddbea58a468b9David Greene  Init *Name;
1262e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RecTy *Ty;
1263e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned Prefix;
126405bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Value;
1265e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1266011dca7fac07100695dd3685bfaddbea58a468b9David Greene  RecordVal(Init *N, RecTy *T, unsigned P);
1267e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RecordVal(const std::string &N, RecTy *T, unsigned P);
1268e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1269011dca7fac07100695dd3685bfaddbea58a468b9David Greene  const std::string &getName() const;
1270de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene  const Init *getNameInit() const { return Name; }
1271de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene  std::string getNameInitAsString() const {
1272de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene    return getNameInit()->getAsUnquotedString();
1273de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene  }
1274e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1275e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getPrefix() const { return Prefix; }
1276e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RecTy *getType() const { return Ty; }
127705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getValue() const { return Value; }
1278e62c1185bee05facc25d1d725434f517261d308bChris Lattner
127905bce0beee87512e52428d4b80f5a8e79a949576David Greene  bool setValue(Init *V) {
1280e62c1185bee05facc25d1d725434f517261d308bChris Lattner    if (V) {
1281e62c1185bee05facc25d1d725434f517261d308bChris Lattner      Value = V->convertInitializerTo(Ty);
1282e62c1185bee05facc25d1d725434f517261d308bChris Lattner      return Value == 0;
1283e62c1185bee05facc25d1d725434f517261d308bChris Lattner    }
1284e62c1185bee05facc25d1d725434f517261d308bChris Lattner    Value = 0;
1285e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return false;
1286e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1287e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1288e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
12891a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  void print(raw_ostream &OS, bool PrintSem = true) const;
1290e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1291e62c1185bee05facc25d1d725434f517261d308bChris Lattner
12921a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecordVal &RV) {
1293e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RV.print(OS << "  ");
1294e62c1185bee05facc25d1d725434f517261d308bChris Lattner  return OS;
1295e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
1296e62c1185bee05facc25d1d725434f517261d308bChris Lattner
129789e0f74094a6a86170c2c70fe8c6c19cb99c97a0Chris Lattnerclass Record {
12986f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  static unsigned LastID;
12996f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar
13006f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  // Unique record ID.
13016f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  unsigned ID;
13020d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  Init *Name;
1303376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  // Location where record was instantiated, followed by the location of
1304376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  // multiclass prototypes used.
1305376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  SmallVector<SMLoc, 4> Locs;
1306e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  std::vector<Init *> TemplateArgs;
1307e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::vector<RecordVal> Values;
1308e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::vector<Record*> SuperClasses;
130967db883487fca3472fdde51e931657e22d4d0495Chris Lattner
131067db883487fca3472fdde51e931657e22d4d0495Chris Lattner  // Tracks Record instances. Not owned by Record.
131167db883487fca3472fdde51e931657e22d4d0495Chris Lattner  RecordKeeper &TrackedRecords;
131267db883487fca3472fdde51e931657e22d4d0495Chris Lattner
131377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DefInit *TheInit;
131477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
1315f7931b7040de1c829e678b4e391308bc3376f8a0David Greene  void init();
13160d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  void checkName();
13170d886401b3ec09b0c2d267942b07702a2f0740f4David Greene
1318e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1319e62c1185bee05facc25d1d725434f517261d308bChris Lattner
13209c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner  // Constructs a record.
1321376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  explicit Record(const std::string &N, ArrayRef<SMLoc> locs,
1322376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen                  RecordKeeper &records) :
1323376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    ID(LastID++), Name(StringInit::get(N)), Locs(locs.begin(), locs.end()),
1324376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    TrackedRecords(records), TheInit(0) {
1325004adaf3452a355ada2a54bcb61dc8925a718651David Greene    init();
13260abdadbce7e04af76145154d75ca41dab749b8d6David Greene  }
1327376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  explicit Record(Init *N, ArrayRef<SMLoc> locs, RecordKeeper &records) :
1328376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    ID(LastID++), Name(N), Locs(locs.begin(), locs.end()),
1329376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    TrackedRecords(records), TheInit(0) {
1330004adaf3452a355ada2a54bcb61dc8925a718651David Greene    init();
1331675f85d0f240930d571f4e557bb92237ee48124eDavid Greene  }
1332e62c1185bee05facc25d1d725434f517261d308bChris Lattner  ~Record() {}
133321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1334f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov
1335117ccb7e518f05e4bf3df058fc402262f897ff0bChris Lattner  static unsigned getNewUID() { return LastID++; }
1336f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov
1337f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov
13386f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  unsigned getID() const { return ID; }
13396f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar
13400d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  const std::string &getName() const;
1341d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  Init *getNameInit() const {
1342d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene    return Name;
1343d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  }
1344d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  const std::string getNameInitAsString() const {
1345d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene    return getNameInit()->getAsUnquotedString();
1346d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  }
1347d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene
13480d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  void setName(Init *Name);               // Also updates RecordKeeper.
1349936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  void setName(const std::string &Name);  // Also updates RecordKeeper.
135021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1351376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  ArrayRef<SMLoc> getLoc() const { return Locs; }
135221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
135377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  /// get the corresponding DefInit.
135477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DefInit *getDefInit();
135577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
1356e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  const std::vector<Init *> &getTemplateArgs() const {
1357e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return TemplateArgs;
1358e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1359e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::vector<RecordVal> &getValues() const { return Values; }
1360e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::vector<Record*>   &getSuperClasses() const { return SuperClasses; }
1361e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1362e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  bool isTemplateArg(Init *Name) const {
1363e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i)
1364e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (TemplateArgs[i] == Name) return true;
1365e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return false;
1366e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1367e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  bool isTemplateArg(StringRef Name) const {
1368e22b321d2276b634519165b101b02d92c2fcf5c7David Greene    return isTemplateArg(StringInit::get(Name.str()));
1369e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  }
1370e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1371ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  const RecordVal *getValue(const Init *Name) const {
1372e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = Values.size(); i != e; ++i)
1373ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen      if (Values[i].getNameInit() == Name) return &Values[i];
1374e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return 0;
1375e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1376ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  const RecordVal *getValue(StringRef Name) const {
1377ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen    return getValue(StringInit::get(Name));
1378ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  }
1379ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  RecordVal *getValue(const Init *Name) {
1380e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = Values.size(); i != e; ++i)
1381ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen      if (Values[i].getNameInit() == Name) return &Values[i];
1382e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return 0;
1383e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1384ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  RecordVal *getValue(StringRef Name) {
1385ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen    return getValue(StringInit::get(Name));
1386ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  }
138796a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene
1388e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  void addTemplateArg(Init *Name) {
1389e62c1185bee05facc25d1d725434f517261d308bChris Lattner    assert(!isTemplateArg(Name) && "Template arg already defined!");
1390e62c1185bee05facc25d1d725434f517261d308bChris Lattner    TemplateArgs.push_back(Name);
1391e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1392e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  void addTemplateArg(StringRef Name) {
1393e22b321d2276b634519165b101b02d92c2fcf5c7David Greene    addTemplateArg(StringInit::get(Name.str()));
1394e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  }
1395e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1396e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addValue(const RecordVal &RV) {
1397ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen    assert(getValue(RV.getNameInit()) == 0 && "Value already added!");
1398e62c1185bee05facc25d1d725434f517261d308bChris Lattner    Values.push_back(RV);
1399e338565757bfcfe9d762751c976684f66954fb45David Greene    if (Values.size() > 1)
1400e338565757bfcfe9d762751c976684f66954fb45David Greene      // Keep NAME at the end of the list.  It makes record dumps a
1401e338565757bfcfe9d762751c976684f66954fb45David Greene      // bit prettier and allows TableGen tests to be written more
1402e338565757bfcfe9d762751c976684f66954fb45David Greene      // naturally.  Tests can use CHECK-NEXT to look for Record
1403e338565757bfcfe9d762751c976684f66954fb45David Greene      // fields they expect to see after a def.  They can't do that if
1404e338565757bfcfe9d762751c976684f66954fb45David Greene      // NAME is the first Record field.
1405e338565757bfcfe9d762751c976684f66954fb45David Greene      std::swap(Values[Values.size() - 2], Values[Values.size() - 1]);
1406e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1407e62c1185bee05facc25d1d725434f517261d308bChris Lattner
140896a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  void removeValue(Init *Name) {
1409bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner    for (unsigned i = 0, e = Values.size(); i != e; ++i)
141096a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene      if (Values[i].getNameInit() == Name) {
1411bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner        Values.erase(Values.begin()+i);
1412bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner        return;
1413bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner      }
141450bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Cannot remove an entry that does not exist!");
1415bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner  }
1416bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner
141796a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  void removeValue(StringRef Name) {
141896a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene    removeValue(StringInit::get(Name.str()));
141996a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  }
142096a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene
142102475f1fd502fa1729d1fc447417087acf9e96c8Ted Kremenek  bool isSubClassOf(const Record *R) const {
1422e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
1423e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (SuperClasses[i] == R)
1424ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen        return true;
1425e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return false;
1426e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1427e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1428c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  bool isSubClassOf(StringRef Name) const {
1429a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner    for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
14307474c29d903d479e7f99eb0d1d097f75289c5f48David Greene      if (SuperClasses[i]->getNameInitAsString() == Name)
1431a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner        return true;
1432a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner    return false;
1433a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner  }
1434a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner
1435e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addSuperClass(Record *R) {
1436e62c1185bee05facc25d1d725434f517261d308bChris Lattner    assert(!isSubClassOf(R) && "Already subclassing record!");
1437e62c1185bee05facc25d1d725434f517261d308bChris Lattner    SuperClasses.push_back(R);
1438e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1439e62c1185bee05facc25d1d725434f517261d308bChris Lattner
14407dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// resolveReferences - If there are any field references that refer to fields
14417dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// that have been filled in, we can propagate the values now.
14427dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  ///
14437dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  void resolveReferences() { resolveReferencesTo(0); }
14447dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner
14457dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// resolveReferencesTo - If anything in this record refers to RV, replace the
14467dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// reference to RV with the RHS of RV.  If RV is null, we resolve all
14477dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// possible references.
14487dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  void resolveReferencesTo(const RecordVal *RV);
1449e62c1185bee05facc25d1d725434f517261d308bChris Lattner
145067db883487fca3472fdde51e931657e22d4d0495Chris Lattner  RecordKeeper &getRecords() const {
14519c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner    return TrackedRecords;
145267db883487fca3472fdde51e931657e22d4d0495Chris Lattner  }
145367db883487fca3472fdde51e931657e22d4d0495Chris Lattner
1454e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
14555c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
14565c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  //===--------------------------------------------------------------------===//
14575c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  // High-level methods useful to tablegen back-ends
14585c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  //
14595c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
1460c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner  /// getValueInit - Return the initializer for a value with the specified name,
1461c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner  /// or throw an exception if the field does not exist.
1462c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner  ///
146305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getValueInit(StringRef FieldName) const;
1464c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner
14655c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// getValueAsString - This method looks up the specified field and returns
14665c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// its value as a string, throwing an exception if the field does not exist
14675c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// or if the value is not a string.
14685c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  ///
1469c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::string getValueAsString(StringRef FieldName) const;
14705c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
14716f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  /// getValueAsBitsInit - This method looks up the specified field and returns
14726f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  /// its value as a BitsInit, throwing an exception if the field does not exist
14736f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  /// or if the value is not the right type.
14746f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  ///
147505bce0beee87512e52428d4b80f5a8e79a949576David Greene  BitsInit *getValueAsBitsInit(StringRef FieldName) const;
14766f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner
147758c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// getValueAsListInit - This method looks up the specified field and returns
147858c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// its value as a ListInit, throwing an exception if the field does not exist
147958c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// or if the value is not the right type.
148058c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  ///
148105bce0beee87512e52428d4b80f5a8e79a949576David Greene  ListInit *getValueAsListInit(StringRef FieldName) const;
148258c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner
1483b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner  /// getValueAsListOfDefs - This method looks up the specified field and
1484af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov  /// returns its value as a vector of records, throwing an exception if the
1485b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner  /// field does not exist or if the value is not the right type.
1486fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey  ///
1487c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::vector<Record*> getValueAsListOfDefs(StringRef FieldName) const;
1488fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey
1489f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov  /// getValueAsListOfInts - This method looks up the specified field and
1490f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov  /// returns its value as a vector of integers, throwing an exception if the
1491f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov  /// field does not exist or if the value is not the right type.
1492af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov  ///
1493c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const;
149421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1495bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  /// getValueAsListOfStrings - This method looks up the specified field and
1496bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  /// returns its value as a vector of strings, throwing an exception if the
1497bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  /// field does not exist or if the value is not the right type.
1498bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  ///
1499bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  std::vector<std::string> getValueAsListOfStrings(StringRef FieldName) const;
1500bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson
1501dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  /// getValueAsDef - This method looks up the specified field and returns its
1502dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  /// value as a Record, throwing an exception if the field does not exist or if
1503dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  /// the value is not the right type.
1504dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  ///
1505c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  Record *getValueAsDef(StringRef FieldName) const;
1506dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner
15070969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  /// getValueAsBit - This method looks up the specified field and returns its
15080969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  /// value as a bit, throwing an exception if the field does not exist or if
15090969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  /// the value is not the right type.
15100969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  ///
1511c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  bool getValueAsBit(StringRef FieldName) const;
15120969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner
1513c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  /// getValueAsBitOrUnset - This method looks up the specified field and
1514c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  /// returns its value as a bit. If the field is unset, sets Unset to true and
1515c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  /// retunrs false.
1516c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  ///
1517c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  bool getValueAsBitOrUnset(StringRef FieldName, bool &Unset) const;
1518c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen
151958c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// getValueAsInt - This method looks up the specified field and returns its
152063f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  /// value as an int64_t, throwing an exception if the field does not exist or
152163f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  /// if the value is not the right type.
152258c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  ///
1523c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  int64_t getValueAsInt(StringRef FieldName) const;
1524784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner
1525784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  /// getValueAsDag - This method looks up the specified field and returns its
1526784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  /// value as an Dag, throwing an exception if the field does not exist or if
1527784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  /// the value is not the right type.
1528784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  ///
152905bce0beee87512e52428d4b80f5a8e79a949576David Greene  DagInit *getValueAsDag(StringRef FieldName) const;
1530e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1531e62c1185bee05facc25d1d725434f517261d308bChris Lattner
15321a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const Record &R);
1533e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1534c7cafcd815519b06318629b424abe746437e1389David Greenestruct MultiClass {
1535c7cafcd815519b06318629b424abe746437e1389David Greene  Record Rec;  // Placeholder for template args and Name.
1536c7cafcd815519b06318629b424abe746437e1389David Greene  typedef std::vector<Record*> RecordVector;
1537c7cafcd815519b06318629b424abe746437e1389David Greene  RecordVector DefPrototypes;
1538d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene
1539d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene  void dump() const;
1540d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene
15414b18691c3580674691875ec37c84a1c4edf2d586Jim Grosbach  MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) :
154267db883487fca3472fdde51e931657e22d4d0495Chris Lattner    Rec(Name, Loc, Records) {}
1543c7cafcd815519b06318629b424abe746437e1389David Greene};
1544c7cafcd815519b06318629b424abe746437e1389David Greene
1545e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordKeeper {
1546e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::map<std::string, Record*> Classes, Defs;
1547cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene
1548e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1549e62c1185bee05facc25d1d725434f517261d308bChris Lattner  ~RecordKeeper() {
1550e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (std::map<std::string, Record*>::iterator I = Classes.begin(),
1551ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen           E = Classes.end(); I != E; ++I)
1552e62c1185bee05facc25d1d725434f517261d308bChris Lattner      delete I->second;
1553e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (std::map<std::string, Record*>::iterator I = Defs.begin(),
1554ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen           E = Defs.end(); I != E; ++I)
1555e62c1185bee05facc25d1d725434f517261d308bChris Lattner      delete I->second;
1556e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
15573da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
1558e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::map<std::string, Record*> &getClasses() const { return Classes; }
1559e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::map<std::string, Record*> &getDefs() const { return Defs; }
1560e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1561e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *getClass(const std::string &Name) const {
1562e62c1185bee05facc25d1d725434f517261d308bChris Lattner    std::map<std::string, Record*>::const_iterator I = Classes.find(Name);
1563e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return I == Classes.end() ? 0 : I->second;
1564e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1565e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *getDef(const std::string &Name) const {
1566e62c1185bee05facc25d1d725434f517261d308bChris Lattner    std::map<std::string, Record*>::const_iterator I = Defs.find(Name);
1567e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return I == Defs.end() ? 0 : I->second;
1568e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1569e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addClass(Record *R) {
157072cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    bool Ins = Classes.insert(std::make_pair(R->getName(), R)).second;
157172cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    (void)Ins;
157272cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    assert(Ins && "Class already exists");
1573e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1574e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addDef(Record *R) {
157572cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    bool Ins = Defs.insert(std::make_pair(R->getName(), R)).second;
157672cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    (void)Ins;
157772cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    assert(Ins && "Record already exists");
1578e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1579e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1580936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  /// removeClass - Remove, but do not delete, the specified record.
1581936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  ///
1582936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  void removeClass(const std::string &Name) {
1583936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    assert(Classes.count(Name) && "Class does not exist!");
1584936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    Classes.erase(Name);
1585936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  }
1586936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  /// removeDef - Remove, but do not delete, the specified record.
1587936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  ///
1588936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  void removeDef(const std::string &Name) {
1589936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    assert(Defs.count(Name) && "Def does not exist!");
1590936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    Defs.erase(Name);
1591936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  }
159221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1593ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  //===--------------------------------------------------------------------===//
1594ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  // High-level helper methods, useful for tablegen backends...
1595ab47ae3381aa2372009a9054260461c20324b555Chris Lattner
1596ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  /// getAllDerivedDefinitions - This method returns all concrete definitions
1597ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  /// that derive from the specified class name.  If a class with the specified
15985c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// name does not exist, an exception is thrown.
15995c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  std::vector<Record*>
16005c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  getAllDerivedDefinitions(const std::string &ClassName) const;
1601ab47ae3381aa2372009a9054260461c20324b555Chris Lattner
1602e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
1603e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1604e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1605690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// LessRecord - Sorting predicate to sort record pointers by name.
1606690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner///
1607690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecord {
1608690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  bool operator()(const Record *Rec1, const Record *Rec2) const {
1609160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen    return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0;
1610690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  }
1611690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner};
1612690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner
161321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// LessRecordFieldName - Sorting predicate to sort record pointers by their
16147c9a7728d9dd248ebee8f2dd969d303711d487a9Jim Grosbach/// name field.
1615690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner///
1616690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecordFieldName {
1617690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  bool operator()(const Record *Rec1, const Record *Rec2) const {
1618690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner    return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name");
1619690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  }
1620690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner};
1621690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner
16221a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK);
1623e62c1185bee05facc25d1d725434f517261d308bChris Lattner
162430c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring
162530c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name.
162630c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass,
162730c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene                  Init *Name, const std::string &Scoper);
162830c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene
162930c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring
163030c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name.
163130c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass,
163230c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene                  const std::string &Name, const std::string &Scoper);
163330c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene
1634d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
1635d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
1636e62c1185bee05facc25d1d725434f517261d308bChris Lattner#endif
1637