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 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RecTy(RecTyKind K) : Kind(K), ListTy(nullptr) {} 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 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue( UnsetInit *UI) { return nullptr; } 106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue( BitInit *BI) { return nullptr; } 107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue( BitsInit *BI) { return nullptr; } 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue( IntInit *II) { return nullptr; } 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue(StringInit *SI) { return nullptr; } 110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue( ListInit *LI) { return nullptr; } 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 } 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue(VarBitInit *VB) { return nullptr; } 121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue( DefInit *DI) { return nullptr; } 122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue( DagInit *DI) { return nullptr; } 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual Init *convertValue( TypedInit *TI) { return nullptr; } 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/// BitRecTy - 'bit' - Represent a single bit 14107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1421fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass BitRecTy : public RecTy { 14377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static BitRecTy Shared; 14489adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva BitRecTy() : RecTy(BitRecTyKind) {} 145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 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 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnsetInit *UI) override { return (Init*)UI; } 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BitInit *BI) override { return (Init*)BI; } 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BitsInit *BI) override; 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( IntInit *II) override; 157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(StringInit *SI) override { return nullptr; } 158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( ListInit *LI) override { return nullptr; } 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue(VarBitInit *VB) override { return (Init*)VB; } 160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DefInit *DI) override { return nullptr; } 161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DagInit *DI) override { return nullptr; } 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnOpInit *UI) override { return RecTy::convertValue(UI);} 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BinOpInit *UI) override { return RecTy::convertValue(UI);} 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TernOpInit *UI) override {return RecTy::convertValue(UI);} 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TypedInit *TI) override; 16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( VarInit *VI) override { return RecTy::convertValue(VI);} 16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( FieldInit *FI) override { return RecTy::convertValue(FI);} 16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override { return "bit"; } 17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool typeIsConvertibleTo(const RecTy *RHS) const override { 1727cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 1737cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool baseClassOf(const RecTy*) const override; 175e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 176e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1771b2c94713600531ddeefb23cd10c49cd533aa09bEli Bendersky/// BitsRecTy - 'bits<n>' - Represent a fixed number of bits 17807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 179e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitsRecTy : public RecTy { 180e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Size; 18189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva explicit BitsRecTy(unsigned Sz) : RecTy(BitsRecTyKind), Size(Sz) {} 182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 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 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnsetInit *UI) override; 19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BitInit *UI) override; 19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BitsInit *BI) override; 19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( IntInit *II) override; 196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(StringInit *SI) override { return nullptr; } 197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( ListInit *LI) override { return nullptr; } 198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(VarBitInit *VB) override { return nullptr; } 199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DefInit *DI) override { return nullptr; } 200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DagInit *DI) override { return nullptr; } 201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( UnOpInit *UI) override { return RecTy::convertValue(UI);} 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BinOpInit *UI) override { return RecTy::convertValue(UI);} 203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(TernOpInit *UI) override { return RecTy::convertValue(UI);} 20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TypedInit *TI) override; 205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( VarInit *VI) override { return RecTy::convertValue(VI);} 206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( FieldInit *FI) override { return RecTy::convertValue(FI);} 20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 210dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool typeIsConvertibleTo(const RecTy *RHS) const override { 2117cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 2127cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool baseClassOf(const RecTy*) const override; 214e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 215e62c1185bee05facc25d1d725434f517261d308bChris Lattner 21607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// IntRecTy - 'int' - Represent an integer value of no particular size 21707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 2181fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass IntRecTy : public RecTy { 21977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static IntRecTy Shared; 22089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva IntRecTy() : RecTy(IntRecTyKind) {} 221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 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 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnsetInit *UI) override { return (Init*)UI; } 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BitInit *BI) override; 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BitsInit *BI) override; 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( IntInit *II) override { return (Init*)II; } 233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(StringInit *SI) override { return nullptr; } 234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( ListInit *LI) override { return nullptr; } 235dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(VarBitInit *VB) override { return nullptr; } 236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DefInit *DI) override { return nullptr; } 237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DagInit *DI) override { return nullptr; } 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnOpInit *UI) override { return RecTy::convertValue(UI);} 23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BinOpInit *UI) override { return RecTy::convertValue(UI);} 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TernOpInit *UI) override {return RecTy::convertValue(UI);} 24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TypedInit *TI) override; 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( VarInit *VI) override { return RecTy::convertValue(VI);} 24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( FieldInit *FI) override { return RecTy::convertValue(FI);} 24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override { return "int"; } 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool typeIsConvertibleTo(const RecTy *RHS) const override { 2487cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 2497cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 2507cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool baseClassOf(const RecTy*) const override; 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) {} 259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2601fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 26189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva static bool classof(const RecTy *RT) { 26289adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva return RT->getRecTyKind() == StringRecTyKind; 26389adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva } 26489adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva 26577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static StringRecTy *get() { return &Shared; } 26677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnsetInit *UI) override { return (Init*)UI; } 268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( BitInit *BI) override { return nullptr; } 269dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( BitsInit *BI) override { return nullptr; } 270dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( IntInit *II) override { return nullptr; } 27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue(StringInit *SI) override { return (Init*)SI; } 272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( ListInit *LI) override { return nullptr; } 27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnOpInit *BO) override; 27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BinOpInit *BO) override; 27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TernOpInit *BO) override {return RecTy::convertValue(BO);} 27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 277dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(VarBitInit *VB) override { return nullptr; } 278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DefInit *DI) override { return nullptr; } 279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DagInit *DI) override { return nullptr; } 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TypedInit *TI) override; 28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( VarInit *VI) override { return RecTy::convertValue(VI);} 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( FieldInit *FI) override { return RecTy::convertValue(FI);} 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override { return "string"; } 28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool typeIsConvertibleTo(const RecTy *RHS) const override { 2877cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 2887cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 289e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 290e62c1185bee05facc25d1d725434f517261d308bChris Lattner 2911b2c94713600531ddeefb23cd10c49cd533aa09bEli Bendersky/// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of 2921b2c94713600531ddeefb23cd10c49cd533aa09bEli Bendersky/// the specified type. 29307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 294e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass ListRecTy : public RecTy { 2957cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner RecTy *Ty; 29689adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva explicit ListRecTy(RecTy *T) : RecTy(ListRecTyKind), Ty(T) {} 29777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen friend ListRecTy *RecTy::getListTy(); 298dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 29977f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 30089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva static bool classof(const RecTy *RT) { 30189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva return RT->getRecTyKind() == ListRecTyKind; 30289adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva } 30389adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva 30477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static ListRecTy *get(RecTy *T) { return T->getListTy(); } 3057cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner RecTy *getElementType() const { return Ty; } 306f1b36f9a71eb267f04b7bd3a32aca9bc69f71e97Chris Lattner 30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnsetInit *UI) override { return (Init*)UI; } 308dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( BitInit *BI) override { return nullptr; } 309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( BitsInit *BI) override { return nullptr; } 310dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( IntInit *II) override { return nullptr; } 311dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(StringInit *SI) override { return nullptr; } 31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( ListInit *LI) override; 313dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(VarBitInit *VB) override { return nullptr; } 314dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DefInit *DI) override { return nullptr; } 315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DagInit *DI) override { return nullptr; } 316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( UnOpInit *UI) override { return RecTy::convertValue(UI);} 31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BinOpInit *UI) override { return RecTy::convertValue(UI);} 318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(TernOpInit *UI) override { return RecTy::convertValue(UI);} 31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TypedInit *TI) override; 32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( VarInit *VI) override { return RecTy::convertValue(VI);} 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( FieldInit *FI) override { return RecTy::convertValue(FI);} 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 325dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool typeIsConvertibleTo(const RecTy *RHS) const override { 3267cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 3277cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 3287cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner 32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool baseClassOf(const RecTy*) const override; 330f05760de76b4ec26474da18c97770ca369972cfdChris Lattner}; 331f05760de76b4ec26474da18c97770ca369972cfdChris Lattner 33240f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/// DagRecTy - 'dag' - Represent a dag fragment 33340f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/// 3341fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass DagRecTy : public RecTy { 33577f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static DagRecTy Shared; 33689adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva DagRecTy() : RecTy(DagRecTyKind) {} 337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3381fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 33989adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva static bool classof(const RecTy *RT) { 34089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva return RT->getRecTyKind() == DagRecTyKind; 34189adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva } 34289adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva 34377f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static DagRecTy *get() { return &Shared; } 34477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnsetInit *UI) override { return (Init*)UI; } 346dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( BitInit *BI) override { return nullptr; } 347dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( BitsInit *BI) override { return nullptr; } 348dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( IntInit *II) override { return nullptr; } 349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(StringInit *SI) override { return nullptr; } 350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( ListInit *LI) override { return nullptr; } 351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(VarBitInit *VB) override { return nullptr; } 352dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DefInit *DI) override { return nullptr; } 35336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnOpInit *BO) override; 35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BinOpInit *BO) override; 35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TernOpInit *BO) override {return RecTy::convertValue(BO);} 35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( DagInit *CI) override { return (Init*)CI; } 35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TypedInit *TI) override; 35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( VarInit *VI) override { return RecTy::convertValue(VI);} 35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( FieldInit *FI) override { return RecTy::convertValue(FI);} 36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override { return "dag"; } 36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 363dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool typeIsConvertibleTo(const RecTy *RHS) const override { 36440f71134b9fef0ca06c516f033cc9403394a913cChris Lattner return RHS->baseClassOf(this); 36540f71134b9fef0ca06c516f033cc9403394a913cChris Lattner } 36640f71134b9fef0ca06c516f033cc9403394a913cChris Lattner}; 36740f71134b9fef0ca06c516f033cc9403394a913cChris Lattner 368234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman/// RecordRecTy - '[classname]' - Represent an instance of a class, such as: 36907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// (R32 X = EAX). 37007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 371e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordRecTy : public RecTy { 372e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *Rec; 37389adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva explicit RecordRecTy(Record *R) : RecTy(RecordRecTyKind), Rec(R) {} 37477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen friend class Record; 375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 37677f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesenpublic: 37789adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva static bool classof(const RecTy *RT) { 37889adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva return RT->getRecTyKind() == RecordRecTyKind; 37989adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva } 38089adeb225db4cd4d5c671d2ac5e2e6a6e755b5bcSean Silva 38177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen static RecordRecTy *get(Record *R); 382e62c1185bee05facc25d1d725434f517261d308bChris Lattner 383a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner Record *getRecord() const { return Rec; } 384a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnsetInit *UI) override { return (Init*)UI; } 386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( BitInit *BI) override { return nullptr; } 387dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( BitsInit *BI) override { return nullptr; } 388dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( IntInit *II) override { return nullptr; } 389dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(StringInit *SI) override { return nullptr; } 390dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( ListInit *LI) override { return nullptr; } 391dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue(VarBitInit *VB) override { return nullptr; } 39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( UnOpInit *UI) override { return RecTy::convertValue(UI);} 39336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( BinOpInit *UI) override { return RecTy::convertValue(UI);} 39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TernOpInit *UI) override {return RecTy::convertValue(UI);} 39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( DefInit *DI) override; 396dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Init *convertValue( DagInit *DI) override { return nullptr; } 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( TypedInit *VI) override; 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( VarInit *VI) override { return RecTy::convertValue(VI);} 39936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertValue( FieldInit *FI) override { return RecTy::convertValue(FI);} 40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool typeIsConvertibleTo(const RecTy *RHS) const override { 4047cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return RHS->baseClassOf(this); 4057cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner } 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool baseClassOf(const RecTy*) const override; 407e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 408e62c1185bee05facc25d1d725434f517261d308bChris Lattner 40921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// resolveTypes - Find a common type that T1 and T2 convert to. 410e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene/// Return 0 if no such type exists. 411e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene/// 412e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid GreeneRecTy *resolveTypes(RecTy *T1, RecTy *T2); 41307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner 414e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 415e62c1185bee05facc25d1d725434f517261d308bChris Lattner// Initializer Classes 416e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 417e62c1185bee05facc25d1d725434f517261d308bChris Lattner 418afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greeneclass Init { 419b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silvaprotected: 420b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// \brief Discriminator enum (for isa<>, dyn_cast<>, et al.) 421b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// 422b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// This enum is laid out by a preorder traversal of the inheritance 423b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// hierarchy, and does not contain an entry for abstract classes, as per 424b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// the recommendation in docs/HowToSetUpLLVMStyleRTTI.rst. 425b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// 426b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// We also explicitly include "first" and "last" values for each 427b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// interior node of the inheritance tree, to make it easier to read the 428b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// corresponding classof(). 429b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// 430b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// We could pack these a bit tighter by not having the IK_FirstXXXInit 431b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// and IK_LastXXXInit be their own values, but that would degrade 432b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva /// readability for really no benefit. 433b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva enum InitKind { 434b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_BitInit, 435b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_BitsInit, 436b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_FirstTypedInit, 437b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_DagInit, 438b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_DefInit, 439b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_FieldInit, 440b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_IntInit, 441b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_ListInit, 442b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_FirstOpInit, 443b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_BinOpInit, 444b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_TernOpInit, 445b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_UnOpInit, 446b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_LastOpInit, 447b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_StringInit, 448b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_VarInit, 449b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_VarListElementInit, 450b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_LastTypedInit, 451b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_UnsetInit, 452b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva IK_VarBitInit 453b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva }; 454b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva 455b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silvaprivate: 456b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva const InitKind Kind; 457a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper Init(const Init &) LLVM_DELETED_FUNCTION; 458a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper Init &operator=(const Init &) LLVM_DELETED_FUNCTION; 4592d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 460dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 461b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silvapublic: 462b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva InitKind getKind() const { return Kind; } 463b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva 464dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 465b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva explicit Init(InitKind K) : Kind(K) {} 466dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 467afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greenepublic: 468e62c1185bee05facc25d1d725434f517261d308bChris Lattner virtual ~Init() {} 469e62c1185bee05facc25d1d725434f517261d308bChris Lattner 470f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// isComplete - This virtual method should be overridden by values that may 471f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// not be completely specified yet. 472f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner virtual bool isComplete() const { return true; } 473f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner 474f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// print - Print out this value. 4751a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar void print(raw_ostream &OS) const { OS << getAsString(); } 4763aba4d39fd101238ac06871895c28f26736d80cbChris Lattner 4773aba4d39fd101238ac06871895c28f26736d80cbChris Lattner /// getAsString - Convert this value to a string form. 4783aba4d39fd101238ac06871895c28f26736d80cbChris Lattner virtual std::string getAsString() const = 0; 4790b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// getAsUnquotedString - Convert this value to a string form, 4800b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// without adding quote markers. This primaruly affects 4810b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// StringInits where we will not surround the string value with 4820b18d59435a7c01a433ac69845e6d8e1ad66ce8bDavid Greene /// quotes. 4834b18691c3580674691875ec37c84a1c4edf2d586Jim Grosbach virtual std::string getAsUnquotedString() const { return getAsString(); } 484f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner 485f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// dump - Debugging method that may be called through a debugger, just 4861a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar /// invokes print on stderr. 487e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 488e62c1185bee05facc25d1d725434f517261d308bChris Lattner 489f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// convertInitializerTo - This virtual function is a simple call-back 490f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// function that should be overridden to call the appropriate 491f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// RecTy::convertValue method. 492f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// 49305bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *convertInitializerTo(RecTy *Ty) const = 0; 494f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner 495f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// convertInitializerBitRange - This method is used to implement the bitrange 496f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// selection operator. Given an initializer, it selects the specified bits 4977331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner /// out, returning them as a new init of bits type. If it is not legal to use 4987331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner /// the bit subscript operator on this initializer, return null. 499f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// 50005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 501f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitializerBitRange(const std::vector<unsigned> &Bits) const { 502dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 503e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 504e62c1185bee05facc25d1d725434f517261d308bChris Lattner 505b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// convertInitListSlice - This method is used to implement the list slice 506b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// selection operator. Given an initializer, it selects the specified list 507b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// elements, returning them as a new init of list type. If it is not legal 508b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// to take a slice of this, return null. 509b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner /// 51005bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init * 511f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene convertInitListSlice(const std::vector<unsigned> &Elements) const { 512dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 513b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner } 514b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner 515a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// getFieldType - This method is used to implement the FieldInit class. 516a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// Implementors of this method should return the type of the named field if 517a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// they are of record type. 518a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner /// 519dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines virtual RecTy *getFieldType(const std::string &FieldName) const { 520dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 521dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 522a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 523b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// getFieldInit - This method complements getFieldType to return the 524b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// initializer for the specified field. If getFieldType returns non-null 525b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// this method should return non-null, otherwise it returns null. 526b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner /// 52705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getFieldInit(Record &R, const RecordVal *RV, 52805bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::string &FieldName) const { 529dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 530b1ed0fc6308885c5887ed0474e8a4fbf63a39b45Chris Lattner } 5313da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 532f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// resolveReferences - This method is used by classes that refer to other 533a8449e6aaa6f494d85e75d4755f9c47abf1e06ceBob Wilson /// variables which may not be defined at the time the expression is formed. 534f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// If a value is set for the variable later, this method will be called on 535f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// users of the value to allow the value to propagate out. 536f1e37d9d037bb5f7beb688822beddd2340cd871eChris Lattner /// 53705bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveReferences(Record &R, const RecordVal *RV) const { 53805bce0beee87512e52428d4b80f5a8e79a949576David Greene return const_cast<Init *>(this); 5397dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner } 540307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 541307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// getBit - This method is used to return the initializer for the specified 542307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// bit. 543307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBit(unsigned Bit) const = 0; 544307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 545307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// getBitVar - This method is used to retrieve the initializer for bit 546307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// reference. For non-VarBitInit, it simply returns itself. 547307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual Init *getBitVar() const { return const_cast<Init*>(this); } 548307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 549307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// getBitNum - This method is used to retrieve the bit number of a bit 550307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao /// reference. For non-VarBitInit, it simply returns 0. 551307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao virtual unsigned getBitNum() const { return 0; } 552e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 553e62c1185bee05facc25d1d725434f517261d308bChris Lattner 5541a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const Init &I) { 555e62c1185bee05facc25d1d725434f517261d308bChris Lattner I.print(OS); return OS; 556e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 557e62c1185bee05facc25d1d725434f517261d308bChris Lattner 558beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// TypedInit - This is the common super-class of types that have a specific, 559beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// explicit, type. 560beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene/// 561beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass TypedInit : public Init { 562beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene RecTy *Ty; 563dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 564a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper TypedInit(const TypedInit &Other) LLVM_DELETED_FUNCTION; 565a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper TypedInit &operator=(const TypedInit &Other) LLVM_DELETED_FUNCTION; 566dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 567dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 568b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva explicit TypedInit(InitKind K, RecTy *T) : Init(K), Ty(T) {} 569d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher 570dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 571b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 572b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() >= IK_FirstTypedInit && 573b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva I->getKind() <= IK_LastTypedInit; 574b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 575beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene RecTy *getType() const { return Ty; } 576beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 57736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init * 57836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines convertInitializerBitRange(const std::vector<unsigned> &Bits) const override; 57936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init * 58036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines convertInitListSlice(const std::vector<unsigned> &Elements) const override; 581beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 5829703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// getFieldType - This method is used to implement the FieldInit class. 5839703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// Implementors of this method should return the type of the named field if 5849703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// they are of record type. 5859703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene /// 58636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RecTy *getFieldType(const std::string &FieldName) const override; 5879703843dfa5640ddfc4362d7aa20b03fba485eceDavid Greene 588beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveListElementReference - This method is used to implement 589beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 590beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// now, we return the resolved value, otherwise we return null. 59105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, 59205bce0beee87512e52428d4b80f5a8e79a949576David Greene unsigned Elt) const = 0; 593beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene}; 594beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 59507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// UnsetInit - ? - Represents an uninitialized value 59607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 5971fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass UnsetInit : public Init { 598b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva UnsetInit() : Init(IK_UnsetInit) {} 599a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper UnsetInit(const UnsetInit &) LLVM_DELETED_FUNCTION; 600a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper UnsetInit &operator=(const UnsetInit &Other) LLVM_DELETED_FUNCTION; 60136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void anchor() override; 602dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 6031fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 604b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 605b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_UnsetInit; 606b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 60705bce0beee87512e52428d4b80f5a8e79a949576David Greene static UnsetInit *get(); 608dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 60936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 61005bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<UnsetInit *>(this)); 611e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 612e62c1185bee05facc25d1d725434f517261d308bChris Lattner 61336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override { 614307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<UnsetInit*>(this); 615307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 616307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 61736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isComplete() const override { return false; } 61836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override { return "?"; } 619e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 620e62c1185bee05facc25d1d725434f517261d308bChris Lattner 62107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitInit - true/false - Represent a concrete initializer for a bit. 62207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 623e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass BitInit : public Init { 624e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool Value; 625dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 626b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva explicit BitInit(bool V) : Init(IK_BitInit), Value(V) {} 627a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper BitInit(const BitInit &Other) LLVM_DELETED_FUNCTION; 628a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper BitInit &operator=(BitInit &Other) LLVM_DELETED_FUNCTION; 62936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void anchor() override; 630dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 631dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 632b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 633b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_BitInit; 634b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 63505bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitInit *get(bool V); 636e62c1185bee05facc25d1d725434f517261d308bChris Lattner 637e62c1185bee05facc25d1d725434f517261d308bChris Lattner bool getValue() const { return Value; } 638e62c1185bee05facc25d1d725434f517261d308bChris Lattner 63936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 64005bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<BitInit *>(this)); 641e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 642e62c1185bee05facc25d1d725434f517261d308bChris Lattner 64336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override { 644307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao assert(Bit < 1 && "Bit index out of range!"); 645307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<BitInit*>(this); 646307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 647307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 64836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override { return Value ? "1" : "0"; } 649e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 650e62c1185bee05facc25d1d725434f517261d308bChris Lattner 65107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value. 65207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// It contains a vector of bits, whose size is determined by the type. 65307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 654726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greeneclass BitsInit : public Init, public FoldingSetNode { 65505bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Bits; 656dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 657b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva BitsInit(ArrayRef<Init *> Range) 658b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : Init(IK_BitsInit), Bits(Range.begin(), Range.end()) {} 659e62c1185bee05facc25d1d725434f517261d308bChris Lattner 660a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper BitsInit(const BitsInit &Other) LLVM_DELETED_FUNCTION; 661a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper BitsInit &operator=(const BitsInit &Other) LLVM_DELETED_FUNCTION; 662dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 663dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 664b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 665b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_BitsInit; 666b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 66705bce0beee87512e52428d4b80f5a8e79a949576David Greene static BitsInit *get(ArrayRef<Init *> Range); 668dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 669726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene void Profile(FoldingSetNodeID &ID) const; 670726bbde3c4ac5a279c86d1632b7b94498b01854aDavid Greene 671e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getNumBits() const { return Bits.size(); } 672e62c1185bee05facc25d1d725434f517261d308bChris Lattner 67336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 67405bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<BitsInit *>(this)); 675e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 67636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init * 67736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines convertInitializerBitRange(const std::vector<unsigned> &Bits) const override; 678e62c1185bee05facc25d1d725434f517261d308bChris Lattner 67936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isComplete() const override { 680e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0; i != getNumBits(); ++i) 681e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (!getBit(i)->isComplete()) return false; 682e62c1185bee05facc25d1d725434f517261d308bChris Lattner return true; 683e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 6841808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen bool allInComplete() const { 6851808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen for (unsigned i = 0; i != getNumBits(); ++i) 6861808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen if (getBit(i)->isComplete()) return false; 6871808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen return true; 6881808e4d251005b122b1d3f7a08a01a55c328da1cJohnny Chen } 68936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 690e62c1185bee05facc25d1d725434f517261d308bChris Lattner 69136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 692307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 69336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override { 694307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao assert(Bit < Bits.size() && "Bit index out of range!"); 695307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return Bits[Bit]; 696307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 697e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 698e62c1185bee05facc25d1d725434f517261d308bChris Lattner 699135fe6ac5f5b80ef68c19b3ec7bb0063e28f2babBenjamin Kramer/// IntInit - 7 - Represent an initialization by a literal integer value. 70007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 701e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greeneclass IntInit : public TypedInit { 70263f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t Value; 703dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 704b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva explicit IntInit(int64_t V) 705b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : TypedInit(IK_IntInit, IntRecTy::get()), Value(V) {} 706e62c1185bee05facc25d1d725434f517261d308bChris Lattner 707a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper IntInit(const IntInit &Other) LLVM_DELETED_FUNCTION; 708a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper IntInit &operator=(const IntInit &Other) LLVM_DELETED_FUNCTION; 709dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 710dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 711b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 712b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_IntInit; 713b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 71405bce0beee87512e52428d4b80f5a8e79a949576David Greene static IntInit *get(int64_t V); 715dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 71663f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman int64_t getValue() const { return Value; } 717e62c1185bee05facc25d1d725434f517261d308bChris Lattner 71836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 71905bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<IntInit *>(this)); 720e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 72136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init * 72236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines convertInitializerBitRange(const std::vector<unsigned> &Bits) const override; 723e62c1185bee05facc25d1d725434f517261d308bChris Lattner 72436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 725e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 726e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveListElementReference - This method is used to implement 727e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 728e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// now, we return the resolved value, otherwise we return null. 72936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveListElementReference(Record &R, const RecordVal *RV, 73036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Elt) const override { 73150bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off int"); 732e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene } 733307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 73436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override { 735236bcf1fcd6164d624956c0858593c1a780b9a0bAaron Ballman return BitInit::get((Value & (1ULL << Bit)) != 0); 736307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 737e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 738e62c1185bee05facc25d1d725434f517261d308bChris Lattner 73907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// StringInit - "foo" - Represent an initialization by a string value. 74007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 741beb31a51f67f651c5fa3c5094a78266d04a697a5David Greeneclass StringInit : public TypedInit { 742e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::string Value; 743dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 744d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit StringInit(const std::string &V) 745b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : TypedInit(IK_StringInit, StringRecTy::get()), Value(V) {} 746e62c1185bee05facc25d1d725434f517261d308bChris Lattner 747a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper StringInit(const StringInit &Other) LLVM_DELETED_FUNCTION; 748a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper StringInit &operator=(const StringInit &Other) LLVM_DELETED_FUNCTION; 74936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void anchor() override; 750dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 751dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 752b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 753b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_StringInit; 754b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 755ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen static StringInit *get(StringRef); 756dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 7575c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner const std::string &getValue() const { return Value; } 7585c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 75936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 76005bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<StringInit *>(this)); 761e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 762e62c1185bee05facc25d1d725434f517261d308bChris Lattner 76336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override { return "\"" + Value + "\""; } 76436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsUnquotedString() const override { return Value; } 765beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 766beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// resolveListElementReference - This method is used to implement 767beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 768beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene /// now, we return the resolved value, otherwise we return null. 76936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveListElementReference(Record &R, const RecordVal *RV, 77036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Elt) const override { 77150bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off string"); 772beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 773307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 77436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override { 775307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao llvm_unreachable("Illegal bit reference off string"); 776307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 777e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 778e62c1185bee05facc25d1d725434f517261d308bChris Lattner 77907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// ListInit - [AL, AH, CL] - Represent a list of defs 78007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 781aad4c9fc37b38cae21343173084c81d789535446David Greeneclass ListInit : public TypedInit, public FoldingSetNode { 78205bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Values; 783dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 784e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 78505bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::vector<Init*>::const_iterator const_iterator; 7865f9f9ba00b85eb19da2618f393e43a6a11b5d892David Greene 787aad4c9fc37b38cae21343173084c81d789535446David Greeneprivate: 78805bce0beee87512e52428d4b80f5a8e79a949576David Greene explicit ListInit(ArrayRef<Init *> Range, RecTy *EltTy) 789b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : TypedInit(IK_ListInit, ListRecTy::get(EltTy)), 790b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva Values(Range.begin(), Range.end()) {} 791e62c1185bee05facc25d1d725434f517261d308bChris Lattner 792a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper ListInit(const ListInit &Other) LLVM_DELETED_FUNCTION; 793a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper ListInit &operator=(const ListInit &Other) LLVM_DELETED_FUNCTION; 794dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 795dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 796b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 797b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_ListInit; 798b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 79905bce0beee87512e52428d4b80f5a8e79a949576David Greene static ListInit *get(ArrayRef<Init *> Range, RecTy *EltTy); 800dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 801aad4c9fc37b38cae21343173084c81d789535446David Greene void Profile(FoldingSetNodeID &ID) const; 802aad4c9fc37b38cae21343173084c81d789535446David Greene 8037cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner unsigned getSize() const { return Values.size(); } 80405bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getElement(unsigned i) const { 8057cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner assert(i < Values.size() && "List element index out of range!"); 8067cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner return Values[i]; 807e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 808e62c1185bee05facc25d1d725434f517261d308bChris Lattner 80950d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner Record *getElementAsRecord(unsigned i) const; 81021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 81136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init * 81236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines convertInitListSlice(const std::vector<unsigned> &Elements) const override; 813b0fef64dc98d32b90782360aa9480417b7ca34fdChris Lattner 81436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 81505bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<ListInit *>(this)); 816e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 817e62c1185bee05facc25d1d725434f517261d308bChris Lattner 8181dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// resolveReferences - This method is used by classes that refer to other 8191dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// variables which may not be defined at the time they expression is formed. 8201dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// If a value is set for the variable later, this method will be called on 8211dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// users of the value to allow the value to propagate out. 8221dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// 82336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 8241dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 82536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 82682137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov 82705bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init*> getValues() const { return Values; } 828c45a2cacd09f88b8b715fd89f5bf6c2347b2cce9David Greene 82982137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline const_iterator begin() const { return Values.begin(); } 83082137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline const_iterator end () const { return Values.end(); } 83182137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov 83282137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline size_t size () const { return Values.size(); } 83382137bd061440070839f2b94c8b7c16da4f41a6dAnton Korobeynikov inline bool empty() const { return Values.empty(); } 834e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene 835e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// resolveListElementReference - This method is used to implement 836e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// VarListElementInit::resolveReferences. If the list element is resolvable 837e1b469170bb3ab259fd488fb95c29efe802cdd6aDavid Greene /// now, we return the resolved value, otherwise we return null. 83836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveListElementReference(Record &R, const RecordVal *RV, 83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Elt) const override; 840307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 84136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override { 842307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao llvm_unreachable("Illegal bit reference off list"); 843307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 844e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 845e62c1185bee05facc25d1d725434f517261d308bChris Lattner 846d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// OpInit - Base class for operators 847d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 848d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass OpInit : public TypedInit { 849a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper OpInit(const OpInit &Other) LLVM_DELETED_FUNCTION; 850a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper OpInit &operator=(OpInit &Other) LLVM_DELETED_FUNCTION; 851d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher 852dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greeneprotected: 853b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva explicit OpInit(InitKind K, RecTy *Type) : TypedInit(K, Type) {} 854dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 855dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 856b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 857b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() >= IK_FirstOpInit && 858b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva I->getKind() <= IK_LastOpInit; 859b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 860d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Clone - Clone this operator, replacing arguments with the new list 86105bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual OpInit *clone(std::vector<Init *> &Operands) const = 0; 862d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 863a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman virtual int getNumOperands() const = 0; 86405bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *getOperand(int i) const = 0; 865d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 866d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Fold - If possible, fold this to a simpler init. Return this if not 867d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // possible to fold. 86805bce0beee87512e52428d4b80f5a8e79a949576David Greene virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const = 0; 869d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 87036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 87105bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<OpInit *>(this)); 872d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 87321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 87436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveListElementReference(Record &R, const RecordVal *RV, 87536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Elt) const override; 876307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 87736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override; 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 }; 885dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 886e6c27de069225e1122c78385ad22a2ff656db8e6David Greeneprivate: 887e6c27de069225e1122c78385ad22a2ff656db8e6David Greene UnaryOp Opc; 88805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS; 889dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 89005bce0beee87512e52428d4b80f5a8e79a949576David Greene UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type) 891b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : OpInit(IK_UnOpInit, Type), Opc(opc), LHS(lhs) {} 892dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 893a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper UnOpInit(const UnOpInit &Other) LLVM_DELETED_FUNCTION; 894a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper UnOpInit &operator=(const UnOpInit &Other) LLVM_DELETED_FUNCTION; 895dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 896e6c27de069225e1122c78385ad22a2ff656db8e6David Greenepublic: 897b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 898b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_UnOpInit; 899b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 90005bce0beee87512e52428d4b80f5a8e79a949576David Greene static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type); 901d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 902e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // Clone - Clone this operator, replacing arguments with the new list 90336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OpInit *clone(std::vector<Init *> &Operands) const override { 904aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 1 && 905aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for unary operation"); 906dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return UnOpInit::get(getOpcode(), *Operands.begin(), getType()); 907e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 908d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 90936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int getNumOperands() const override { return 1; } 91036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getOperand(int i) const override { 911e6c27de069225e1122c78385ad22a2ff656db8e6David Greene assert(i == 0 && "Invalid operand id for unary operator"); 912e6c27de069225e1122c78385ad22a2ff656db8e6David Greene return getOperand(); 913e6c27de069225e1122c78385ad22a2ff656db8e6David Greene } 91421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 915e6c27de069225e1122c78385ad22a2ff656db8e6David Greene UnaryOp getOpcode() const { return Opc; } 91605bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperand() const { return LHS; } 917d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 918e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // Fold - If possible, fold this to a simpler init. Return this if not 919e6c27de069225e1122c78385ad22a2ff656db8e6David Greene // possible to fold. 92036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const override; 921d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 92236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 92321870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 92436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 925e6c27de069225e1122c78385ad22a2ff656db8e6David Greene}; 926e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 927e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// BinOpInit - !op (X, Y) - Combine two inits. 928e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene/// 929d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greeneclass BinOpInit : public OpInit { 930e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greenepublic: 931dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines enum BinaryOp { ADD, SHL, SRA, SRL, LISTCONCAT, STRCONCAT, CONCAT, EQ }; 932dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 933e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greeneprivate: 934e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene BinaryOp Opc; 93505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS, *RHS; 936dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 93705bce0beee87512e52428d4b80f5a8e79a949576David Greene BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) : 938b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva OpInit(IK_BinOpInit, Type), Opc(opc), LHS(lhs), RHS(rhs) {} 939dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 940a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper BinOpInit(const BinOpInit &Other) LLVM_DELETED_FUNCTION; 941a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper BinOpInit &operator=(const BinOpInit &Other) LLVM_DELETED_FUNCTION; 942dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 943dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 944b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 945b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_BinOpInit; 946b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 94705bce0beee87512e52428d4b80f5a8e79a949576David Greene static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs, 94805bce0beee87512e52428d4b80f5a8e79a949576David Greene RecTy *Type); 94921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 950d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene // Clone - Clone this operator, replacing arguments with the new list 95136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OpInit *clone(std::vector<Init *> &Operands) const override { 952aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 2 && 953aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for binary operation"); 954dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType()); 955d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 956d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 95736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int getNumOperands() const override { return 2; } 95836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getOperand(int i) const override { 959aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert((i == 0 || i == 1) && "Invalid operand id for binary operator"); 960d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene if (i == 0) { 961d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene return getLHS(); 96221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 963d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene return getRHS(); 964d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 965d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene } 966d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 967e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene BinaryOp getOpcode() const { return Opc; } 96805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getLHS() const { return LHS; } 96905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getRHS() const { return RHS; } 970e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 971e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene // Fold - If possible, fold this to a simpler init. Return this if not 972e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene // possible to fold. 97336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const override; 974e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 97536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 97621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 97736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 978e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene}; 979e8cf21e8e3db64dd49777d6bf6c867d47e9f5407David Greene 980d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// TernOpInit - !op (X, Y, Z) - Combine two inits. 981d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene/// 9824afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneclass TernOpInit : public OpInit { 9834afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greenepublic: 984ffc0ab6037aa45bc22f57433148e5f586843b3a7David Greene enum TernaryOp { SUBST, FOREACH, IF }; 985dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 9864afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greeneprivate: 9874afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene TernaryOp Opc; 98805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *LHS, *MHS, *RHS; 989dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 99005bce0beee87512e52428d4b80f5a8e79a949576David Greene TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs, 991f37dd02f7743ebd2424480361f5a7db510495c4fDavid Greene RecTy *Type) : 992b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva OpInit(IK_TernOpInit, Type), Opc(opc), LHS(lhs), MHS(mhs), RHS(rhs) {} 993dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 994a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper TernOpInit(const TernOpInit &Other) LLVM_DELETED_FUNCTION; 995a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper TernOpInit &operator=(const TernOpInit &Other) LLVM_DELETED_FUNCTION; 996dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 997dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 998b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 999b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_TernOpInit; 1000b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 100105bce0beee87512e52428d4b80f5a8e79a949576David Greene static TernOpInit *get(TernaryOp opc, Init *lhs, 100205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *mhs, Init *rhs, 100305bce0beee87512e52428d4b80f5a8e79a949576David Greene RecTy *Type); 100421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 10054afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // Clone - Clone this operator, replacing arguments with the new list 100636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OpInit *clone(std::vector<Init *> &Operands) const override { 1007aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert(Operands.size() == 3 && 1008aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Wrong number of operands for ternary operation"); 1009dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene return TernOpInit::get(getOpcode(), Operands[0], Operands[1], Operands[2], 1010dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene getType()); 10114afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10124afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 101336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int getNumOperands() const override { return 3; } 101436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getOperand(int i) const override { 1015aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky assert((i == 0 || i == 1 || i == 2) && 1016aa0b3df5a03304cf6fbc27d95a0d95717a3a61d0Nick Lewycky "Invalid operand id for ternary operator"); 10174afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene if (i == 0) { 10184afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getLHS(); 101921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else if (i == 1) { 10204afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getMHS(); 102121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson } else { 10224afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene return getRHS(); 10234afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10244afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene } 10254afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 10264afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene TernaryOp getOpcode() const { return Opc; } 102705bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getLHS() const { return LHS; } 102805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getMHS() const { return MHS; } 102905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getRHS() const { return RHS; } 10304afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene 10314afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // Fold - If possible, fold this to a simpler init. Return this if not 10324afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene // possible to fold. 103336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const override; 103421870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 103536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isComplete() const override { return false; } 1036548f5a0b751aafba88473e4863c2baf7741b56a5Bill Wendling 103736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 103821870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 103936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 10404afc509b7ffe2c4ea234dfd7af5105feb21685d9David Greene}; 1041d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene 104207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// VarInit - 'Opcode' - Represent a reference to an entire variable object. 104307278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 10447331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass VarInit : public TypedInit { 1045ee6dca17252de152720655282fb4b74b76fb2fe9David Greene Init *VarName; 1046dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1047d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher explicit VarInit(const std::string &VN, RecTy *T) 1048b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : TypedInit(IK_VarInit, T), VarName(StringInit::get(VN)) {} 1049ee6dca17252de152720655282fb4b74b76fb2fe9David Greene explicit VarInit(Init *VN, RecTy *T) 1050b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : TypedInit(IK_VarInit, T), VarName(VN) {} 1051dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1052a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper VarInit(const VarInit &Other) LLVM_DELETED_FUNCTION; 1053a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper VarInit &operator=(const VarInit &Other) LLVM_DELETED_FUNCTION; 1054dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1055dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 1056b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 1057b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_VarInit; 1058b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 105905bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarInit *get(const std::string &VN, RecTy *T); 106005bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarInit *get(Init *VN, RecTy *T); 10613da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 106236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 106305bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarInit *>(this)); 1064e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1065e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1066ee6dca17252de152720655282fb4b74b76fb2fe9David Greene const std::string &getName() const; 1067ee6dca17252de152720655282fb4b74b76fb2fe9David Greene Init *getNameInit() const { return VarName; } 1068ee6dca17252de152720655282fb4b74b76fb2fe9David Greene std::string getNameInitAsString() const { 1069ee6dca17252de152720655282fb4b74b76fb2fe9David Greene return getNameInit()->getAsUnquotedString(); 1070ee6dca17252de152720655282fb4b74b76fb2fe9David Greene } 1071e62c1185bee05facc25d1d725434f517261d308bChris Lattner 107236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveListElementReference(Record &R, const RecordVal *RV, 107336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Elt) const override; 10747331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 107536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RecTy *getFieldType(const std::string &FieldName) const override; 107636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getFieldInit(Record &R, const RecordVal *RV, 107736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const std::string &FieldName) const override; 10789b929aa7495ee0b5d389370baeb332456632b2feChris Lattner 10799b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// resolveReferences - This method is used by classes that refer to other 10809b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// variables which may not be defined at the time they expression is formed. 10819b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// If a value is set for the variable later, this method will be called on 10829b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// users of the value to allow the value to propagate out. 10839b929aa7495ee0b5d389370baeb332456632b2feChris Lattner /// 108436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 10853da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 108636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override; 1087307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 108836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override { return getName(); } 1089e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1090e62c1185bee05facc25d1d725434f517261d308bChris Lattner 10917331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner/// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field. 109207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner/// 1093e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass VarBitInit : public Init { 109405bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *TI; 1095e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Bit; 1096dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1097b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva VarBitInit(TypedInit *T, unsigned B) : Init(IK_VarBitInit), TI(T), Bit(B) { 1098307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao assert(T->getType() && 109963554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva (isa<IntRecTy>(T->getType()) || 110063554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva (isa<BitsRecTy>(T->getType()) && 110163554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva cast<BitsRecTy>(T->getType())->getNumBits() > B)) && 11027331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner "Illegal VarBitInit expression!"); 11037331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner } 1104e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1105a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper VarBitInit(const VarBitInit &Other) LLVM_DELETED_FUNCTION; 1106a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper VarBitInit &operator=(const VarBitInit &Other) LLVM_DELETED_FUNCTION; 1107dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1108dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 1109b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 1110b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_VarBitInit; 1111b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 111205bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarBitInit *get(TypedInit *T, unsigned B); 1113dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 111436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 111505bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarBitInit *>(this)); 1116e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1117e62c1185bee05facc25d1d725434f517261d308bChris Lattner 111836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBitVar() const override { return TI; } 111936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getBitNum() const override { return Bit; } 11203da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 112136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 112236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 1123307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 112436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned B) const override { 1125307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao assert(B < 1 && "Bit index out of range!"); 1126307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao return const_cast<VarBitInit*>(this); 1127307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao } 1128e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1129e62c1185bee05facc25d1d725434f517261d308bChris Lattner 11303da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman/// VarListElementInit - List[4] - Represent access to one element of a var or 11311dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner/// field. 11321dba7abdd77e19c230f0426825a5ae4879471dccChris Lattnerclass VarListElementInit : public TypedInit { 113305bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *TI; 11341dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner unsigned Element; 1135dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 113605bce0beee87512e52428d4b80f5a8e79a949576David Greene VarListElementInit(TypedInit *T, unsigned E) 1137b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : TypedInit(IK_VarListElementInit, 1138b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva cast<ListRecTy>(T->getType())->getElementType()), 1139b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva TI(T), Element(E) { 114063554988a94b8a4bcf3de77659a0b27c07a0975dSean Silva assert(T->getType() && isa<ListRecTy>(T->getType()) && 11411dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner "Illegal VarBitInit expression!"); 11421dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 11431dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 1144a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper VarListElementInit(const VarListElementInit &Other) LLVM_DELETED_FUNCTION; 1145a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper void operator=(const VarListElementInit &Other) LLVM_DELETED_FUNCTION; 1146dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1147dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 1148b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 1149b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_VarListElementInit; 1150b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 115105bce0beee87512e52428d4b80f5a8e79a949576David Greene static VarListElementInit *get(TypedInit *T, unsigned E); 1152dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 115336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 115405bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<VarListElementInit *>(this)); 11551dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner } 11561dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 115705bce0beee87512e52428d4b80f5a8e79a949576David Greene TypedInit *getVariable() const { return TI; } 11581dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner unsigned getElementNum() const { return Element; } 11591dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 11601dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// resolveListElementReference - This method is used to implement 11611dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// VarListElementInit::resolveReferences. If the list element is resolvable 11621dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner /// now, we return the resolved value, otherwise we return null. 116336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveListElementReference(Record &R, const RecordVal *RV, 116436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Elt) const override; 11651dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner 116636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 116736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 1168307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 116936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override; 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 118936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 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 119736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RecTy *getFieldType(const std::string &FieldName) const override; 119836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getFieldInit(Record &R, const RecordVal *RV, 119936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const std::string &FieldName) const override; 12003da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 120136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 1202beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene 120336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override { 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. 121036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveListElementReference(Record &R, const RecordVal *RV, 121136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Elt) const override { 121250bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off def"); 1213beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 1214e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1215e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1216a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner/// FieldInit - X.Y - Represent a reference to a subfield of a variable 1217a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner/// 12187331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattnerclass FieldInit : public TypedInit { 121905bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Rec; // Record we are referring to 1220a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner std::string FieldName; // Field we are accessing 1221dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 122205bce0beee87512e52428d4b80f5a8e79a949576David Greene FieldInit(Init *R, const std::string &FN) 1223b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : TypedInit(IK_FieldInit, R->getFieldType(FN)), Rec(R), FieldName(FN) { 12247331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner assert(getType() && "FieldInit with non-record type!"); 1225a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner } 1226a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 1227a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper FieldInit(const FieldInit &Other) LLVM_DELETED_FUNCTION; 1228a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper FieldInit &operator=(const FieldInit &Other) LLVM_DELETED_FUNCTION; 1229dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1230dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 1231b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 1232b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_FieldInit; 1233b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 123405bce0beee87512e52428d4b80f5a8e79a949576David Greene static FieldInit *get(Init *R, const std::string &FN); 123505bce0beee87512e52428d4b80f5a8e79a949576David Greene static FieldInit *get(Init *R, const Init *FN); 1236dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 123736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 123805bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<FieldInit *>(this)); 1239a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner } 1240a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 124136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override; 1242307525cd24c3b9c081ddb3c34a3418f2875cd556Michael Liao 124336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveListElementReference(Record &R, const RecordVal *RV, 124436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Elt) const override; 12457331ab9d56cb7007b1f5c92c90cd0d18a0af1fe3Chris Lattner 124636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 124724151a6888c752ff1d7fc80b500f5a836c9ac528Chris Lattner 124836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override { 12493aba4d39fd101238ac06871895c28f26736d80cbChris Lattner return Rec->getAsString() + "." + FieldName; 1250a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner } 1251a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner}; 1252a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner 12538c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// DagInit - (v a, b) - Represent a DAG tree value. DAG inits are required 12548c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// to have at least one value then a (possibly empty) list of arguments. Each 12558c06318821e4febb3a7f1afbab72dae362f1bf5fChris Lattner/// argument can have a name associated with it. 12568e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner/// 125778621a851ae84520de7d24a6d61e1dcf25749712David Greeneclass DagInit : public TypedInit, public FoldingSetNode { 125805bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Val; 12597cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman std::string ValName; 126005bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> Args; 126191290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner std::vector<std::string> ArgNames; 1262dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 126305bce0beee87512e52428d4b80f5a8e79a949576David Greene DagInit(Init *V, const std::string &VN, 126405bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init *> ArgRange, 126578621a851ae84520de7d24a6d61e1dcf25749712David Greene ArrayRef<std::string> NameRange) 1266b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva : TypedInit(IK_DagInit, DagRecTy::get()), Val(V), ValName(VN), 126778621a851ae84520de7d24a6d61e1dcf25749712David Greene Args(ArgRange.begin(), ArgRange.end()), 126878621a851ae84520de7d24a6d61e1dcf25749712David Greene ArgNames(NameRange.begin(), NameRange.end()) {} 126921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1270a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper DagInit(const DagInit &Other) LLVM_DELETED_FUNCTION; 1271a558d91cedd4fd5c2d3327a8a18e12c35530efa8Craig Topper DagInit &operator=(const DagInit &Other) LLVM_DELETED_FUNCTION; 1272dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 1273dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greenepublic: 1274b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva static bool classof(const Init *I) { 1275b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva return I->getKind() == IK_DagInit; 1276b0c6fa3b4b74d9cd03beb5a4cb9702abc85ac169Sean Silva } 127705bce0beee87512e52428d4b80f5a8e79a949576David Greene static DagInit *get(Init *V, const std::string &VN, 127805bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<Init *> ArgRange, 127905bce0beee87512e52428d4b80f5a8e79a949576David Greene ArrayRef<std::string> NameRange); 128005bce0beee87512e52428d4b80f5a8e79a949576David Greene static DagInit *get(Init *V, const std::string &VN, 128105bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::vector< 128205bce0beee87512e52428d4b80f5a8e79a949576David Greene std::pair<Init*, std::string> > &args); 1283dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 128478621a851ae84520de7d24a6d61e1dcf25749712David Greene void Profile(FoldingSetNodeID &ID) const; 1285dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene 128636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *convertInitializerTo(RecTy *Ty) const override { 128705bce0beee87512e52428d4b80f5a8e79a949576David Greene return Ty->convertValue(const_cast<DagInit *>(this)); 12888e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner } 12898e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner 129005bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getOperator() const { return Val; } 129191290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner 12927cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman const std::string &getName() const { return ValName; } 12937cee81703de8333d457ec9e560b0537b71df5a48Nate Begeman 129491290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner unsigned getNumArgs() const { return Args.size(); } 129505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getArg(unsigned Num) const { 129691290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner assert(Num < Args.size() && "Arg number out of range!"); 129791290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner return Args[Num]; 129891290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner } 129991290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner const std::string &getArgName(unsigned Num) const { 130091290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner assert(Num < ArgNames.size() && "Arg number out of range!"); 130191290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner return ArgNames[Num]; 130291290d7e9a743de363049e705a8303ae1f3a6e68Chris Lattner } 13038e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner 130436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveReferences(Record &R, const RecordVal *RV) const override; 1305990db46e9ae7faa742a152ca4126d0bee9f1df9cChris Lattner 130636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getAsString() const override; 13077674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 130805bce0beee87512e52428d4b80f5a8e79a949576David Greene typedef std::vector<Init*>::const_iterator const_arg_iterator; 13097674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov typedef std::vector<std::string>::const_iterator const_name_iterator; 13107674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 13117674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_arg_iterator arg_begin() const { return Args.begin(); } 13127674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_arg_iterator arg_end () const { return Args.end(); } 13137674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 13147674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline size_t arg_size () const { return Args.size(); } 13157674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline bool arg_empty() const { return Args.empty(); } 13167674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 13177674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_name_iterator name_begin() const { return ArgNames.begin(); } 13187674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline const_name_iterator name_end () const { return ArgNames.end(); } 13197674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 13207674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline size_t name_size () const { return ArgNames.size(); } 13217674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov inline bool name_empty() const { return ArgNames.empty(); } 13227674b9d2970fc38358c5666fce57d84c5700c69eAnton Korobeynikov 132336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *getBit(unsigned Bit) const override { 132450bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal bit reference off dag"); 1325beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 132621870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 132736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Init *resolveListElementReference(Record &R, const RecordVal *RV, 132836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Elt) const override { 132950bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Illegal element reference off dag"); 1330beb31a51f67f651c5fa3c5094a78266d04a697a5David Greene } 13318e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner}; 1332e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1333e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1334e62c1185bee05facc25d1d725434f517261d308bChris Lattner// High-Level Classes 1335e62c1185bee05facc25d1d725434f517261d308bChris Lattner//===----------------------------------------------------------------------===// 1336e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1337e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordVal { 1338011dca7fac07100695dd3685bfaddbea58a468b9David Greene Init *Name; 1339e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecTy *Ty; 1340e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned Prefix; 134105bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *Value; 1342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1343e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1344011dca7fac07100695dd3685bfaddbea58a468b9David Greene RecordVal(Init *N, RecTy *T, unsigned P); 1345e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecordVal(const std::string &N, RecTy *T, unsigned P); 1346e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1347011dca7fac07100695dd3685bfaddbea58a468b9David Greene const std::string &getName() const; 1348de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene const Init *getNameInit() const { return Name; } 1349de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene std::string getNameInitAsString() const { 1350de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene return getNameInit()->getAsUnquotedString(); 1351de703e25fe98f7c0dfab1750cf337a013b5c9603David Greene } 1352e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1353e62c1185bee05facc25d1d725434f517261d308bChris Lattner unsigned getPrefix() const { return Prefix; } 1354e62c1185bee05facc25d1d725434f517261d308bChris Lattner RecTy *getType() const { return Ty; } 135505bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getValue() const { return Value; } 1356e62c1185bee05facc25d1d725434f517261d308bChris Lattner 135705bce0beee87512e52428d4b80f5a8e79a949576David Greene bool setValue(Init *V) { 1358e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (V) { 1359e62c1185bee05facc25d1d725434f517261d308bChris Lattner Value = V->convertInitializerTo(Ty); 1360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Value == nullptr; 1361e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Value = nullptr; 1363e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1364e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1365e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1366e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 13671a55180238dbcf11113f610aea010447e51f595bDaniel Dunbar void print(raw_ostream &OS, bool PrintSem = true) const; 1368e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1369e62c1185bee05facc25d1d725434f517261d308bChris Lattner 13701a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarinline raw_ostream &operator<<(raw_ostream &OS, const RecordVal &RV) { 1371e62c1185bee05facc25d1d725434f517261d308bChris Lattner RV.print(OS << " "); 1372e62c1185bee05facc25d1d725434f517261d308bChris Lattner return OS; 1373e62c1185bee05facc25d1d725434f517261d308bChris Lattner} 1374e62c1185bee05facc25d1d725434f517261d308bChris Lattner 137589e0f74094a6a86170c2c70fe8c6c19cb99c97a0Chris Lattnerclass Record { 13766f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar static unsigned LastID; 13776f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar 13786f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar // Unique record ID. 13796f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar unsigned ID; 13800d886401b3ec09b0c2d267942b07702a2f0740f4David Greene Init *Name; 1381376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen // Location where record was instantiated, followed by the location of 1382376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen // multiclass prototypes used. 1383376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen SmallVector<SMLoc, 4> Locs; 1384e22b321d2276b634519165b101b02d92c2fcf5c7David Greene std::vector<Init *> TemplateArgs; 1385e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::vector<RecordVal> Values; 1386b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose std::vector<Record *> SuperClasses; 1387b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose std::vector<SMRange> SuperClassRanges; 138867db883487fca3472fdde51e931657e22d4d0495Chris Lattner 138967db883487fca3472fdde51e931657e22d4d0495Chris Lattner // Tracks Record instances. Not owned by Record. 139067db883487fca3472fdde51e931657e22d4d0495Chris Lattner RecordKeeper &TrackedRecords; 139167db883487fca3472fdde51e931657e22d4d0495Chris Lattner 139277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit *TheInit; 1393d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose bool IsAnonymous; 139477f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 1395f7931b7040de1c829e678b4e391308bc3376f8a0David Greene void init(); 13960d886401b3ec09b0c2d267942b07702a2f0740f4David Greene void checkName(); 13970d886401b3ec09b0c2d267942b07702a2f0740f4David Greene 1398e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 13999c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner // Constructs a record. 1400376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen explicit Record(const std::string &N, ArrayRef<SMLoc> locs, 1401d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose RecordKeeper &records, bool Anonymous = false) : 1402376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen ID(LastID++), Name(StringInit::get(N)), Locs(locs.begin(), locs.end()), 1403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TrackedRecords(records), TheInit(nullptr), IsAnonymous(Anonymous) { 1404004adaf3452a355ada2a54bcb61dc8925a718651David Greene init(); 14050abdadbce7e04af76145154d75ca41dab749b8d6David Greene } 1406d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose explicit Record(Init *N, ArrayRef<SMLoc> locs, RecordKeeper &records, 1407d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose bool Anonymous = false) : 1408376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen ID(LastID++), Name(N), Locs(locs.begin(), locs.end()), 1409dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TrackedRecords(records), TheInit(nullptr), IsAnonymous(Anonymous) { 1410004adaf3452a355ada2a54bcb61dc8925a718651David Greene init(); 1411675f85d0f240930d571f4e557bb92237ee48124eDavid Greene } 1412cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson 1413cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson // When copy-constructing a Record, we must still guarantee a globally unique 1414cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson // ID number. All other fields can be copied normally. 1415cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson Record(const Record &O) : 1416cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson ID(LastID++), Name(O.Name), Locs(O.Locs), TemplateArgs(O.TemplateArgs), 1417cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson Values(O.Values), SuperClasses(O.SuperClasses), 1418b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose SuperClassRanges(O.SuperClassRanges), TrackedRecords(O.TrackedRecords), 1419b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose TheInit(O.TheInit), IsAnonymous(O.IsAnonymous) { } 1420cdac1be34a0b329f1bd2232a3f4995432f633c3cOwen Anderson 1421e62c1185bee05facc25d1d725434f517261d308bChris Lattner ~Record() {} 142221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1423117ccb7e518f05e4bf3df058fc402262f897ff0bChris Lattner static unsigned getNewUID() { return LastID++; } 1424f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov 14256f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar unsigned getID() const { return ID; } 14266f5cc82686d6f25abc3e373b241bc2cb47d87268Daniel Dunbar 14270d886401b3ec09b0c2d267942b07702a2f0740f4David Greene const std::string &getName() const; 1428d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene Init *getNameInit() const { 1429d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene return Name; 1430d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene } 1431d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene const std::string getNameInitAsString() const { 1432d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene return getNameInit()->getAsUnquotedString(); 1433d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene } 1434d7f8941e77fef20dc147fe102a2024cc5ccef366David Greene 14350d886401b3ec09b0c2d267942b07702a2f0740f4David Greene void setName(Init *Name); // Also updates RecordKeeper. 1436936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void setName(const std::string &Name); // Also updates RecordKeeper. 143721870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1438376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen ArrayRef<SMLoc> getLoc() const { return Locs; } 143921870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 144077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen /// get the corresponding DefInit. 144177f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen DefInit *getDefInit(); 144277f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen 1443e22b321d2276b634519165b101b02d92c2fcf5c7David Greene const std::vector<Init *> &getTemplateArgs() const { 1444e62c1185bee05facc25d1d725434f517261d308bChris Lattner return TemplateArgs; 1445e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1446e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::vector<RecordVal> &getValues() const { return Values; } 1447e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::vector<Record*> &getSuperClasses() const { return SuperClasses; } 1448b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose ArrayRef<SMRange> getSuperClassRanges() const { return SuperClassRanges; } 1449e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1450e22b321d2276b634519165b101b02d92c2fcf5c7David Greene bool isTemplateArg(Init *Name) const { 1451e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i) 1452e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (TemplateArgs[i] == Name) return true; 1453e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1454e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1455e22b321d2276b634519165b101b02d92c2fcf5c7David Greene bool isTemplateArg(StringRef Name) const { 1456e22b321d2276b634519165b101b02d92c2fcf5c7David Greene return isTemplateArg(StringInit::get(Name.str())); 1457e22b321d2276b634519165b101b02d92c2fcf5c7David Greene } 1458e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1459ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen const RecordVal *getValue(const Init *Name) const { 1460e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 1461ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen if (Values[i].getNameInit() == Name) return &Values[i]; 1462dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1463e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1464ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen const RecordVal *getValue(StringRef Name) const { 1465ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen return getValue(StringInit::get(Name)); 1466ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen } 1467ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen RecordVal *getValue(const Init *Name) { 1468e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 1469ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen if (Values[i].getNameInit() == Name) return &Values[i]; 1470dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 1471e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1472ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen RecordVal *getValue(StringRef Name) { 1473ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen return getValue(StringInit::get(Name)); 1474ebaf92c67dac4974f98a08f8096d3eb2f4edd09dJakob Stoklund Olesen } 147596a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene 1476e22b321d2276b634519165b101b02d92c2fcf5c7David Greene void addTemplateArg(Init *Name) { 1477e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(!isTemplateArg(Name) && "Template arg already defined!"); 1478e62c1185bee05facc25d1d725434f517261d308bChris Lattner TemplateArgs.push_back(Name); 1479e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1480e22b321d2276b634519165b101b02d92c2fcf5c7David Greene void addTemplateArg(StringRef Name) { 1481e22b321d2276b634519165b101b02d92c2fcf5c7David Greene addTemplateArg(StringInit::get(Name.str())); 1482e22b321d2276b634519165b101b02d92c2fcf5c7David Greene } 1483e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1484e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addValue(const RecordVal &RV) { 1485dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(getValue(RV.getNameInit()) == nullptr && "Value already added!"); 1486e62c1185bee05facc25d1d725434f517261d308bChris Lattner Values.push_back(RV); 1487e338565757bfcfe9d762751c976684f66954fb45David Greene if (Values.size() > 1) 1488e338565757bfcfe9d762751c976684f66954fb45David Greene // Keep NAME at the end of the list. It makes record dumps a 1489e338565757bfcfe9d762751c976684f66954fb45David Greene // bit prettier and allows TableGen tests to be written more 1490e338565757bfcfe9d762751c976684f66954fb45David Greene // naturally. Tests can use CHECK-NEXT to look for Record 1491e338565757bfcfe9d762751c976684f66954fb45David Greene // fields they expect to see after a def. They can't do that if 1492e338565757bfcfe9d762751c976684f66954fb45David Greene // NAME is the first Record field. 1493e338565757bfcfe9d762751c976684f66954fb45David Greene std::swap(Values[Values.size() - 2], Values[Values.size() - 1]); 1494e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1495e62c1185bee05facc25d1d725434f517261d308bChris Lattner 149696a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene void removeValue(Init *Name) { 1497bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner for (unsigned i = 0, e = Values.size(); i != e; ++i) 149896a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene if (Values[i].getNameInit() == Name) { 1499bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner Values.erase(Values.begin()+i); 1500bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner return; 1501bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner } 150250bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper llvm_unreachable("Cannot remove an entry that does not exist!"); 1503bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner } 1504bfce056ea89f4a243c429c12e47ec78168bb1d2cChris Lattner 150596a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene void removeValue(StringRef Name) { 150696a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene removeValue(StringInit::get(Name.str())); 150796a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene } 150896a9f78c4aa1bc188f3f7ee869bed44cb7a6ff0eDavid Greene 150902475f1fd502fa1729d1fc447417087acf9e96c8Ted Kremenek bool isSubClassOf(const Record *R) const { 1510e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i) 1511e62c1185bee05facc25d1d725434f517261d308bChris Lattner if (SuperClasses[i] == R) 1512ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen return true; 1513e62c1185bee05facc25d1d725434f517261d308bChris Lattner return false; 1514e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1515e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1516c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner bool isSubClassOf(StringRef Name) const { 1517a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i) 15187474c29d903d479e7f99eb0d1d097f75289c5f48David Greene if (SuperClasses[i]->getNameInitAsString() == Name) 1519a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner return true; 1520a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner return false; 1521a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner } 1522a40e5ad69f5ab5da1671a5e84e75a60202ad03d5Chris Lattner 1523b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose void addSuperClass(Record *R, SMRange Range) { 1524e62c1185bee05facc25d1d725434f517261d308bChris Lattner assert(!isSubClassOf(R) && "Already subclassing record!"); 1525e62c1185bee05facc25d1d725434f517261d308bChris Lattner SuperClasses.push_back(R); 1526b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose SuperClassRanges.push_back(Range); 1527e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1528e62c1185bee05facc25d1d725434f517261d308bChris Lattner 15297dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// resolveReferences - If there are any field references that refer to fields 15307dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// that have been filled in, we can propagate the values now. 15317dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// 1532dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void resolveReferences() { resolveReferencesTo(nullptr); } 15337dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner 15347dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// resolveReferencesTo - If anything in this record refers to RV, replace the 15357dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// reference to RV with the RHS of RV. If RV is null, we resolve all 15367dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner /// possible references. 15377dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner void resolveReferencesTo(const RecordVal *RV); 1538e62c1185bee05facc25d1d725434f517261d308bChris Lattner 153967db883487fca3472fdde51e931657e22d4d0495Chris Lattner RecordKeeper &getRecords() const { 15409c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner return TrackedRecords; 154167db883487fca3472fdde51e931657e22d4d0495Chris Lattner } 154267db883487fca3472fdde51e931657e22d4d0495Chris Lattner 1543d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose bool isAnonymous() const { 1544d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose return IsAnonymous; 1545d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose } 1546d122009e57217bd574703c46dd14b1a9235ed0b7Jordan Rose 1547e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 15485c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 15495c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner //===--------------------------------------------------------------------===// 15505c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner // High-level methods useful to tablegen back-ends 15515c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner // 15525c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 1553c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// getValueInit - Return the initializer for a value with the specified name, 1554c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// or throw an exception if the field does not exist. 1555c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner /// 155605bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *getValueInit(StringRef FieldName) const; 1557c7d58024f8bed33e0b3e795e51a62ec30248aff3Chris Lattner 155864110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen /// Return true if the named field is unset. 155964110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen bool isValueUnset(StringRef FieldName) const { 156064110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen return getValueInit(FieldName) == UnsetInit::get(); 156164110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen } 156264110ffc9eecbe999c29ac9d9f6697447a110036Jakob Stoklund Olesen 15635c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// getValueAsString - This method looks up the specified field and returns 15645c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// its value as a string, throwing an exception if the field does not exist 15655c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// or if the value is not a string. 15665c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// 1567c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::string getValueAsString(StringRef FieldName) const; 15685c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner 15696f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// getValueAsBitsInit - This method looks up the specified field and returns 15706f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// its value as a BitsInit, throwing an exception if the field does not exist 15716f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// or if the value is not the right type. 15726f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner /// 157305bce0beee87512e52428d4b80f5a8e79a949576David Greene BitsInit *getValueAsBitsInit(StringRef FieldName) const; 15746f334ad8f5c9319b334e2ba68b89d0dd46156788Chris Lattner 157558c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// getValueAsListInit - This method looks up the specified field and returns 157658c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// its value as a ListInit, throwing an exception if the field does not exist 157758c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// or if the value is not the right type. 157858c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// 157905bce0beee87512e52428d4b80f5a8e79a949576David Greene ListInit *getValueAsListInit(StringRef FieldName) const; 158058c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner 1581b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner /// getValueAsListOfDefs - This method looks up the specified field and 1582af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov /// returns its value as a vector of records, throwing an exception if the 1583b0e103d46bf8799ac5523157a6ed4a78d1751a89Chris Lattner /// field does not exist or if the value is not the right type. 1584fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey /// 1585c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::vector<Record*> getValueAsListOfDefs(StringRef FieldName) const; 1586fd306bfdd294772560b3a1cf762bc1081f66e6baJim Laskey 1587f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// getValueAsListOfInts - This method looks up the specified field and 1588f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// returns its value as a vector of integers, throwing an exception if the 1589f41b75d85be5d53f7c4ef0f60d55bf7df33a881cMikhail Glushenkov /// field does not exist or if the value is not the right type. 1590af1b61debd9cb6570ed815a27cd94897f0dca3cfAnton Korobeynikov /// 1591c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const; 159221870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1593bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// getValueAsListOfStrings - This method looks up the specified field and 1594bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// returns its value as a vector of strings, throwing an exception if the 1595bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// field does not exist or if the value is not the right type. 1596bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson /// 1597bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson std::vector<std::string> getValueAsListOfStrings(StringRef FieldName) const; 1598bea6f615eefae279e53bbb63a31d2c3c67274c45Owen Anderson 1599dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// getValueAsDef - This method looks up the specified field and returns its 1600dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// value as a Record, throwing an exception if the field does not exist or if 1601dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// the value is not the right type. 1602dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner /// 1603c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner Record *getValueAsDef(StringRef FieldName) const; 1604dbb295bd0d0e084ffbaae314026f389d83453619Chris Lattner 16050969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// getValueAsBit - This method looks up the specified field and returns its 16060969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// value as a bit, throwing an exception if the field does not exist or if 16070969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// the value is not the right type. 16080969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner /// 1609c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner bool getValueAsBit(StringRef FieldName) const; 16100969c5bdf2de91fc03480dba86bcb6ce76612d8bChris Lattner 1611c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen /// getValueAsBitOrUnset - This method looks up the specified field and 1612c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen /// returns its value as a bit. If the field is unset, sets Unset to true and 161336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// returns false. 1614c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen /// 1615c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen bool getValueAsBitOrUnset(StringRef FieldName, bool &Unset) const; 1616c1f10fd5b9a780d1c42dca7143d7a8acd9bd9377Jakob Stoklund Olesen 161758c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// getValueAsInt - This method looks up the specified field and returns its 161863f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman /// value as an int64_t, throwing an exception if the field does not exist or 161963f97201dc9dcebbe84d1b73113166c64212b4b8Dan Gohman /// if the value is not the right type. 162058c5de16927ea5ba1b454a69ce7ee4fdc371b9f7Chris Lattner /// 1621c19418f31fa8ab09ff43c57150e5042dbe368f49Chris Lattner int64_t getValueAsInt(StringRef FieldName) const; 1622784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner 1623784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// getValueAsDag - This method looks up the specified field and returns its 1624784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// value as an Dag, throwing an exception if the field does not exist or if 1625784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// the value is not the right type. 1626784a793636b7e766e868822c213ca96b0755b5c1Chris Lattner /// 162705bce0beee87512e52428d4b80f5a8e79a949576David Greene DagInit *getValueAsDag(StringRef FieldName) const; 1628e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1629e62c1185bee05facc25d1d725434f517261d308bChris Lattner 16301a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const Record &R); 1631e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1632c7cafcd815519b06318629b424abe746437e1389David Greenestruct MultiClass { 1633c7cafcd815519b06318629b424abe746437e1389David Greene Record Rec; // Placeholder for template args and Name. 1634c7cafcd815519b06318629b424abe746437e1389David Greene typedef std::vector<Record*> RecordVector; 1635c7cafcd815519b06318629b424abe746437e1389David Greene RecordVector DefPrototypes; 1636d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 1637d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene void dump() const; 1638d34a73b3b709001c56db68a4d9a84e5d2002b1f0David Greene 16394b18691c3580674691875ec37c84a1c4edf2d586Jim Grosbach MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) : 164067db883487fca3472fdde51e931657e22d4d0495Chris Lattner Rec(Name, Loc, Records) {} 1641c7cafcd815519b06318629b424abe746437e1389David Greene}; 1642c7cafcd815519b06318629b424abe746437e1389David Greene 1643e62c1185bee05facc25d1d725434f517261d308bChris Lattnerclass RecordKeeper { 1644e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*> Classes, Defs; 1645cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 1646e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic: 1647e62c1185bee05facc25d1d725434f517261d308bChris Lattner ~RecordKeeper() { 1648e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (std::map<std::string, Record*>::iterator I = Classes.begin(), 1649ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen E = Classes.end(); I != E; ++I) 1650e62c1185bee05facc25d1d725434f517261d308bChris Lattner delete I->second; 1651e62c1185bee05facc25d1d725434f517261d308bChris Lattner for (std::map<std::string, Record*>::iterator I = Defs.begin(), 1652ea3e5e56fdc56e5c2ddafb36eab26676e137dfa0Jeff Cohen E = Defs.end(); I != E; ++I) 1653e62c1185bee05facc25d1d725434f517261d308bChris Lattner delete I->second; 1654e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 16553da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 1656e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::map<std::string, Record*> &getClasses() const { return Classes; } 1657e62c1185bee05facc25d1d725434f517261d308bChris Lattner const std::map<std::string, Record*> &getDefs() const { return Defs; } 1658e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1659e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getClass(const std::string &Name) const { 1660e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*>::const_iterator I = Classes.find(Name); 1661dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return I == Classes.end() ? nullptr : I->second; 1662e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1663e62c1185bee05facc25d1d725434f517261d308bChris Lattner Record *getDef(const std::string &Name) const { 1664e62c1185bee05facc25d1d725434f517261d308bChris Lattner std::map<std::string, Record*>::const_iterator I = Defs.find(Name); 1665dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return I == Defs.end() ? nullptr : I->second; 1666e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1667e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addClass(Record *R) { 166872cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen bool Ins = Classes.insert(std::make_pair(R->getName(), R)).second; 166972cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen (void)Ins; 167072cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen assert(Ins && "Class already exists"); 1671e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1672e62c1185bee05facc25d1d725434f517261d308bChris Lattner void addDef(Record *R) { 167372cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen bool Ins = Defs.insert(std::make_pair(R->getName(), R)).second; 167472cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen (void)Ins; 167572cba6cdf640411e2fb6207858a0abd87c4286fcJakob Stoklund Olesen assert(Ins && "Record already exists"); 1676e62c1185bee05facc25d1d725434f517261d308bChris Lattner } 1677e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1678936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// removeClass - Remove, but do not delete, the specified record. 1679936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// 1680936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void removeClass(const std::string &Name) { 1681936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner assert(Classes.count(Name) && "Class does not exist!"); 1682936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner Classes.erase(Name); 1683936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner } 1684936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// removeDef - Remove, but do not delete, the specified record. 1685936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner /// 1686936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner void removeDef(const std::string &Name) { 1687936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner assert(Defs.count(Name) && "Def does not exist!"); 1688936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner Defs.erase(Name); 1689936dd9274aca2f2ccd0e10dafe83a22767475fa6Chris Lattner } 169021870411d9c1807526b613d04c2ebae5a43c263bBob Wilson 1691ab47ae3381aa2372009a9054260461c20324b555Chris Lattner //===--------------------------------------------------------------------===// 1692ab47ae3381aa2372009a9054260461c20324b555Chris Lattner // High-level helper methods, useful for tablegen backends... 1693ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 1694ab47ae3381aa2372009a9054260461c20324b555Chris Lattner /// getAllDerivedDefinitions - This method returns all concrete definitions 1695ab47ae3381aa2372009a9054260461c20324b555Chris Lattner /// that derive from the specified class name. If a class with the specified 16965c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner /// name does not exist, an exception is thrown. 16975c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner std::vector<Record*> 16985c737ad4d669b835b8fb973a5c477a4dbb213830Chris Lattner getAllDerivedDefinitions(const std::string &ClassName) const; 1699ab47ae3381aa2372009a9054260461c20324b555Chris Lattner 1700e62c1185bee05facc25d1d725434f517261d308bChris Lattner void dump() const; 1701e62c1185bee05facc25d1d725434f517261d308bChris Lattner}; 1702e62c1185bee05facc25d1d725434f517261d308bChris Lattner 1703690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// LessRecord - Sorting predicate to sort record pointers by name. 1704690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// 1705690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecord { 1706690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner bool operator()(const Record *Rec1, const Record *Rec2) const { 1707160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0; 1708690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner } 1709690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner}; 1710690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner 171190fee07298bec2e5160a599db850b9553d02377bSean Silva/// LessRecordByID - Sorting predicate to sort record pointers by their 171290fee07298bec2e5160a599db850b9553d02377bSean Silva/// unique ID. If you just need a deterministic order, use this, since it 171390fee07298bec2e5160a599db850b9553d02377bSean Silva/// just compares two `unsigned`; the other sorting predicates require 171490fee07298bec2e5160a599db850b9553d02377bSean Silva/// string manipulation. 171590fee07298bec2e5160a599db850b9553d02377bSean Silvastruct LessRecordByID { 171690fee07298bec2e5160a599db850b9553d02377bSean Silva bool operator()(const Record *LHS, const Record *RHS) const { 171790fee07298bec2e5160a599db850b9553d02377bSean Silva return LHS->getID() < RHS->getID(); 171890fee07298bec2e5160a599db850b9553d02377bSean Silva } 171990fee07298bec2e5160a599db850b9553d02377bSean Silva}; 172090fee07298bec2e5160a599db850b9553d02377bSean Silva 172121870411d9c1807526b613d04c2ebae5a43c263bBob Wilson/// LessRecordFieldName - Sorting predicate to sort record pointers by their 17227c9a7728d9dd248ebee8f2dd969d303711d487a9Jim Grosbach/// name field. 1723690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner/// 1724690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattnerstruct LessRecordFieldName { 1725690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner bool operator()(const Record *Rec1, const Record *Rec2) const { 1726690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name"); 1727690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner } 1728690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner}; 1729690d80eefeb522c8697ef39d9e6d19b0be276f0eChris Lattner 1730b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosierstruct LessRecordRegister { 1731b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier static size_t min(size_t a, size_t b) { return a < b ? a : b; } 1732b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier static bool ascii_isdigit(char x) { return x >= '0' && x <= '9'; } 1733b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 1734b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier struct RecordParts { 1735b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier SmallVector<std::pair< bool, StringRef>, 4> Parts; 1736b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 1737b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier RecordParts(StringRef Rec) { 1738b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier if (Rec.empty()) 1739b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier return; 1740b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 1741b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier size_t Len = 0; 1742b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier const char *Start = Rec.data(); 1743b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier const char *Curr = Start; 1744b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier bool isDigitPart = ascii_isdigit(Curr[0]); 1745b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier for (size_t I = 0, E = Rec.size(); I != E; ++I, ++Len) { 1746b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier bool isDigit = ascii_isdigit(Curr[I]); 1747b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier if (isDigit != isDigitPart) { 1748b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier Parts.push_back(std::make_pair(isDigitPart, StringRef(Start, Len))); 1749b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier Len = 0; 1750b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier Start = &Curr[I]; 1751b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier isDigitPart = ascii_isdigit(Curr[I]); 1752b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier } 1753b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier } 1754b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier // Push the last part. 1755b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier Parts.push_back(std::make_pair(isDigitPart, StringRef(Start, Len))); 1756b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier } 1757b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 1758b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier size_t size() { return Parts.size(); } 1759b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 1760b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier std::pair<bool, StringRef> getPart(size_t i) { 1761b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier assert (i < Parts.size() && "Invalid idx!"); 1762b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier return Parts[i]; 1763b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier } 1764b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier }; 1765b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 1766b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier bool operator()(const Record *Rec1, const Record *Rec2) const { 1767b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier RecordParts LHSParts(StringRef(Rec1->getName())); 1768b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier RecordParts RHSParts(StringRef(Rec2->getName())); 1769b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 1770b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier size_t LHSNumParts = LHSParts.size(); 1771b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier size_t RHSNumParts = RHSParts.size(); 1772b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier assert (LHSNumParts && RHSNumParts && "Expected at least one part!"); 1773b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 1774b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier if (LHSNumParts != RHSNumParts) 1775b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier return LHSNumParts < RHSNumParts; 1776b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 1777b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier // We expect the registers to be of the form [_a-zA-z]+([0-9]*[_a-zA-Z]*)*. 1778b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier for (size_t I = 0, E = LHSNumParts; I < E; I+=2) { 1779b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier std::pair<bool, StringRef> LHSPart = LHSParts.getPart(I); 1780b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier std::pair<bool, StringRef> RHSPart = RHSParts.getPart(I); 1781ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier // Expect even part to always be alpha. 1782ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier assert (LHSPart.first == false && RHSPart.first == false && 1783ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier "Expected both parts to be alpha."); 1784ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier if (int Res = LHSPart.second.compare(RHSPart.second)) 1785ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier return Res < 0; 1786b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier } 1787b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier for (size_t I = 1, E = LHSNumParts; I < E; I+=2) { 1788b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier std::pair<bool, StringRef> LHSPart = LHSParts.getPart(I); 1789b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier std::pair<bool, StringRef> RHSPart = RHSParts.getPart(I); 1790ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier // Expect odd part to always be numeric. 1791ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier assert (LHSPart.first == true && RHSPart.first == true && 1792ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier "Expected both parts to be numeric."); 1793ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier if (LHSPart.second.size() != RHSPart.second.size()) 1794ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier return LHSPart.second.size() < RHSPart.second.size(); 1795ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier 1796ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier unsigned LHSVal, RHSVal; 1797f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu 1798f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu bool LHSFailed = LHSPart.second.getAsInteger(10, LHSVal); (void)LHSFailed; 1799f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu assert(!LHSFailed && "Unable to convert LHS to integer."); 1800f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu bool RHSFailed = RHSPart.second.getAsInteger(10, RHSVal); (void)RHSFailed; 1801f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu assert(!RHSFailed && "Unable to convert RHS to integer."); 1802f801b8fe7ace6306b653f5ea68c378f35e9f2d6dRichard Trieu 1803ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier if (LHSVal != RHSVal) 1804ff4196adcf602cbe0581f3240c3fef0847159550Chad Rosier return LHSVal < RHSVal; 1805b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier } 1806b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier return LHSNumParts < RHSNumParts; 1807b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier } 1808b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier}; 1809b7110cf5b5e4832e8ded6db7ab7577e3cfa2c462Chad Rosier 18101a55180238dbcf11113f610aea010447e51f595bDaniel Dunbarraw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK); 1811e62c1185bee05facc25d1d725434f517261d308bChris Lattner 181230c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring 181330c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name. 181430c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass, 181530c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene Init *Name, const std::string &Scoper); 181630c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 181730c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// QualifyName - Return an Init with a qualifier prefix referring 181830c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene/// to CurRec's name. 181930c2225b3c4a89b527ee38542ab8990ca0a682f1David GreeneInit *QualifyName(Record &CurRec, MultiClass *CurMultiClass, 182030c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene const std::string &Name, const std::string &Scoper); 182130c2225b3c4a89b527ee38542ab8990ca0a682f1David Greene 1822d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 1823d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 1824e62c1185bee05facc25d1d725434f517261d308bChris Lattner#endif 1825