Otawa  0.10
Registration.h
Go to the documentation of this file.
1 /*
2  * $Id$
3  * Registration class interface
4  *
5  * This file is part of OTAWA
6  * Copyright (c) 2005-7, IRIT UPS.
7  *
8  * OTAWA is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * OTAWA is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with OTAWA; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 #ifndef OTAWA_PROC_REGISTRATION_H_
23 #define OTAWA_PROC_REGISTRATION_H_
24 
25 #include <elm/genstruct/SLList.h>
26 #include <elm/util/Initializer.h>
27 #include <elm/util/Version.h>
28 #include <otawa/prop/Identifier.h>
29 
30 namespace otawa {
31 
32 using namespace elm;
33 using namespace elm::genstruct;
34 
35 // Pre-declaration
36 class Processor;
37 class AbstractFeature;
38 namespace proc { class declare; }
39 
40 // fast initialization
41 namespace p {
42  const int end = 0;
43  const int require = 1; // AbstractFeature *
44  const int provide = 2; // AbstractFeature *
45  const int invalidate = 3; // AbstractFeature *
46  const int use = 4; // AbstractFeature *
47  const int base = 5; // AbstractRegistration *
48  const int config = 6; // AbstractIdentifier *
49 } // p
50 
51 // FeatureUsage class
52 class FeatureUsage {
53 public:
54  typedef enum kind_t {
60  } kind_t;
61 
62  inline FeatureUsage(void): _kind(none), _feature(0) { }
63  inline FeatureUsage(kind_t kind, const AbstractFeature& feature)
64  : _kind(kind), _feature(&feature) { }
65  inline FeatureUsage(const FeatureUsage& usage)
66  : _kind(usage._kind), _feature(usage._feature) { }
67  inline FeatureUsage& operator=(const FeatureUsage& usage)
68  { _kind = usage._kind; _feature = usage._feature; return *this; }
69 
70  inline kind_t kind(void) const { return _kind; }
71  inline const AbstractFeature& feature(void) const { return *_feature; }
72 
73 private:
76 };
77 
78 
79 // AbstractRegistration class
81 public:
82  inline const string& name(void) const { return _name; }
83  inline const Version& version(void) const { return _version; }
84  inline AbstractRegistration& base(void) const { return *_base; }
85  virtual Processor *make(void) const = 0;
86  virtual bool isFinal(void) const = 0;
87  bool provides(const AbstractFeature& feature);
88  bool requires(const AbstractFeature& feature);
89  bool invalidates(const AbstractFeature& feature);
90  bool uses(const AbstractFeature& feature);
91 
92  // Private use only
93  void initialize(void);
94 
95 protected:
98  AbstractRegistration(string name, Version version, AbstractRegistration *base);
99  virtual ~AbstractRegistration(void) { }
100  void init(cstring name, const Version& version, int tag, VarArg& args);
101  void setFeatures(const SLList<FeatureUsage>& features);
102  void setConfigs(const SLList<AbstractIdentifier *>& configs);
103  void record(void);
104 
105 private:
106  friend class declare;
107  friend class Processor;
108  friend class ConfigIter;
109  friend class FeatureIter;
110  string _name;
115 };
116 
117 
118 // NullRegistration class
120 public:
121  virtual Processor *make(void) const { return 0; }
122  virtual bool isFinal(void) const { return false; }
123 };
124 
125 
126 // MetaRegistration class
128 public:
129  inline MetaRegistration(cstring name, const Version& version, int tag, ...)
130  { VARARG_BEGIN(args, tag) init(name, version, tag, args); VARARG_END }
131  inline MetaRegistration(cstring name, const Version& version, int tag, VarArg& args)
132  { init(name, version, tag, args); }
133  virtual Processor *make(void) const { return 0; }
134  virtual bool isFinal(void) const { return false; }
135 };
136 
137 // Registration class
138 template <class T> class Registration: public AbstractRegistration {
139 public:
140  inline Registration(void) { }
141  inline Registration(cstring name, const Version& version, int tag, ...)
142  { VARARG_BEGIN(args, tag) init(name, version, tag, args); VARARG_END }
143  inline Registration(cstring name, const Version& version, int tag, VarArg& args)
144  { init(name, version, tag, args); }
145  virtual Processor *make(void) const { return new T; }
146  virtual bool isFinal(void) const { return true; }
147 };
148 
149 
150 // AbstractMake class
152 public:
153  virtual ~AbstractMaker(void) { }
154  virtual Processor *make(void) const = 0;
155 };
156 
157 
158 // Make class
159 template <class C>
160 class Maker: public AbstractMaker {
161 public:
162  virtual Processor *make(void) const { return new C(); }
163 };
164 
165 // useful
166 extern AbstractMaker *null_maker, *no_maker;
167 
168 namespace p {
169 
170 // make class
171 class init {
172  friend class declare;
173 
174  /*class AbstractMaker {
175  public:
176  virtual ~AbstractMaker(void) { }
177  virtual Processor *make(void) = 0;
178  };
179 
180  template <class T> class Maker: public AbstractMaker {
181  public:
182  virtual Processor *make(void) { return new T(); }
183  };*/
184 
185 public:
186  inline init(string name, Version version)
187  : _name(name), _version(version), _base(0), _maker(0) { }
188  inline init(string name, Version version, AbstractRegistration& base)
189  : _name(name), _version(version), _base(&base), _maker(0) { }
191  { features.add(FeatureUsage(FeatureUsage::require, feature)); return *this; }
193  { features.add(FeatureUsage(FeatureUsage::provide, feature)); return *this; }
195  { features.add(FeatureUsage(FeatureUsage::invalidate, feature)); return *this; }
196  inline init& use(const AbstractFeature& feature)
197  { features.add(FeatureUsage(FeatureUsage::use, feature)); return *this; }
198  inline init& config(AbstractIdentifier& id) { configs.add(&id); return *this; }
199  inline init& base(AbstractRegistration& base) { _base = &base; return *this; }
200  template <class T> inline init& maker(void) { _maker = new Maker<T>(); return *this; }
201 
202 private:
203  string _name;
209 };
210 
211 
212 // declare class
214 public:
216  virtual ~declare(void);
217  virtual Processor *make(void) const;
218  virtual bool isFinal(void) const;
219 private:
221 };
222 
223 
224 } // proc
225 
226 } // otawa
227 
228 #endif /* OTAWA_PROC_REGISTRATION_H_ */
const AbstractFeature & feature(void) const
Definition: Registration.h:71
string _name
Definition: Registration.h:203
init & config(AbstractIdentifier &id)
Definition: Registration.h:198
Iterator on the features used by the processor.
Definition: Registry.h:75
AbstractRegistration & base(void) const
Definition: Registration.h:84
AbstractMaker * no_maker
Special maker for "no processor available".
Definition: proc_Registry.cpp:406
const int config
Definition: Registration.h:48
Definition: Registration.h:151
virtual Processor * make(void) const
Build the registered processor.
Definition: Registration.h:121
Definition: Registration.h:127
SLList< FeatureUsage > features
Definition: Registration.h:114
Definition: Registration.h:52
Definition: Registration.h:57
Definition: Registration.h:119
Definition: Registration.h:55
AbstractMaker * _maker
Definition: Registration.h:208
virtual Processor * make(void) const
Build the registered processor.
Definition: Registration.h:133
string _name
Definition: Registration.h:110
Definition: Registration.h:59
MetaRegistration(cstring name, const Version &version, int tag,...)
Definition: Registration.h:129
init & provide(const AbstractFeature &feature)
Definition: Registration.h:192
Version _version
Definition: Registration.h:204
Abstract class to represent the registered processors.
Definition: Registration.h:80
Definition: Registration.h:138
const int end
Definition: Registration.h:42
Registration(void)
Default constructor.
Definition: Registration.h:140
virtual ~AbstractMaker(void)
Definition: Registration.h:153
Class to declare simple a processor.
Definition: Registration.h:213
init & maker(void)
Definition: Registration.h:200
FeatureUsage(void)
Definition: Registration.h:62
FeatureUsage & operator=(const FeatureUsage &usage)
Definition: Registration.h:67
AbstractMaker * null_maker
Special maker for a null processor.
Definition: proc_Registry.cpp:400
virtual ~AbstractRegistration(void)
Definition: Registration.h:99
init(string name, Version version, AbstractRegistration &base)
Definition: Registration.h:188
kind_t
Definition: Registration.h:54
Registration(cstring name, const Version &version, int tag,...)
Definition: Registration.h:141
const int provide
Definition: Registration.h:44
StringOption proc(command, 'p',"processor","used processor","path","")
FeatureUsage(const FeatureUsage &usage)
Definition: Registration.h:65
virtual Processor * make(void) const
Build the registered processor.
Definition: Registration.h:145
Definition: Registration.h:56
Represents a unique identifier used by the annotation system.
Definition: AbstractIdentifier.h:32
Inst::kind_t kind
Definition: odisasm.cpp:106
virtual bool isFinal(void) const
Definition: Registration.h:122
init & require(const AbstractFeature &feature)
Definition: Registration.h:190
The processor class is implemented by all code processor.
Definition: Processor.h:49
Template to make a processor from its class passed as template parameter.
Definition: Registration.h:160
kind_t
Allowed types for values: NONE represents nothing; REG is only used for addresses, and represents a register; VAL represents some values (either a constant or an interval); ALL is the Top element.
Definition: ClpValue.h:53
AbstractRegistration * _base
Definition: Registration.h:205
kind_t _kind
Definition: Registration.h:74
const int use
Definition: Registration.h:46
virtual bool isFinal(void) const
Definition: Registration.h:146
const Version & version(void) const
Get the version of the processor.
Definition: Registration.h:83
FeatureUsage(kind_t kind, const AbstractFeature &feature)
Definition: Registration.h:63
const int require
Definition: Registration.h:43
Property * make(const Identifier< T > &id, const T &v)
Definition: info.h:31
const int invalidate
Definition: Registration.h:45
init(string name, Version version)
Definition: Registration.h:186
MetaRegistration(cstring name, const Version &version, int tag, VarArg &args)
Definition: Registration.h:131
AbstractRegistration * _base
Definition: Registration.h:112
SLList< AbstractIdentifier * > configs
Definition: Registration.h:113
const string & name(void) const
Get the name of the processor.
Definition: Registration.h:82
init & invalidate(const AbstractFeature &feature)
Definition: Registration.h:194
cstring name
Definition: odisasm.cpp:107
virtual Processor * make(void) const
Definition: Registration.h:162
const int base
Definition: Registration.h:47
virtual bool isFinal(void) const
Definition: Registration.h:134
const AbstractFeature * _feature
Definition: Registration.h:75
See Feature.
Definition: AbstractFeature.h:36
kind_t kind(void) const
Definition: Registration.h:70
init & base(AbstractRegistration &base)
Definition: Registration.h:199
const OptionalNone none
Iterator on the configurations of a processor.
Definition: Registry.h:58
Registration(cstring name, const Version &version, int tag, VarArg &args)
Definition: Registration.h:143
Version _version
Definition: Registration.h:111
SLList< FeatureUsage > features
Definition: Registration.h:207
init & use(const AbstractFeature &feature)
Definition: Registration.h:196
IntFormat base(int base, IntFormat fmt)
Definition: Registration.h:171
Shortcut to create a feature with a maker (without the mess of SilentFeature).
Definition: AbstractFeature.h:51
Definition: Registration.h:58
SLList< AbstractIdentifier * > configs
Definition: Registration.h:206
AbstractMaker * _maker
Definition: Registration.h:220