Record.h revision 135fe6ac5f5b80ef68c19b3ec7bb0063e28f2bab
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"
2189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva#include "llvm/Support/Casting.h"
223cc52ea33c0b96d1682f14fc45c45b57df0f39b6Michael J. Spencer#include "llvm/Support/DataTypes.h"
2350bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper#include "llvm/Support/ErrorHandling.h"
24255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/SourceMgr.h"
251a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar#include "llvm/Support/raw_ostream.h"
26e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include <map>
27028936ada14335bb04f377d46a6261dc4c66dafdJohn Criswell
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
291a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarclass raw_ostream;
3021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
317dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// RecTy subclasses.
327cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitRecTy;
337cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass BitsRecTy;
347cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass IntRecTy;
357cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass StringRecTy;
367cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass ListRecTy;
3740f71134b9fef0ca06c516f033cc9403394a913cChris Lattnerclass DagRecTy;
387cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerclass RecordRecTy;
397cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
407dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// Init subclasses.
41afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init;
42e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass UnsetInit;
43e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit;
44e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsInit;
45e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass IntInit;
46e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass StringInit;
47e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListInit;
48e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit;
49711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattnerclass BinOpInit;
504afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit;
51e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass DefInit;
528e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattnerclass DagInit;
53b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass TypedInit;
54b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarInit;
55a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattnerclass FieldInit;
56b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattnerclass VarBitInit;
571dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit;
587cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
597dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner// Other classes.
60e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass Record;
617dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattnerclass RecordVal;
62293b13350c2fbae8a64b0b0beb440cb859968c8cBob Wilsonstruct MultiClass;
6367db883487fca3472fdde51e931657e22d4d0495Chris Lattnerclass RecordKeeper;
64e62c1185bee05facc25d1d725434f517261d308bChris Lattner
65e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
66e62c1185bee05facc25d1d725434f517261d308bChris Lattner//  Type Classes
67e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
68e62c1185bee05facc25d1d725434f517261d308bChris Lattner
6977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenclass RecTy {
7089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silvapublic:
7189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  /// \brief Subclass discriminator (for dyn_cast<> et al.)
7289adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  enum RecTyKind {
7389adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    BitRecTyKind,
7489adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    BitsRecTyKind,
7589adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    IntRecTyKind,
7689adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    StringRecTyKind,
7789adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    ListRecTyKind,
7889adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    DagRecTyKind,
7989adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    RecordRecTyKind
8089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  };
8189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
8289adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silvaprivate:
8389adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  RecTyKind Kind;
8477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  ListRecTy *ListTy;
852d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
8689adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
8777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
8889adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  RecTyKind getRecTyKind() const { return Kind; }
8989adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
9089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  RecTy(RecTyKind K) : Kind(K), ListTy(0) {}
91e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual ~RecTy() {}
92e62c1185bee05facc25d1d725434f517261d308bChris Lattner
9399ba1f7b8deaf2a296c98600dbf593754cbd43a2Chris Lattner  virtual std::string getAsString() const = 0;
941a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  void print(raw_ostream &OS) const { OS << getAsString(); }
957cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  void dump() const;
967cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
977cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  /// typeIsConvertibleTo - Return true if all values of 'this' type can be
987cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  /// converted to the specified type.
997cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  virtual bool typeIsConvertibleTo(const RecTy *RHS) const = 0;
1007cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
10177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  /// getListTy - Returns the type representing list<this>.
10277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  ListRecTy *getListTy();
10377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
1047cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerpublic:   // These methods should only be called from subclasses of Init
10505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return 0; }
10605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
10705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
10805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
10905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
11005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
11105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) {
11205bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)UI);
113e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  }
11405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) {
11505bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)UI);
116e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  }
11705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) {
11805bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)UI);
1194afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  }
12005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
12105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
12205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
12305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI) { return 0; }
12405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) {
12505bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)VI);
126b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner  }
12705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) {
12805bce0beee87512e52428d4b80f5a8e79a949576David Greene    return convertValue((TypedInit*)FI);
129b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner  }
130e62c1185bee05facc25d1d725434f517261d308bChris Lattner
13137fda193d292d78c672b8019723c7907af312c43Sean Silvapublic:
13237fda193d292d78c672b8019723c7907af312c43Sean Silva  virtual bool baseClassOf(const RecTy*) const;
133e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
134e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1351a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecTy &Ty) {
136e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Ty.print(OS);
137e62c1185bee05facc25d1d725434f517261d308bChris Lattner  return OS;
138e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
139e62c1185bee05facc25d1d725434f517261d308bChris Lattner
14007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
14107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitRecTy - 'bit' - Represent a single bit
14207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
1431fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass BitRecTy : public RecTy {
14477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static BitRecTy Shared;
14589adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  BitRecTy() : RecTy(BitRecTyKind) {}
1461fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
14789adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  static bool classof(const RecTy *RT) {
14889adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    return RT->getRecTyKind() == BitRecTyKind;
14989adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  }
15089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
15177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static BitRecTy *get() { return &Shared; }
15277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
15305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
15405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return (Init*)BI; }
15505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI);
15605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II);
15705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
15805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
15905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return (Init*)VB; }
16005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
16105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
16205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
16305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
16405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
16505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
16605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
16705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
168e62c1185bee05facc25d1d725434f517261d308bChris Lattner
169ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual std::string getAsString() const { return "bit"; }
1707cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
171ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {
1727cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
1737cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
17437fda193d292d78c672b8019723c7907af312c43Sean Silva  virtual bool baseClassOf(const RecTy*) const;
175e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
176e62c1185bee05facc25d1d725434f517261d308bChris Lattner
17707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
1781b2c94713600531ddeefb23cd10c49cd533aa09bEli Bendersky/// BitsRecTy - 'bits<n>' - Represent a fixed number of bits
17907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
180e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsRecTy : public RecTy {
181e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned Size;
18289adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  explicit BitsRecTy(unsigned Sz) : RecTy(BitsRecTyKind), Size(Sz) {}
18377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
18489adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  static bool classof(const RecTy *RT) {
18589adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    return RT->getRecTyKind() == BitsRecTyKind;
18689adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  }
18789adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
18877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static BitsRecTy *get(unsigned Sz);
189e62c1185bee05facc25d1d725434f517261d308bChris Lattner
190e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getNumBits() const { return Size; }
191e62c1185bee05facc25d1d725434f517261d308bChris Lattner
19205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI);
19305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *UI);
19405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI);
19505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II);
19605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
19705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
19805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
19905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
20005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
20105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
20205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
20305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
20405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
20505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
20605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
207ead87b671278379f92890fddd859a301bb68f462Reid Spencer
208ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual std::string getAsString() const;
2097cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
210ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {
2117cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
2127cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
21337fda193d292d78c672b8019723c7907af312c43Sean Silva  virtual bool baseClassOf(const RecTy*) const;
214e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
215e62c1185bee05facc25d1d725434f517261d308bChris Lattner
21607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
21707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntRecTy - 'int' - Represent an integer value of no particular size
21807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
2191fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass IntRecTy : public RecTy {
22077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static IntRecTy Shared;
22189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  IntRecTy() : RecTy(IntRecTyKind) {}
2221fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
22389adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  static bool classof(const RecTy *RT) {
22489adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    return RT->getRecTyKind() == IntRecTyKind;
22589adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  }
22689adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
22777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static IntRecTy *get() { return &Shared; }
22877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
22905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
23005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI);
23105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI);
23205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return (Init*)II; }
23305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
23405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
23505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
23605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
23705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
23805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
23905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
24005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
24105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
24205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
24305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
244ead87b671278379f92890fddd859a301bb68f462Reid Spencer
245ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual std::string getAsString() const { return "int"; }
2467cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
247ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {
2487cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
2497cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
2507cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
25137fda193d292d78c672b8019723c7907af312c43Sean Silva  virtual bool baseClassOf(const RecTy*) const;
252e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
253e62c1185bee05facc25d1d725434f517261d308bChris Lattner
25407278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringRecTy - 'string' - Represent an string value
25507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
2561fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass StringRecTy : public RecTy {
25777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static StringRecTy Shared;
25889adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  StringRecTy() : RecTy(StringRecTyKind) {}
2591fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
26089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  static bool classof(const RecTy *RT) {
26189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    return RT->getRecTyKind() == StringRecTyKind;
26289adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  }
26389adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
26477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static StringRecTy *get() { return &Shared; }
26577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
26605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
26705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
26805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
26905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
27005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return (Init*)SI; }
27105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
27205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *BO);
27305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *BO);
27405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
27505bce0beee87512e52428d4b80f5a8e79a949576David Greene
27605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
27705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
27805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
27905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
28005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
28105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
282ead87b671278379f92890fddd859a301bb68f462Reid Spencer
283ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual std::string getAsString() const { return "string"; }
2847cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
285ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {
2867cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
2877cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
288e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
289e62c1185bee05facc25d1d725434f517261d308bChris Lattner
2901b2c94713600531ddeefb23cd10c49cd533aa09bEli Bendersky/// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of
2911b2c94713600531ddeefb23cd10c49cd533aa09bEli Bendersky/// the specified type.
29207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
293e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListRecTy : public RecTy {
2947cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  RecTy *Ty;
29589adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  explicit ListRecTy(RecTy *T) : RecTy(ListRecTyKind), Ty(T) {}
29677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  friend ListRecTy *RecTy::getListTy();
29777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
29889adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  static bool classof(const RecTy *RT) {
29989adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    return RT->getRecTyKind() == ListRecTyKind;
30089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  }
30189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
30277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static ListRecTy *get(RecTy *T) { return T->getListTy(); }
3037cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  RecTy *getElementType() const { return Ty; }
304f1b36f9a71eb267f04b7bd3a32aca9bc69f71e97Chris Lattner
30505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
30605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
30705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
30805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
30905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
31005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI);
31105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
31205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
31305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
31405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
31505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
31605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
31705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
31805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
31905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
3203da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
321ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual std::string getAsString() const;
3227cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
323ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {
3247cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
3257cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
3267cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
32737fda193d292d78c672b8019723c7907af312c43Sean Silva  virtual bool baseClassOf(const RecTy*) const;
328f05760de76b4ec26474da18c97770ca369972cfdChris Lattner};
329f05760de76b4ec26474da18c97770ca369972cfdChris Lattner
33040f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/// DagRecTy - 'dag' - Represent a dag fragment
33140f71134b9fef0ca06c516f033cc9403394a913cChris Lattner///
3321fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass DagRecTy : public RecTy {
33377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static DagRecTy Shared;
33489adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  DagRecTy() : RecTy(DagRecTyKind) {}
3351fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
33689adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  static bool classof(const RecTy *RT) {
33789adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    return RT->getRecTyKind() == DagRecTyKind;
33889adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  }
33989adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
34077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static DagRecTy *get() { return &Shared; }
34177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
34205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
34305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
34405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
34505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
34605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
34705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
34805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
34905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI) { return 0; }
35005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *BO);
35105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *BO);
35205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
35305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *CI) { return (Init*)CI; }
35405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *TI);
35505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
35605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
35740f71134b9fef0ca06c516f033cc9403394a913cChris Lattner
358ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual std::string getAsString() const { return "dag"; }
35940f71134b9fef0ca06c516f033cc9403394a913cChris Lattner
360ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {
36140f71134b9fef0ca06c516f033cc9403394a913cChris Lattner    return RHS->baseClassOf(this);
36240f71134b9fef0ca06c516f033cc9403394a913cChris Lattner  }
36340f71134b9fef0ca06c516f033cc9403394a913cChris Lattner};
36440f71134b9fef0ca06c516f033cc9403394a913cChris Lattner
365f05760de76b4ec26474da18c97770ca369972cfdChris Lattner
366234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// RecordRecTy - '[classname]' - Represent an instance of a class, such as:
36707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// (R32 X = EAX).
36807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
369e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordRecTy : public RecTy {
370e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *Rec;
37189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  explicit RecordRecTy(Record *R) : RecTy(RecordRecTyKind), Rec(R) {}
37277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  friend class Record;
37377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic:
37489adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  static bool classof(const RecTy *RT) {
37589adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva    return RT->getRecTyKind() == RecordRecTyKind;
37689adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva  }
37789adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva
37877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  static RecordRecTy *get(Record *R);
379e62c1185bee05facc25d1d725434f517261d308bChris Lattner
380a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  Record *getRecord() const { return Rec; }
381a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
38205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
38305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   BitInit *BI) { return 0; }
38405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  BitsInit *BI) { return 0; }
38505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   IntInit *II) { return 0; }
38605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(StringInit *SI) { return 0; }
38705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(  ListInit *LI) { return 0; }
38805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(VarBitInit *VB) { return 0; }
38905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
39005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
39105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
39205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DefInit *DI);
39305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   DagInit *DI) { return 0; }
39405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( TypedInit *VI);
39505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
39605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
397e62c1185bee05facc25d1d725434f517261d308bChris Lattner
398ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual std::string getAsString() const;
3997cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
400ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {
4017cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return RHS->baseClassOf(this);
4027cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  }
40337fda193d292d78c672b8019723c7907af312c43Sean Silva  virtual bool baseClassOf(const RecTy*) const;
404e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
405e62c1185bee05facc25d1d725434f517261d308bChris Lattner
40621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// resolveTypes - Find a common type that T1 and T2 convert to.
407e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene/// Return 0 if no such type exists.
408e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene///
409e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid GreeneRecTy *resolveTypes(RecTy *T1, RecTy *T2);
41007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
411e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
412e62c1185bee05facc25d1d725434f517261d308bChris Lattner//  Initializer Classes
413e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
414e62c1185bee05facc25d1d725434f517261d308bChris Lattner
415afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init {
416b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silvaprotected:
417b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// \brief Discriminator enum (for isa<>, dyn_cast<>, et al.)
418b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  ///
419b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// This enum is laid out by a preorder traversal of the inheritance
420b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// hierarchy, and does not contain an entry for abstract classes, as per
421b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// the recommendation in docs/HowToSetUpLLVMStyleRTTI.rst.
422b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  ///
423b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// We also explicitly include "first" and "last" values for each
424b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// interior node of the inheritance tree, to make it easier to read the
425b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// corresponding classof().
426b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  ///
427b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// We could pack these a bit tighter by not having the IK_FirstXXXInit
428b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// and IK_LastXXXInit be their own values, but that would degrade
429b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  /// readability for really no benefit.
430b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  enum InitKind {
431b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_BitInit,
432b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_BitsInit,
433b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_FirstTypedInit,
434b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_DagInit,
435b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_DefInit,
436b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_FieldInit,
437b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_IntInit,
438b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_ListInit,
439b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_FirstOpInit,
440b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_BinOpInit,
441b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_TernOpInit,
442b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_UnOpInit,
443b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_LastOpInit,
444b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_StringInit,
445b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_VarInit,
446b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_VarListElementInit,
447b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_LastTypedInit,
448b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_UnsetInit,
449b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    IK_VarBitInit
450b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  };
451b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva
452b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silvaprivate:
453b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  const InitKind Kind;
454a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  Init(const Init &) LLVM_DELETED_FUNCTION;
455a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  Init &operator=(const Init &) LLVM_DELETED_FUNCTION;
4562d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
457dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
458b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silvapublic:
459b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  InitKind getKind() const { return Kind; }
460b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva
461dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected:
462b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  explicit Init(InitKind K) : Kind(K) {}
463dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
464afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greenepublic:
465e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual ~Init() {}
466e62c1185bee05facc25d1d725434f517261d308bChris Lattner
467f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// isComplete - This virtual method should be overridden by values that may
468f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// not be completely specified yet.
469f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  virtual bool isComplete() const { return true; }
470f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner
471f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// print - Print out this value.
4721a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  void print(raw_ostream &OS) const { OS << getAsString(); }
4733aba4d39fd101238ac06871895c28f26736d80cbChris Lattner
4743aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  /// getAsString - Convert this value to a string form.
4753aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const = 0;
4760b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// getAsUnquotedString - Convert this value to a string form,
4770b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// without adding quote markers.  This primaruly affects
4780b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// StringInits where we will not surround the string value with
4790b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  /// quotes.
4804b18691c3580674691875ec37c84a1c4edf2d586Jim Grosbach  virtual std::string getAsUnquotedString() const { return getAsString(); }
481f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner
482f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// dump - Debugging method that may be called through a debugger, just
4831a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  /// invokes print on stderr.
484e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
485e62c1185bee05facc25d1d725434f517261d308bChris Lattner
486f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// convertInitializerTo - This virtual function is a simple call-back
487f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// function that should be overridden to call the appropriate
488f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// RecTy::convertValue method.
489f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  ///
49005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const = 0;
491f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner
492f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// convertInitializerBitRange - This method is used to implement the bitrange
493f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// selection operator.  Given an initializer, it selects the specified bits
4947331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner  /// out, returning them as a new init of bits type.  If it is not legal to use
4957331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner  /// the bit subscript operator on this initializer, return null.
496f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  ///
49705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
498f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const {
499e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return 0;
500e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
501e62c1185bee05facc25d1d725434f517261d308bChris Lattner
502b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// convertInitListSlice - This method is used to implement the list slice
503b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// selection operator.  Given an initializer, it selects the specified list
504b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// elements, returning them as a new init of list type.  If it is not legal
505b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  /// to take a slice of this, return null.
506b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  ///
50705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
508f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitListSlice(const std::vector<unsigned> &Elements) const {
509b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner    return 0;
510b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner  }
511b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner
512a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  /// getFieldType - This method is used to implement the FieldInit class.
513a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  /// Implementors of this method should return the type of the named field if
514a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  /// they are of record type.
515a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  ///
516a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  virtual RecTy *getFieldType(const std::string &FieldName) const { return 0; }
517a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
518b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  /// getFieldInit - This method complements getFieldType to return the
519b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  /// initializer for the specified field.  If getFieldType returns non-null
520b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  /// this method should return non-null, otherwise it returns null.
521b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  ///
52205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getFieldInit(Record &R, const RecordVal *RV,
52305bce0beee87512e52428d4b80f5a8e79a949576David Greene                             const std::string &FieldName) const {
524b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner    return 0;
525b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  }
5263da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
527f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// resolveReferences - This method is used by classes that refer to other
528a8449e6aaa6f494d85e75d4755f9c47abf1e06ceBob Wilson  /// variables which may not be defined at the time the expression is formed.
529f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// If a value is set for the variable later, this method will be called on
530f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  /// users of the value to allow the value to propagate out.
531f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner  ///
53205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const {
53305bce0beee87512e52428d4b80f5a8e79a949576David Greene    return const_cast<Init *>(this);
5347dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  }
535307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
536307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// getBit - This method is used to return the initializer for the specified
537307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// bit.
538307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const = 0;
539307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
540307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// getBitVar - This method is used to retrieve the initializer for bit
541307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// reference. For non-VarBitInit, it simply returns itself.
542307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBitVar() const { return const_cast<Init*>(this); }
543307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
544307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// getBitNum - This method is used to retrieve the bit number of a bit
545307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  /// reference. For non-VarBitInit, it simply returns 0.
546307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual unsigned getBitNum() const { return 0; }
547e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
548e62c1185bee05facc25d1d725434f517261d308bChris Lattner
5491a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const Init &I) {
550e62c1185bee05facc25d1d725434f517261d308bChris Lattner  I.print(OS); return OS;
551e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
552e62c1185bee05facc25d1d725434f517261d308bChris Lattner
553beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// TypedInit - This is the common super-class of types that have a specific,
554beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// explicit, type.
555beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene///
556beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass TypedInit : public Init {
557beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  RecTy *Ty;
558dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
559a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  TypedInit(const TypedInit &Other) LLVM_DELETED_FUNCTION;
560a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  TypedInit &operator=(const TypedInit &Other) LLVM_DELETED_FUNCTION;
561dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
562dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected:
563b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  explicit TypedInit(InitKind K, RecTy *T) : Init(K), Ty(T) {}
564d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher
565dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
566b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
567b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() >= IK_FirstTypedInit &&
568b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva           I->getKind() <= IK_LastTypedInit;
569b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
570beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  RecTy *getType() const { return Ty; }
571beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
57205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
573f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
57405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
575f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitListSlice(const std::vector<unsigned> &Elements) const;
576beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
5779703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  /// getFieldType - This method is used to implement the FieldInit class.
5789703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  /// Implementors of this method should return the type of the named field if
5799703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  /// they are of record type.
5809703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  ///
5819703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene  virtual RecTy *getFieldType(const std::string &FieldName) const;
5829703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene
583beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveListElementReference - This method is used to implement
584beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
585beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// now, we return the resolved value, otherwise we return null.
58605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
58705bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const = 0;
588beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene};
589beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
59007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
59107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// UnsetInit - ? - Represents an uninitialized value
59207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
5931fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass UnsetInit : public Init {
594b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  UnsetInit() : Init(IK_UnsetInit) {}
595a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  UnsetInit(const UnsetInit &) LLVM_DELETED_FUNCTION;
596a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  UnsetInit &operator=(const UnsetInit &Other) LLVM_DELETED_FUNCTION;
5972d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
598dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
5991fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
600b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
601b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_UnsetInit;
602b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
60305bce0beee87512e52428d4b80f5a8e79a949576David Greene  static UnsetInit *get();
604dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
60505bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
60605bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<UnsetInit *>(this));
607e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
608e62c1185bee05facc25d1d725434f517261d308bChris Lattner
609307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
610307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    return const_cast<UnsetInit*>(this);
611307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
612307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
613e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual bool isComplete() const { return false; }
6143aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return "?"; }
615e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
616e62c1185bee05facc25d1d725434f517261d308bChris Lattner
61707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
61807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitInit - true/false - Represent a concrete initializer for a bit.
61907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
620e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit : public Init {
621e62c1185bee05facc25d1d725434f517261d308bChris Lattner  bool Value;
622dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
623b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  explicit BitInit(bool V) : Init(IK_BitInit), Value(V) {}
624a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  BitInit(const BitInit &Other) LLVM_DELETED_FUNCTION;
625a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  BitInit &operator=(BitInit &Other) LLVM_DELETED_FUNCTION;
6262d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
627dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
628dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
629b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
630b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_BitInit;
631b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
63205bce0beee87512e52428d4b80f5a8e79a949576David Greene  static BitInit *get(bool V);
633e62c1185bee05facc25d1d725434f517261d308bChris Lattner
634e62c1185bee05facc25d1d725434f517261d308bChris Lattner  bool getValue() const { return Value; }
635e62c1185bee05facc25d1d725434f517261d308bChris Lattner
63605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
63705bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<BitInit *>(this));
638e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
639e62c1185bee05facc25d1d725434f517261d308bChris Lattner
640307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
641307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    assert(Bit < 1 && "Bit index out of range!");
642307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    return const_cast<BitInit*>(this);
643307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
644307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
6453aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return Value ? "1" : "0"; }
646e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
647e62c1185bee05facc25d1d725434f517261d308bChris Lattner
64807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value.
64907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// It contains a vector of bits, whose size is determined by the type.
65007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
651726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greeneclass BitsInit : public Init, public FoldingSetNode {
65205bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<Init*> Bits;
653dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
654b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  BitsInit(ArrayRef<Init *> Range)
655b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    : Init(IK_BitsInit), Bits(Range.begin(), Range.end()) {}
656e62c1185bee05facc25d1d725434f517261d308bChris Lattner
657a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  BitsInit(const BitsInit &Other) LLVM_DELETED_FUNCTION;
658a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  BitsInit &operator=(const BitsInit &Other) LLVM_DELETED_FUNCTION;
659dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
660dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
661b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
662b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_BitsInit;
663b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
66405bce0beee87512e52428d4b80f5a8e79a949576David Greene  static BitsInit *get(ArrayRef<Init *> Range);
665dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
666726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene  void Profile(FoldingSetNodeID &ID) const;
667726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene
668e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getNumBits() const { return Bits.size(); }
669e62c1185bee05facc25d1d725434f517261d308bChris Lattner
67005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
67105bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<BitsInit *>(this));
672e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
67305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
674f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
675e62c1185bee05facc25d1d725434f517261d308bChris Lattner
676e62c1185bee05facc25d1d725434f517261d308bChris Lattner  virtual bool isComplete() const {
677e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0; i != getNumBits(); ++i)
678e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (!getBit(i)->isComplete()) return false;
679e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return true;
680e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
6811808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen  bool allInComplete() const {
6821808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen    for (unsigned i = 0; i != getNumBits(); ++i)
6831808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen      if (getBit(i)->isComplete()) return false;
6841808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen    return true;
6851808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen  }
6863aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
687e62c1185bee05facc25d1d725434f517261d308bChris Lattner
68805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
689307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
690307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
691307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    assert(Bit < Bits.size() && "Bit index out of range!");
692307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    return Bits[Bit];
693307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
694e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
695e62c1185bee05facc25d1d725434f517261d308bChris Lattner
69607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
697135fe6ac5f5b80ef68c19b3ec7bb0063e28f2babBenjamin Kramer/// IntInit - 7 - Represent an initialization by a literal integer value.
69807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
699e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greeneclass IntInit : public TypedInit {
70063f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t Value;
701dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
702b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  explicit IntInit(int64_t V)
703b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    : TypedInit(IK_IntInit, IntRecTy::get()), Value(V) {}
704e62c1185bee05facc25d1d725434f517261d308bChris Lattner
705a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  IntInit(const IntInit &Other) LLVM_DELETED_FUNCTION;
706a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  IntInit &operator=(const IntInit &Other) LLVM_DELETED_FUNCTION;
707dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
708dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
709b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
710b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_IntInit;
711b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
71205bce0beee87512e52428d4b80f5a8e79a949576David Greene  static IntInit *get(int64_t V);
713dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
71463f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  int64_t getValue() const { return Value; }
715e62c1185bee05facc25d1d725434f517261d308bChris Lattner
71605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
71705bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<IntInit *>(this));
718e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
71905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *
720f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene  convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
721e62c1185bee05facc25d1d725434f517261d308bChris Lattner
7223aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
723e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene
724e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// resolveListElementReference - This method is used to implement
725e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
726e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// now, we return the resolved value, otherwise we return null.
72705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
72805bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
72950bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal element reference off int");
730e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  }
731307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
732307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
733236bcf1fcd6164d624956c0858593c1a780b9a0bAaron Ballman    return BitInit::get((Value & (1ULL << Bit)) != 0);
734307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
735e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
736e62c1185bee05facc25d1d725434f517261d308bChris Lattner
73707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
73807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringInit - "foo" - Represent an initialization by a string value.
73907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
740beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass StringInit : public TypedInit {
741e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::string Value;
742dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
743d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit StringInit(const std::string &V)
744b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    : TypedInit(IK_StringInit, StringRecTy::get()), Value(V) {}
745e62c1185bee05facc25d1d725434f517261d308bChris Lattner
746a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  StringInit(const StringInit &Other) LLVM_DELETED_FUNCTION;
747a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  StringInit &operator=(const StringInit &Other) LLVM_DELETED_FUNCTION;
7482d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
749dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
750dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
751b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
752b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_StringInit;
753b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
754ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  static StringInit *get(StringRef);
755dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
7565c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  const std::string &getValue() const { return Value; }
7575c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
75805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
75905bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<StringInit *>(this));
760e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
761e62c1185bee05facc25d1d725434f517261d308bChris Lattner
7623aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const { return "\"" + Value + "\""; }
7630b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene  virtual std::string getAsUnquotedString() const { return Value; }
764beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
765beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveListElementReference - This method is used to implement
766beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
767beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// now, we return the resolved value, otherwise we return null.
76805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
76905bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
77050bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal element reference off string");
771beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
772307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
773307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
774307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    llvm_unreachable("Illegal bit reference off string");
775307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
776e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
777e62c1185bee05facc25d1d725434f517261d308bChris Lattner
77807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// ListInit - [AL, AH, CL] - Represent a list of defs
77907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
780aad4c9fc37b38cae21343173084c81d789535446David Greeneclass ListInit : public TypedInit, public FoldingSetNode {
78105bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<Init*> Values;
782e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
78305bce0beee87512e52428d4b80f5a8e79a949576David Greene  typedef std::vector<Init*>::const_iterator const_iterator;
7845f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene
785aad4c9fc37b38cae21343173084c81d789535446David Greeneprivate:
78605bce0beee87512e52428d4b80f5a8e79a949576David Greene  explicit ListInit(ArrayRef<Init *> Range, RecTy *EltTy)
787b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    : TypedInit(IK_ListInit, ListRecTy::get(EltTy)),
788b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva      Values(Range.begin(), Range.end()) {}
789e62c1185bee05facc25d1d725434f517261d308bChris Lattner
790a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  ListInit(const ListInit &Other) LLVM_DELETED_FUNCTION;
791a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  ListInit &operator=(const ListInit &Other) LLVM_DELETED_FUNCTION;
792dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
793dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
794b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
795b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_ListInit;
796b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
79705bce0beee87512e52428d4b80f5a8e79a949576David Greene  static ListInit *get(ArrayRef<Init *> Range, RecTy *EltTy);
798dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
799aad4c9fc37b38cae21343173084c81d789535446David Greene  void Profile(FoldingSetNodeID &ID) const;
800aad4c9fc37b38cae21343173084c81d789535446David Greene
8017cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner  unsigned getSize() const { return Values.size(); }
80205bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getElement(unsigned i) const {
8037cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    assert(i < Values.size() && "List element index out of range!");
8047cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    return Values[i];
805e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
806e62c1185bee05facc25d1d725434f517261d308bChris Lattner
80750d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner  Record *getElementAsRecord(unsigned i) const;
80821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
809ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual Init *
810ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper    convertInitListSlice(const std::vector<unsigned> &Elements) const;
811b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner
81205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
81305bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<ListInit *>(this));
814e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
815e62c1185bee05facc25d1d725434f517261d308bChris Lattner
8161dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// resolveReferences - This method is used by classes that refer to other
8171dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// variables which may not be defined at the time they expression is formed.
8181dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// If a value is set for the variable later, this method will be called on
8191dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// users of the value to allow the value to propagate out.
8201dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  ///
82105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
8221dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
8233aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
82482137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov
82505bce0beee87512e52428d4b80f5a8e79a949576David Greene  ArrayRef<Init*> getValues() const { return Values; }
826c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene
82782137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline const_iterator begin() const { return Values.begin(); }
82882137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline const_iterator end  () const { return Values.end();   }
82982137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov
83082137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline size_t         size () const { return Values.size();  }
83182137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov  inline bool           empty() const { return Values.empty(); }
832e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene
833e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// resolveListElementReference - This method is used to implement
834e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
835e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene  /// now, we return the resolved value, otherwise we return null.
83605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
83705bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
838307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
839307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
840307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    llvm_unreachable("Illegal bit reference off list");
841307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
842e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
843e62c1185bee05facc25d1d725434f517261d308bChris Lattner
8447331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner
845d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// OpInit - Base class for operators
846d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene///
847d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass OpInit : public TypedInit {
848a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  OpInit(const OpInit &Other) LLVM_DELETED_FUNCTION;
849a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  OpInit &operator=(OpInit &Other) LLVM_DELETED_FUNCTION;
850d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher
851dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected:
852b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  explicit OpInit(InitKind K, RecTy *Type) : TypedInit(K, Type) {}
853dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
854dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
855b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
856b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() >= IK_FirstOpInit &&
857b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva           I->getKind() <= IK_LastOpInit;
858b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
859d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // Clone - Clone this operator, replacing arguments with the new list
86005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const = 0;
861d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
862a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  virtual int getNumOperands() const = 0;
86305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getOperand(int i) const = 0;
864d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
865d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
866d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // possible to fold.
86705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const = 0;
868d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
86905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
87005bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<OpInit *>(this));
871d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  }
87221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
87305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
87405bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
875307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
876307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const;
877d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene};
878d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
879d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
880d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// UnOpInit - !op (X) - Transform an init.
881d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene///
882e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneclass UnOpInit : public OpInit {
883e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic:
8841434f66b2e132a707e2c8ccb3350ea13fb5aa051David Greene  enum UnaryOp { CAST, HEAD, TAIL, EMPTY };
885e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneprivate:
886e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  UnaryOp Opc;
88705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *LHS;
888dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
88905bce0beee87512e52428d4b80f5a8e79a949576David Greene  UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type)
890b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    : OpInit(IK_UnOpInit, Type), Opc(opc), LHS(lhs) {}
891dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
892a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  UnOpInit(const UnOpInit &Other) LLVM_DELETED_FUNCTION;
893a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  UnOpInit &operator=(const UnOpInit &Other) LLVM_DELETED_FUNCTION;
894dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
895e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic:
896b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
897b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_UnOpInit;
898b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
89905bce0beee87512e52428d4b80f5a8e79a949576David Greene  static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type);
900d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
901e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  // Clone - Clone this operator, replacing arguments with the new list
90205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const {
903aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert(Operands.size() == 1 &&
904aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Wrong number of operands for unary operation");
905dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene    return UnOpInit::get(getOpcode(), *Operands.begin(), getType());
906e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  }
907d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
908ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual int getNumOperands() const { return 1; }
909ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual Init *getOperand(int i) const {
910e6c27de069225e1122c78385ad22a2ff656db8e6David Greene    assert(i == 0 && "Invalid operand id for unary operator");
911e6c27de069225e1122c78385ad22a2ff656db8e6David Greene    return getOperand();
912e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  }
91321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
914e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  UnaryOp getOpcode() const { return Opc; }
91505bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperand() const { return LHS; }
916d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
917e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
918e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  // possible to fold.
919ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
920d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
92105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
92221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
923e6c27de069225e1122c78385ad22a2ff656db8e6David Greene  virtual std::string getAsString() const;
924e6c27de069225e1122c78385ad22a2ff656db8e6David Greene};
925e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
926e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// BinOpInit - !op (X, Y) - Combine two inits.
927e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene///
928d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass BinOpInit : public OpInit {
929e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greenepublic:
930d23a41c153712b929bd84f5e713bda5db5d6e66dHal Finkel  enum BinaryOp { ADD, SHL, SRA, SRL, STRCONCAT, CONCAT, EQ };
931e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greeneprivate:
932e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  BinaryOp Opc;
93305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *LHS, *RHS;
934dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
93505bce0beee87512e52428d4b80f5a8e79a949576David Greene  BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) :
936b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva      OpInit(IK_BinOpInit, Type), Opc(opc), LHS(lhs), RHS(rhs) {}
937dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
938a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  BinOpInit(const BinOpInit &Other) LLVM_DELETED_FUNCTION;
939a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  BinOpInit &operator=(const BinOpInit &Other) LLVM_DELETED_FUNCTION;
940dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
941dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
942b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
943b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_BinOpInit;
944b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
94505bce0beee87512e52428d4b80f5a8e79a949576David Greene  static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs,
94605bce0beee87512e52428d4b80f5a8e79a949576David Greene                        RecTy *Type);
94721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
948d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  // Clone - Clone this operator, replacing arguments with the new list
94905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const {
950aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert(Operands.size() == 2 &&
951aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Wrong number of operands for binary operation");
952dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene    return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType());
953d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  }
954d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
955ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual int getNumOperands() const { return 2; }
956ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual Init *getOperand(int i) const {
957aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert((i == 0 || i == 1) && "Invalid operand id for binary operator");
958d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene    if (i == 0) {
959d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene      return getLHS();
96021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson    } else {
961d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene      return getRHS();
962d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene    }
963d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  }
964d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
965e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  BinaryOp getOpcode() const { return Opc; }
96605bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getLHS() const { return LHS; }
96705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getRHS() const { return RHS; }
968e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
969e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
970e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  // possible to fold.
971ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
972e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
97305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
97421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
975e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene  virtual std::string getAsString() const;
976e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene};
977e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
978d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// TernOpInit - !op (X, Y, Z) - Combine two inits.
979d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene///
9804afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit : public OpInit {
9814afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greenepublic:
982ffc0ab6037aa45bc22f57433148e5f586843b3a7David Greene  enum TernaryOp { SUBST, FOREACH, IF };
9834afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneprivate:
9844afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  TernaryOp Opc;
98505bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *LHS, *MHS, *RHS;
986dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
98705bce0beee87512e52428d4b80f5a8e79a949576David Greene  TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs,
988f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene             RecTy *Type) :
989b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva      OpInit(IK_TernOpInit, Type), Opc(opc), LHS(lhs), MHS(mhs), RHS(rhs) {}
990dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
991a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  TernOpInit(const TernOpInit &Other) LLVM_DELETED_FUNCTION;
992a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  TernOpInit &operator=(const TernOpInit &Other) LLVM_DELETED_FUNCTION;
993dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
994dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
995b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
996b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_TernOpInit;
997b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
99805bce0beee87512e52428d4b80f5a8e79a949576David Greene  static TernOpInit *get(TernaryOp opc, Init *lhs,
99905bce0beee87512e52428d4b80f5a8e79a949576David Greene                         Init *mhs, Init *rhs,
100005bce0beee87512e52428d4b80f5a8e79a949576David Greene                         RecTy *Type);
100121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
10024afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  // Clone - Clone this operator, replacing arguments with the new list
100305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual OpInit *clone(std::vector<Init *> &Operands) const {
1004aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert(Operands.size() == 3 &&
1005aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Wrong number of operands for ternary operation");
1006dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene    return TernOpInit::get(getOpcode(), Operands[0], Operands[1], Operands[2],
1007dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene                           getType());
10084afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  }
10094afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene
1010ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual int getNumOperands() const { return 3; }
1011ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual Init *getOperand(int i) const {
1012aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky    assert((i == 0 || i == 1 || i == 2) &&
1013aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky           "Invalid operand id for ternary operator");
10144afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene    if (i == 0) {
10154afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene      return getLHS();
101621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson    } else if (i == 1) {
10174afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene      return getMHS();
101821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson    } else {
10194afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene      return getRHS();
10204afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene    }
10214afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  }
10224afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene
10234afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  TernaryOp getOpcode() const { return Opc; }
102405bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getLHS() const { return LHS; }
102505bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getMHS() const { return MHS; }
102605bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getRHS() const { return RHS; }
10274afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene
10284afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  // Fold - If possible, fold this to a simpler init.  Return this if not
10294afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  // possible to fold.
1030ef072c33150af8035024e6ac3d52b4861f4d6928Craig Topper  virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
103121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1032548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling  virtual bool isComplete() const { return false; }
1033548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling
103405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
103521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
10364afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene  virtual std::string getAsString() const;
10374afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene};
1038d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene
1039e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene
104007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// VarInit - 'Opcode' - Represent a reference to an entire variable object.
104107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
10427331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass VarInit : public TypedInit {
1043ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  Init *VarName;
1044dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1045d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher  explicit VarInit(const std::string &VN, RecTy *T)
1046b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva      : TypedInit(IK_VarInit, T), VarName(StringInit::get(VN)) {}
1047ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  explicit VarInit(Init *VN, RecTy *T)
1048b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva      : TypedInit(IK_VarInit, T), VarName(VN) {}
1049dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1050a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  VarInit(const VarInit &Other) LLVM_DELETED_FUNCTION;
1051a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  VarInit &operator=(const VarInit &Other) LLVM_DELETED_FUNCTION;
1052dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1053dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
1054b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
1055b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_VarInit;
1056b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
105705bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarInit *get(const std::string &VN, RecTy *T);
105805bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarInit *get(Init *VN, RecTy *T);
10593da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
106005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
106105bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<VarInit *>(this));
1062e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1063e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1064ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  const std::string &getName() const;
1065ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  Init *getNameInit() const { return VarName; }
1066ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  std::string getNameInitAsString() const {
1067ee6dca17252de152720655282fb4b74b76fb2fe9David Greene    return getNameInit()->getAsUnquotedString();
1068ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  }
1069e62c1185bee05facc25d1d725434f517261d308bChris Lattner
107005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
107105bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
10727331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner
1073a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  virtual RecTy *getFieldType(const std::string &FieldName) const;
107405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getFieldInit(Record &R, const RecordVal *RV,
107505bce0beee87512e52428d4b80f5a8e79a949576David Greene                             const std::string &FieldName) const;
10769b929aa7495ee0b5d389370baeb332456632b2feChris Lattner
10779b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// resolveReferences - This method is used by classes that refer to other
10789b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// variables which may not be defined at the time they expression is formed.
10799b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// If a value is set for the variable later, this method will be called on
10809b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  /// users of the value to allow the value to propagate out.
10819b929aa7495ee0b5d389370baeb332456632b2feChris Lattner  ///
108205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
10833da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
1084307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const;
1085307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
1086ee6dca17252de152720655282fb4b74b76fb2fe9David Greene  virtual std::string getAsString() const { return getName(); }
1087e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1088e62c1185bee05facc25d1d725434f517261d308bChris Lattner
108907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
10907331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner/// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field.
109107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
1092e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass VarBitInit : public Init {
109305bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *TI;
1094e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned Bit;
1095dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1096b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  VarBitInit(TypedInit *T, unsigned B) : Init(IK_VarBitInit), TI(T), Bit(B) {
1097307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    assert(T->getType() &&
109863554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva           (isa<IntRecTy>(T->getType()) ||
109963554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva            (isa<BitsRecTy>(T->getType()) &&
110063554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva             cast<BitsRecTy>(T->getType())->getNumBits() > B)) &&
11017331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner           "Illegal VarBitInit expression!");
11027331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner  }
1103e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1104a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  VarBitInit(const VarBitInit &Other) LLVM_DELETED_FUNCTION;
1105a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  VarBitInit &operator=(const VarBitInit &Other) LLVM_DELETED_FUNCTION;
1106dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1107dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
1108b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
1109b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_VarBitInit;
1110b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
111105bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarBitInit *get(TypedInit *T, unsigned B);
1112dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
111305bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
111405bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<VarBitInit *>(this));
1115e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1116e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1117307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBitVar() const { return TI; }
1118307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual unsigned getBitNum() const { return Bit; }
11193da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
11203aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
112105bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1122307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
1123307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned B) const {
1124307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    assert(B < 1 && "Bit index out of range!");
1125307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao    return const_cast<VarBitInit*>(this);
1126307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  }
1127e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1128e62c1185bee05facc25d1d725434f517261d308bChris Lattner
11293da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman/// VarListElementInit - List[4] - Represent access to one element of a var or
11301dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner/// field.
11311dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit : public TypedInit {
113205bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *TI;
11331dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  unsigned Element;
1134dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
113505bce0beee87512e52428d4b80f5a8e79a949576David Greene  VarListElementInit(TypedInit *T, unsigned E)
1136b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva      : TypedInit(IK_VarListElementInit,
1137b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva                  cast<ListRecTy>(T->getType())->getElementType()),
1138b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva        TI(T), Element(E) {
113963554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva    assert(T->getType() && isa<ListRecTy>(T->getType()) &&
11401dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner           "Illegal VarBitInit expression!");
11411dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  }
11421dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
1143a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  VarListElementInit(const VarListElementInit &Other) LLVM_DELETED_FUNCTION;
1144a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  void operator=(const VarListElementInit &Other) LLVM_DELETED_FUNCTION;
1145dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1146dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
1147b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
1148b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_VarListElementInit;
1149b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
115005bce0beee87512e52428d4b80f5a8e79a949576David Greene  static VarListElementInit *get(TypedInit *T, unsigned E);
1151dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
115205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
115305bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<VarListElementInit *>(this));
11541dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  }
11551dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
115605bce0beee87512e52428d4b80f5a8e79a949576David Greene  TypedInit *getVariable() const { return TI; }
11571dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  unsigned getElementNum() const { return Element; }
11581dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
11591dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// resolveListElementReference - This method is used to implement
11601dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// VarListElementInit::resolveReferences.  If the list element is resolvable
11611dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner  /// now, we return the resolved value, otherwise we return null.
116205bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R,
116305bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            const RecordVal *RV,
116405bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
11651dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner
11663aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
116705bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1168307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
1169307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const;
11701dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner};
117107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
117207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// DefInit - AL - Represent a reference to a 'def' in the description
117307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner///
1174beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass DefInit : public TypedInit {
1175e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *Def;
1176dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1177b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  DefInit(Record *D, RecordRecTy *T) : TypedInit(IK_DefInit, T), Def(D) {}
117877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  friend class Record;
1179dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1180a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  DefInit(const DefInit &Other) LLVM_DELETED_FUNCTION;
1181a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  DefInit &operator=(const DefInit &Other) LLVM_DELETED_FUNCTION;
1182dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1183e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1184b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
1185b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_DefInit;
1186b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
118705bce0beee87512e52428d4b80f5a8e79a949576David Greene  static DefInit *get(Record*);
11883da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
118905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
119005bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<DefInit *>(this));
1191e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1192e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1193e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *getDef() const { return Def; }
1194e62c1185bee05facc25d1d725434f517261d308bChris Lattner
119505bce0beee87512e52428d4b80f5a8e79a949576David Greene  //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
1196b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner
1197b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner  virtual RecTy *getFieldType(const std::string &FieldName) const;
119805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *getFieldInit(Record &R, const RecordVal *RV,
119905bce0beee87512e52428d4b80f5a8e79a949576David Greene                             const std::string &FieldName) const;
12003da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
12013aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
1202beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
1203307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
120450bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal bit reference off def");
1205beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
1206beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene
1207beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// resolveListElementReference - This method is used to implement
1208beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// VarListElementInit::resolveReferences.  If the list element is resolvable
1209beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  /// now, we return the resolved value, otherwise we return null.
121005bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
121105bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
121250bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal element reference off def");
1213beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
1214e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1215e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1216e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1217a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner/// FieldInit - X.Y - Represent a reference to a subfield of a variable
1218a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner///
12197331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass FieldInit : public TypedInit {
122005bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Rec;                // Record we are referring to
1221a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  std::string FieldName;    // Field we are accessing
1222dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
122305bce0beee87512e52428d4b80f5a8e79a949576David Greene  FieldInit(Init *R, const std::string &FN)
1224b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva      : TypedInit(IK_FieldInit, R->getFieldType(FN)), Rec(R), FieldName(FN) {
12257331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner    assert(getType() && "FieldInit with non-record type!");
1226a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  }
1227a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
1228a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  FieldInit(const FieldInit &Other) LLVM_DELETED_FUNCTION;
1229a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  FieldInit &operator=(const FieldInit &Other) LLVM_DELETED_FUNCTION;
1230dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1231dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
1232b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
1233b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_FieldInit;
1234b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
123505bce0beee87512e52428d4b80f5a8e79a949576David Greene  static FieldInit *get(Init *R, const std::string &FN);
123605bce0beee87512e52428d4b80f5a8e79a949576David Greene  static FieldInit *get(Init *R, const Init *FN);
1237dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
123805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
123905bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<FieldInit *>(this));
1240a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  }
1241a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
1242307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const;
1243307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao
124405bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R,
124505bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            const RecordVal *RV,
124605bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const;
12477331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner
124805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
124924151a6888c752ff1d7fc80b500f5a836c9ac528Chris Lattner
12503aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const {
12513aba4d39fd101238ac06871895c28f26736d80cbChris Lattner    return Rec->getAsString() + "." + FieldName;
1252a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner  }
1253a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner};
1254a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner
12558c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// DagInit - (v a, b) - Represent a DAG tree value.  DAG inits are required
12568c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// to have at least one value then a (possibly empty) list of arguments.  Each
12578c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// argument can have a name associated with it.
12588e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner///
125978621a851ae84520de7d24a6d61e1dcf25749712David Greeneclass DagInit : public TypedInit, public FoldingSetNode {
126005bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Val;
12617cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman  std::string ValName;
126205bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<Init*> Args;
126391290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  std::vector<std::string> ArgNames;
1264dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
126505bce0beee87512e52428d4b80f5a8e79a949576David Greene  DagInit(Init *V, const std::string &VN,
126605bce0beee87512e52428d4b80f5a8e79a949576David Greene          ArrayRef<Init *> ArgRange,
126778621a851ae84520de7d24a6d61e1dcf25749712David Greene          ArrayRef<std::string> NameRange)
1268b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva      : TypedInit(IK_DagInit, DagRecTy::get()), Val(V), ValName(VN),
126978621a851ae84520de7d24a6d61e1dcf25749712David Greene          Args(ArgRange.begin(), ArgRange.end()),
127078621a851ae84520de7d24a6d61e1dcf25749712David Greene          ArgNames(NameRange.begin(), NameRange.end()) {}
127121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1272a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  DagInit(const DagInit &Other) LLVM_DELETED_FUNCTION;
1273a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper  DagInit &operator=(const DagInit &Other) LLVM_DELETED_FUNCTION;
1274dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
1275dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic:
1276b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  static bool classof(const Init *I) {
1277b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva    return I->getKind() == IK_DagInit;
1278b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva  }
127905bce0beee87512e52428d4b80f5a8e79a949576David Greene  static DagInit *get(Init *V, const std::string &VN,
128005bce0beee87512e52428d4b80f5a8e79a949576David Greene                      ArrayRef<Init *> ArgRange,
128105bce0beee87512e52428d4b80f5a8e79a949576David Greene                      ArrayRef<std::string> NameRange);
128205bce0beee87512e52428d4b80f5a8e79a949576David Greene  static DagInit *get(Init *V, const std::string &VN,
128305bce0beee87512e52428d4b80f5a8e79a949576David Greene                      const std::vector<
128405bce0beee87512e52428d4b80f5a8e79a949576David Greene                        std::pair<Init*, std::string> > &args);
1285dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
128678621a851ae84520de7d24a6d61e1dcf25749712David Greene  void Profile(FoldingSetNodeID &ID) const;
1287dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene
128805bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *convertInitializerTo(RecTy *Ty) const {
128905bce0beee87512e52428d4b80f5a8e79a949576David Greene    return Ty->convertValue(const_cast<DagInit *>(this));
12908e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner  }
12918e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner
129205bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getOperator() const { return Val; }
129391290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner
12947cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman  const std::string &getName() const { return ValName; }
12957cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman
129691290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  unsigned getNumArgs() const { return Args.size(); }
129705bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getArg(unsigned Num) const {
129891290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    assert(Num < Args.size() && "Arg number out of range!");
129991290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    return Args[Num];
130091290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  }
130191290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  const std::string &getArgName(unsigned Num) const {
130291290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    assert(Num < ArgNames.size() && "Arg number out of range!");
130391290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner    return ArgNames[Num];
130491290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner  }
13058e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner
130605bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1307990db46e9ae7faa742a152ca4126d0bee9f1df9cChris Lattner
13083aba4d39fd101238ac06871895c28f26736d80cbChris Lattner  virtual std::string getAsString() const;
13097674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
131005bce0beee87512e52428d4b80f5a8e79a949576David Greene  typedef std::vector<Init*>::const_iterator       const_arg_iterator;
13117674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  typedef std::vector<std::string>::const_iterator const_name_iterator;
13127674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
13137674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_arg_iterator  arg_begin() const { return Args.begin(); }
13147674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_arg_iterator  arg_end  () const { return Args.end();   }
13157674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
13167674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline size_t              arg_size () const { return Args.size();  }
13177674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline bool                arg_empty() const { return Args.empty(); }
13187674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
13197674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_name_iterator name_begin() const { return ArgNames.begin(); }
13207674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline const_name_iterator name_end  () const { return ArgNames.end();   }
13217674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
13227674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline size_t              name_size () const { return ArgNames.size();  }
13237674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov  inline bool                name_empty() const { return ArgNames.empty(); }
13247674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov
1325307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao  virtual Init *getBit(unsigned Bit) const {
132650bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal bit reference off dag");
1327beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
132821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
132905bce0beee87512e52428d4b80f5a8e79a949576David Greene  virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
133005bce0beee87512e52428d4b80f5a8e79a949576David Greene                                            unsigned Elt) const {
133150bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Illegal element reference off dag");
1332beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene  }
13338e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner};
1334e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1335e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
1336e62c1185bee05facc25d1d725434f517261d308bChris Lattner//  High-Level Classes
1337e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===//
1338e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1339e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordVal {
1340011dca7fac07100695dd3685bfaddbea58a468b9David Greene  Init *Name;
1341e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RecTy *Ty;
1342e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned Prefix;
134305bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *Value;
1344e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1345011dca7fac07100695dd3685bfaddbea58a468b9David Greene  RecordVal(Init *N, RecTy *T, unsigned P);
1346e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RecordVal(const std::string &N, RecTy *T, unsigned P);
1347e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1348011dca7fac07100695dd3685bfaddbea58a468b9David Greene  const std::string &getName() const;
1349de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene  const Init *getNameInit() const { return Name; }
1350de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene  std::string getNameInitAsString() const {
1351de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene    return getNameInit()->getAsUnquotedString();
1352de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene  }
1353e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1354e62c1185bee05facc25d1d725434f517261d308bChris Lattner  unsigned getPrefix() const { return Prefix; }
1355e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RecTy *getType() const { return Ty; }
135605bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getValue() const { return Value; }
1357e62c1185bee05facc25d1d725434f517261d308bChris Lattner
135805bce0beee87512e52428d4b80f5a8e79a949576David Greene  bool setValue(Init *V) {
1359e62c1185bee05facc25d1d725434f517261d308bChris Lattner    if (V) {
1360e62c1185bee05facc25d1d725434f517261d308bChris Lattner      Value = V->convertInitializerTo(Ty);
1361e62c1185bee05facc25d1d725434f517261d308bChris Lattner      return Value == 0;
1362e62c1185bee05facc25d1d725434f517261d308bChris Lattner    }
1363e62c1185bee05facc25d1d725434f517261d308bChris Lattner    Value = 0;
1364e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return false;
1365e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1366e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1367e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
13681a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar  void print(raw_ostream &OS, bool PrintSem = true) const;
1369e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1370e62c1185bee05facc25d1d725434f517261d308bChris Lattner
13711a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecordVal &RV) {
1372e62c1185bee05facc25d1d725434f517261d308bChris Lattner  RV.print(OS << "  ");
1373e62c1185bee05facc25d1d725434f517261d308bChris Lattner  return OS;
1374e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
1375e62c1185bee05facc25d1d725434f517261d308bChris Lattner
137689e0f74094a6a86170c2c70fe8c6c19cb99c97a0Chris Lattnerclass Record {
13776f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  static unsigned LastID;
13786f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar
13796f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  // Unique record ID.
13806f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  unsigned ID;
13810d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  Init *Name;
1382376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  // Location where record was instantiated, followed by the location of
1383376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  // multiclass prototypes used.
1384376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  SmallVector<SMLoc, 4> Locs;
1385e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  std::vector<Init *> TemplateArgs;
1386e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::vector<RecordVal> Values;
1387b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose  std::vector<Record *> SuperClasses;
1388b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose  std::vector<SMRange> SuperClassRanges;
138967db883487fca3472fdde51e931657e22d4d0495Chris Lattner
139067db883487fca3472fdde51e931657e22d4d0495Chris Lattner  // Tracks Record instances. Not owned by Record.
139167db883487fca3472fdde51e931657e22d4d0495Chris Lattner  RecordKeeper &TrackedRecords;
139267db883487fca3472fdde51e931657e22d4d0495Chris Lattner
139377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DefInit *TheInit;
1394d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose  bool IsAnonymous;
139577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
1396f7931b7040de1c829e678b4e391308bc3376f8a0David Greene  void init();
13970d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  void checkName();
13980d886401b3ec09b0c2d267942b07702a2f0740f4David Greene
1399e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1400e62c1185bee05facc25d1d725434f517261d308bChris Lattner
14019c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner  // Constructs a record.
1402376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  explicit Record(const std::string &N, ArrayRef<SMLoc> locs,
1403d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose                  RecordKeeper &records, bool Anonymous = false) :
1404376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    ID(LastID++), Name(StringInit::get(N)), Locs(locs.begin(), locs.end()),
1405d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose    TrackedRecords(records), TheInit(0), IsAnonymous(Anonymous) {
1406004adaf3452a355ada2a54bcb61dc8925a718651David Greene    init();
14070abdadbce7e04af76145154d75ca41dab749b8d6David Greene  }
1408d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose  explicit Record(Init *N, ArrayRef<SMLoc> locs, RecordKeeper &records,
1409d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose                  bool Anonymous = false) :
1410376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    ID(LastID++), Name(N), Locs(locs.begin(), locs.end()),
1411d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose    TrackedRecords(records), TheInit(0), IsAnonymous(Anonymous) {
1412004adaf3452a355ada2a54bcb61dc8925a718651David Greene    init();
1413675f85d0f240930d571f4e557bb92237ee48124eDavid Greene  }
1414cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson
1415cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson  // When copy-constructing a Record, we must still guarantee a globally unique
1416cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson  // ID number.  All other fields can be copied normally.
1417cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson  Record(const Record &O) :
1418cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson    ID(LastID++), Name(O.Name), Locs(O.Locs), TemplateArgs(O.TemplateArgs),
1419cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson    Values(O.Values), SuperClasses(O.SuperClasses),
1420b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose    SuperClassRanges(O.SuperClassRanges), TrackedRecords(O.TrackedRecords),
1421b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose    TheInit(O.TheInit), IsAnonymous(O.IsAnonymous) { }
1422cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson
1423e62c1185bee05facc25d1d725434f517261d308bChris Lattner  ~Record() {}
142421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1425f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov
1426117ccb7e518f05e4bf3df058fc402262f897ff0bChris Lattner  static unsigned getNewUID() { return LastID++; }
1427f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov
1428f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov
14296f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar  unsigned getID() const { return ID; }
14306f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar
14310d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  const std::string &getName() const;
1432d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  Init *getNameInit() const {
1433d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene    return Name;
1434d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  }
1435d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  const std::string getNameInitAsString() const {
1436d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene    return getNameInit()->getAsUnquotedString();
1437d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene  }
1438d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene
14390d886401b3ec09b0c2d267942b07702a2f0740f4David Greene  void setName(Init *Name);               // Also updates RecordKeeper.
1440936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  void setName(const std::string &Name);  // Also updates RecordKeeper.
144121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1442376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  ArrayRef<SMLoc> getLoc() const { return Locs; }
144321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
144477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  /// get the corresponding DefInit.
144577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  DefInit *getDefInit();
144677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen
1447e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  const std::vector<Init *> &getTemplateArgs() const {
1448e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return TemplateArgs;
1449e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1450e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::vector<RecordVal> &getValues() const { return Values; }
1451e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::vector<Record*>   &getSuperClasses() const { return SuperClasses; }
1452b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose  ArrayRef<SMRange> getSuperClassRanges() const { return SuperClassRanges; }
1453e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1454e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  bool isTemplateArg(Init *Name) const {
1455e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i)
1456e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (TemplateArgs[i] == Name) return true;
1457e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return false;
1458e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1459e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  bool isTemplateArg(StringRef Name) const {
1460e22b321d2276b634519165b101b02d92c2fcf5c7David Greene    return isTemplateArg(StringInit::get(Name.str()));
1461e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  }
1462e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1463ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  const RecordVal *getValue(const Init *Name) const {
1464e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = Values.size(); i != e; ++i)
1465ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen      if (Values[i].getNameInit() == Name) return &Values[i];
1466e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return 0;
1467e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1468ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  const RecordVal *getValue(StringRef Name) const {
1469ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen    return getValue(StringInit::get(Name));
1470ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  }
1471ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  RecordVal *getValue(const Init *Name) {
1472e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = Values.size(); i != e; ++i)
1473ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen      if (Values[i].getNameInit() == Name) return &Values[i];
1474e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return 0;
1475e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1476ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  RecordVal *getValue(StringRef Name) {
1477ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen    return getValue(StringInit::get(Name));
1478ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen  }
147996a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene
1480e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  void addTemplateArg(Init *Name) {
1481e62c1185bee05facc25d1d725434f517261d308bChris Lattner    assert(!isTemplateArg(Name) && "Template arg already defined!");
1482e62c1185bee05facc25d1d725434f517261d308bChris Lattner    TemplateArgs.push_back(Name);
1483e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1484e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  void addTemplateArg(StringRef Name) {
1485e22b321d2276b634519165b101b02d92c2fcf5c7David Greene    addTemplateArg(StringInit::get(Name.str()));
1486e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  }
1487e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1488e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addValue(const RecordVal &RV) {
1489ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen    assert(getValue(RV.getNameInit()) == 0 && "Value already added!");
1490e62c1185bee05facc25d1d725434f517261d308bChris Lattner    Values.push_back(RV);
1491e338565757bfcfe9d762751c976684f66954fb45David Greene    if (Values.size() > 1)
1492e338565757bfcfe9d762751c976684f66954fb45David Greene      // Keep NAME at the end of the list.  It makes record dumps a
1493e338565757bfcfe9d762751c976684f66954fb45David Greene      // bit prettier and allows TableGen tests to be written more
1494e338565757bfcfe9d762751c976684f66954fb45David Greene      // naturally.  Tests can use CHECK-NEXT to look for Record
1495e338565757bfcfe9d762751c976684f66954fb45David Greene      // fields they expect to see after a def.  They can't do that if
1496e338565757bfcfe9d762751c976684f66954fb45David Greene      // NAME is the first Record field.
1497e338565757bfcfe9d762751c976684f66954fb45David Greene      std::swap(Values[Values.size() - 2], Values[Values.size() - 1]);
1498e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1499e62c1185bee05facc25d1d725434f517261d308bChris Lattner
150096a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  void removeValue(Init *Name) {
1501bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner    for (unsigned i = 0, e = Values.size(); i != e; ++i)
150296a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene      if (Values[i].getNameInit() == Name) {
1503bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner        Values.erase(Values.begin()+i);
1504bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner        return;
1505bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner      }
150650bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper    llvm_unreachable("Cannot remove an entry that does not exist!");
1507bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner  }
1508bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner
150996a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  void removeValue(StringRef Name) {
151096a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene    removeValue(StringInit::get(Name.str()));
151196a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene  }
151296a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene
151302475f1fd502fa1729d1fc447417087acf9e96c8Ted Kremenek  bool isSubClassOf(const Record *R) const {
1514e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
1515e62c1185bee05facc25d1d725434f517261d308bChris Lattner      if (SuperClasses[i] == R)
1516ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen        return true;
1517e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return false;
1518e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1519e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1520c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  bool isSubClassOf(StringRef Name) const {
1521a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner    for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
15227474c29d903d479e7f99eb0d1d097f75289c5f48David Greene      if (SuperClasses[i]->getNameInitAsString() == Name)
1523a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner        return true;
1524a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner    return false;
1525a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner  }
1526a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner
1527b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose  void addSuperClass(Record *R, SMRange Range) {
1528e62c1185bee05facc25d1d725434f517261d308bChris Lattner    assert(!isSubClassOf(R) && "Already subclassing record!");
1529e62c1185bee05facc25d1d725434f517261d308bChris Lattner    SuperClasses.push_back(R);
1530b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose    SuperClassRanges.push_back(Range);
1531e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1532e62c1185bee05facc25d1d725434f517261d308bChris Lattner
15337dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// resolveReferences - If there are any field references that refer to fields
15347dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// that have been filled in, we can propagate the values now.
15357dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  ///
15367dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  void resolveReferences() { resolveReferencesTo(0); }
15377dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner
15387dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// resolveReferencesTo - If anything in this record refers to RV, replace the
15397dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// reference to RV with the RHS of RV.  If RV is null, we resolve all
15407dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  /// possible references.
15417dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner  void resolveReferencesTo(const RecordVal *RV);
1542e62c1185bee05facc25d1d725434f517261d308bChris Lattner
154367db883487fca3472fdde51e931657e22d4d0495Chris Lattner  RecordKeeper &getRecords() const {
15449c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner    return TrackedRecords;
154567db883487fca3472fdde51e931657e22d4d0495Chris Lattner  }
154667db883487fca3472fdde51e931657e22d4d0495Chris Lattner
1547d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose  bool isAnonymous() const {
1548d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose    return IsAnonymous;
1549d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose  }
1550d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose
1551e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
15525c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
15535c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  //===--------------------------------------------------------------------===//
15545c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  // High-level methods useful to tablegen back-ends
15555c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  //
15565c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
1557c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner  /// getValueInit - Return the initializer for a value with the specified name,
1558c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner  /// or throw an exception if the field does not exist.
1559c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner  ///
156005bce0beee87512e52428d4b80f5a8e79a949576David Greene  Init *getValueInit(StringRef FieldName) const;
1561c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner
156264110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen  /// Return true if the named field is unset.
156364110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen  bool isValueUnset(StringRef FieldName) const {
156464110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen    return getValueInit(FieldName) == UnsetInit::get();
156564110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen  }
156664110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen
15675c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// getValueAsString - This method looks up the specified field and returns
15685c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// its value as a string, throwing an exception if the field does not exist
15695c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// or if the value is not a string.
15705c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  ///
1571c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::string getValueAsString(StringRef FieldName) const;
15725c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner
15736f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  /// getValueAsBitsInit - This method looks up the specified field and returns
15746f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  /// its value as a BitsInit, throwing an exception if the field does not exist
15756f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  /// or if the value is not the right type.
15766f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner  ///
157705bce0beee87512e52428d4b80f5a8e79a949576David Greene  BitsInit *getValueAsBitsInit(StringRef FieldName) const;
15786f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner
157958c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// getValueAsListInit - This method looks up the specified field and returns
158058c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// its value as a ListInit, throwing an exception if the field does not exist
158158c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// or if the value is not the right type.
158258c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  ///
158305bce0beee87512e52428d4b80f5a8e79a949576David Greene  ListInit *getValueAsListInit(StringRef FieldName) const;
158458c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner
1585b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner  /// getValueAsListOfDefs - This method looks up the specified field and
1586af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov  /// returns its value as a vector of records, throwing an exception if the
1587b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner  /// field does not exist or if the value is not the right type.
1588fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey  ///
1589c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::vector<Record*> getValueAsListOfDefs(StringRef FieldName) const;
1590fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey
1591f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov  /// getValueAsListOfInts - This method looks up the specified field and
1592f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov  /// returns its value as a vector of integers, throwing an exception if the
1593f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov  /// field does not exist or if the value is not the right type.
1594af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov  ///
1595c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const;
159621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1597bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  /// getValueAsListOfStrings - This method looks up the specified field and
1598bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  /// returns its value as a vector of strings, throwing an exception if the
1599bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  /// field does not exist or if the value is not the right type.
1600bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  ///
1601bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson  std::vector<std::string> getValueAsListOfStrings(StringRef FieldName) const;
1602bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson
1603dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  /// getValueAsDef - This method looks up the specified field and returns its
1604dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  /// value as a Record, throwing an exception if the field does not exist or if
1605dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  /// the value is not the right type.
1606dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner  ///
1607c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  Record *getValueAsDef(StringRef FieldName) const;
1608dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner
16090969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  /// getValueAsBit - This method looks up the specified field and returns its
16100969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  /// value as a bit, throwing an exception if the field does not exist or if
16110969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  /// the value is not the right type.
16120969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner  ///
1613c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  bool getValueAsBit(StringRef FieldName) const;
16140969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner
1615c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  /// getValueAsBitOrUnset - This method looks up the specified field and
1616c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  /// returns its value as a bit. If the field is unset, sets Unset to true and
1617c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  /// retunrs false.
1618c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  ///
1619c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen  bool getValueAsBitOrUnset(StringRef FieldName, bool &Unset) const;
1620c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen
162158c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  /// getValueAsInt - This method looks up the specified field and returns its
162263f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  /// value as an int64_t, throwing an exception if the field does not exist or
162363f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman  /// if the value is not the right type.
162458c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner  ///
1625c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner  int64_t getValueAsInt(StringRef FieldName) const;
1626784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner
1627784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  /// getValueAsDag - This method looks up the specified field and returns its
1628784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  /// value as an Dag, throwing an exception if the field does not exist or if
1629784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  /// the value is not the right type.
1630784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner  ///
163105bce0beee87512e52428d4b80f5a8e79a949576David Greene  DagInit *getValueAsDag(StringRef FieldName) const;
1632e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1633e62c1185bee05facc25d1d725434f517261d308bChris Lattner
16341a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const Record &R);
1635e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1636c7cafcd815519b06318629b424abe746437e1389David Greenestruct MultiClass {
1637c7cafcd815519b06318629b424abe746437e1389David Greene  Record Rec;  // Placeholder for template args and Name.
1638c7cafcd815519b06318629b424abe746437e1389David Greene  typedef std::vector<Record*> RecordVector;
1639c7cafcd815519b06318629b424abe746437e1389David Greene  RecordVector DefPrototypes;
1640d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene
1641d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene  void dump() const;
1642d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene
16434b18691c3580674691875ec37c84a1c4edf2d586Jim Grosbach  MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) :
164467db883487fca3472fdde51e931657e22d4d0495Chris Lattner    Rec(Name, Loc, Records) {}
1645c7cafcd815519b06318629b424abe746437e1389David Greene};
1646c7cafcd815519b06318629b424abe746437e1389David Greene
1647e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordKeeper {
1648e62c1185bee05facc25d1d725434f517261d308bChris Lattner  std::map<std::string, Record*> Classes, Defs;
1649cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene
1650e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic:
1651e62c1185bee05facc25d1d725434f517261d308bChris Lattner  ~RecordKeeper() {
1652e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (std::map<std::string, Record*>::iterator I = Classes.begin(),
1653ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen           E = Classes.end(); I != E; ++I)
1654e62c1185bee05facc25d1d725434f517261d308bChris Lattner      delete I->second;
1655e62c1185bee05facc25d1d725434f517261d308bChris Lattner    for (std::map<std::string, Record*>::iterator I = Defs.begin(),
1656ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen           E = Defs.end(); I != E; ++I)
1657e62c1185bee05facc25d1d725434f517261d308bChris Lattner      delete I->second;
1658e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
16593da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
1660e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::map<std::string, Record*> &getClasses() const { return Classes; }
1661e62c1185bee05facc25d1d725434f517261d308bChris Lattner  const std::map<std::string, Record*> &getDefs() const { return Defs; }
1662e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1663e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *getClass(const std::string &Name) const {
1664e62c1185bee05facc25d1d725434f517261d308bChris Lattner    std::map<std::string, Record*>::const_iterator I = Classes.find(Name);
1665e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return I == Classes.end() ? 0 : I->second;
1666e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1667e62c1185bee05facc25d1d725434f517261d308bChris Lattner  Record *getDef(const std::string &Name) const {
1668e62c1185bee05facc25d1d725434f517261d308bChris Lattner    std::map<std::string, Record*>::const_iterator I = Defs.find(Name);
1669e62c1185bee05facc25d1d725434f517261d308bChris Lattner    return I == Defs.end() ? 0 : I->second;
1670e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1671e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addClass(Record *R) {
167272cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    bool Ins = Classes.insert(std::make_pair(R->getName(), R)).second;
167372cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    (void)Ins;
167472cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    assert(Ins && "Class already exists");
1675e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1676e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void addDef(Record *R) {
167772cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    bool Ins = Defs.insert(std::make_pair(R->getName(), R)).second;
167872cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    (void)Ins;
167972cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen    assert(Ins && "Record already exists");
1680e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
1681e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1682936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  /// removeClass - Remove, but do not delete, the specified record.
1683936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  ///
1684936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  void removeClass(const std::string &Name) {
1685936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    assert(Classes.count(Name) && "Class does not exist!");
1686936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    Classes.erase(Name);
1687936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  }
1688936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  /// removeDef - Remove, but do not delete, the specified record.
1689936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  ///
1690936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  void removeDef(const std::string &Name) {
1691936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    assert(Defs.count(Name) && "Def does not exist!");
1692936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner    Defs.erase(Name);
1693936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner  }
169421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson
1695ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  //===--------------------------------------------------------------------===//
1696ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  // High-level helper methods, useful for tablegen backends...
1697ab47ae3381aa2372009a9054260461c20324b555Chris Lattner
1698ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  /// getAllDerivedDefinitions - This method returns all concrete definitions
1699ab47ae3381aa2372009a9054260461c20324b555Chris Lattner  /// that derive from the specified class name.  If a class with the specified
17005c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  /// name does not exist, an exception is thrown.
17015c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  std::vector<Record*>
17025c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner  getAllDerivedDefinitions(const std::string &ClassName) const;
1703ab47ae3381aa2372009a9054260461c20324b555Chris Lattner
1704e62c1185bee05facc25d1d725434f517261d308bChris Lattner  void dump() const;
1705e62c1185bee05facc25d1d725434f517261d308bChris Lattner};
1706e62c1185bee05facc25d1d725434f517261d308bChris Lattner
1707690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// LessRecord - Sorting predicate to sort record pointers by name.
1708690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner///
1709690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecord {
1710690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  bool operator()(const Record *Rec1, const Record *Rec2) const {
1711160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen    return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0;
1712690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  }
1713690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner};
1714690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner
171590fee07298bec2e5160a599db850b9553d02377bSean Silva/// LessRecordByID - Sorting predicate to sort record pointers by their
171690fee07298bec2e5160a599db850b9553d02377bSean Silva/// unique ID. If you just need a deterministic order, use this, since it
171790fee07298bec2e5160a599db850b9553d02377bSean Silva/// just compares two `unsigned`; the other sorting predicates require
171890fee07298bec2e5160a599db850b9553d02377bSean Silva/// string manipulation.
171990fee07298bec2e5160a599db850b9553d02377bSean Silvastruct LessRecordByID {
172090fee07298bec2e5160a599db850b9553d02377bSean Silva  bool operator()(const Record *LHS, const Record *RHS) const {
172190fee07298bec2e5160a599db850b9553d02377bSean Silva    return LHS->getID() < RHS->getID();
172290fee07298bec2e5160a599db850b9553d02377bSean Silva  }
172390fee07298bec2e5160a599db850b9553d02377bSean Silva};
172490fee07298bec2e5160a599db850b9553d02377bSean Silva
172521870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// LessRecordFieldName - Sorting predicate to sort record pointers by their
17267c9a7728d9dd248ebee8f2dd969d303711d487a9Jim Grosbach/// name field.
1727690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner///
1728690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecordFieldName {
1729690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  bool operator()(const Record *Rec1, const Record *Rec2) const {
1730690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner    return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name");
1731690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner  }
1732690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner};
1733690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner
1734b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosierstruct LessRecordRegister {
1735b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier  static size_t min(size_t a, size_t b) { return a < b ? a : b; }
1736b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier  static bool ascii_isdigit(char x) { return x >= '0' && x <= '9'; }
1737b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
1738b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier  struct RecordParts {
1739b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    SmallVector<std::pair< bool, StringRef>, 4> Parts;
1740b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
1741b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    RecordParts(StringRef Rec) {
1742b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      if (Rec.empty())
1743b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier        return;
1744b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
1745b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      size_t Len = 0;
1746b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      const char *Start = Rec.data();
1747b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      const char *Curr = Start;
1748b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      bool isDigitPart = ascii_isdigit(Curr[0]);
1749b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      for (size_t I = 0, E = Rec.size(); I != E; ++I, ++Len) {
1750b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier        bool isDigit = ascii_isdigit(Curr[I]);
1751b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier        if (isDigit != isDigitPart) {
1752b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier          Parts.push_back(std::make_pair(isDigitPart, StringRef(Start, Len)));
1753b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier          Len = 0;
1754b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier          Start = &Curr[I];
1755b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier          isDigitPart = ascii_isdigit(Curr[I]);
1756b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier        }
1757b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      }
1758b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      // Push the last part.
1759b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      Parts.push_back(std::make_pair(isDigitPart, StringRef(Start, Len)));
1760b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    }
1761b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
1762b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    size_t size() { return Parts.size(); }
1763b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
1764b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    std::pair<bool, StringRef> getPart(size_t i) {
1765b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      assert (i < Parts.size() && "Invalid idx!");
1766b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      return Parts[i];
1767b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    }
1768b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier  };
1769b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
1770b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier  bool operator()(const Record *Rec1, const Record *Rec2) const {
1771b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    RecordParts LHSParts(StringRef(Rec1->getName()));
1772b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    RecordParts RHSParts(StringRef(Rec2->getName()));
1773b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
1774b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    size_t LHSNumParts = LHSParts.size();
1775b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    size_t RHSNumParts = RHSParts.size();
1776b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    assert (LHSNumParts && RHSNumParts && "Expected at least one part!");
1777b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
1778b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    if (LHSNumParts != RHSNumParts)
1779b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      return LHSNumParts < RHSNumParts;
1780b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
1781b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    // We expect the registers to be of the form [_a-zA-z]+([0-9]*[_a-zA-Z]*)*.
1782b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    for (size_t I = 0, E = LHSNumParts; I < E; I+=2) {
1783b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      std::pair<bool, StringRef> LHSPart = LHSParts.getPart(I);
1784b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      std::pair<bool, StringRef> RHSPart = RHSParts.getPart(I);
1785ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier      // Expect even part to always be alpha.
1786ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier      assert (LHSPart.first == false && RHSPart.first == false &&
1787ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier              "Expected both parts to be alpha.");
1788ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier      if (int Res = LHSPart.second.compare(RHSPart.second))
1789ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier        return Res < 0;
1790b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    }
1791b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    for (size_t I = 1, E = LHSNumParts; I < E; I+=2) {
1792b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      std::pair<bool, StringRef> LHSPart = LHSParts.getPart(I);
1793b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier      std::pair<bool, StringRef> RHSPart = RHSParts.getPart(I);
1794ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier      // Expect odd part to always be numeric.
1795ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier      assert (LHSPart.first == true && RHSPart.first == true &&
1796ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier              "Expected both parts to be numeric.");
1797ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier      if (LHSPart.second.size() != RHSPart.second.size())
1798ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier        return LHSPart.second.size() < RHSPart.second.size();
1799ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier
1800ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier      unsigned LHSVal, RHSVal;
1801f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu
1802f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu      bool LHSFailed = LHSPart.second.getAsInteger(10, LHSVal); (void)LHSFailed;
1803f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu      assert(!LHSFailed && "Unable to convert LHS to integer.");
1804f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu      bool RHSFailed = RHSPart.second.getAsInteger(10, RHSVal); (void)RHSFailed;
1805f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu      assert(!RHSFailed && "Unable to convert RHS to integer.");
1806f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu
1807ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier      if (LHSVal != RHSVal)
1808ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier        return LHSVal < RHSVal;
1809b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    }
1810b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier    return LHSNumParts < RHSNumParts;
1811b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier  }
1812b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier};
1813b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier
18141a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK);
1815e62c1185bee05facc25d1d725434f517261d308bChris Lattner
181630c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring
181730c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name.
181830c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass,
181930c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene                  Init *Name, const std::string &Scoper);
182030c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene
182130c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring
182230c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name.
182330c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass,
182430c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene                  const std::string &Name, const std::string &Scoper);
182530c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene
1826d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
1827d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
1828e62c1185bee05facc25d1d725434f517261d308bChris Lattner#endif
1829