]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - tools/elftosb/elftosb2/ElftosbAST.h
merged tx6dl-devel into denx master branch
[karo-tx-uboot.git] / tools / elftosb / elftosb2 / ElftosbAST.h
1 /*
2  * File:        ElftosbAST.h
3  *
4  * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5  * See included license file for license details.
6  */
7 #if !defined(_ElftosbAST_h_)
8 #define _ElftosbAST_h_
9
10 #include "stdafx.h"
11 #include <string>
12 #include <list>
13 #include "smart_ptr.h"
14 #include "EvalContext.h"
15
16 namespace elftosb
17 {
18
19 // forward reference
20 class SymbolASTNode;
21
22 /*!
23  * \brief Token location in the source file.
24  */
25 struct token_loc_t
26 {
27         int m_firstLine;        //!< Starting line of the token.
28         int m_lastLine;         //!< Ending line of the token.
29 };
30
31 /*!
32  * \brief The base class for all AST node classes.
33  */
34 class ASTNode
35 {
36 public:
37         //! \brief Default constructor.
38         ASTNode() : m_parent(0) {}
39         
40         //! \brief Constructor taking a parent node.
41         ASTNode(ASTNode * parent) : m_parent(parent) {}
42         
43         //! \brief Copy constructor.
44         ASTNode(const ASTNode & other) : m_parent(other.m_parent) {}
45         
46         //! \brief Destructor.
47         virtual ~ASTNode() {}
48         
49         //! \brief Returns an exact duplicate of this object.
50         virtual ASTNode * clone() const = 0;
51         
52         //! \brief Returns the name of the object's class.
53         virtual std::string nodeName() const { return "ASTNode"; }
54
55         //! \name Parents
56         //@{
57         virtual ASTNode * getParent() const { return m_parent; }
58         virtual void setParent(ASTNode * newParent) { m_parent = newParent; }
59         //@}
60         
61         //! \name Tree printing
62         //@{
63         virtual void printTree() const { printTree(0); }
64         virtual void printTree(int indent) const;
65         //@}
66         
67         //! \name Location
68         //@{
69         virtual void setLocation(token_loc_t & loc) { m_location = loc; }
70         virtual void setLocation(token_loc_t & first, token_loc_t & last);
71         virtual void setLocation(ASTNode * loc) { setLocation(loc->getLocation()); }
72         virtual void setLocation(ASTNode * first, ASTNode * last);
73         
74         virtual token_loc_t & getLocation() { return m_location; }
75         virtual const token_loc_t & getLocation() const { return m_location; }
76         
77         virtual int getFirstLine() { return m_location.m_firstLine; }
78         virtual int getLastLine() { return m_location.m_lastLine; }
79         //@}
80
81 protected:
82         ASTNode * m_parent;     //!< Pointer to parent node of this object. May be NULL.
83         token_loc_t m_location; //!< Location of this node in the source file.
84         
85         //! \brief Prints \a indent number of spaces.
86         void printIndent(int indent) const;
87 };
88
89 /*!
90  * \brief AST node that contains other AST nodes.
91  *
92  * Unlike other AST nodes, the location of a ListASTNode is computed dynamically
93  * based on the nodes in its list. Or mostly dynamic at least. The updateLocation()
94  * method is used to force the list object to recalculate its beginning and ending
95  * line numbers.
96  *
97  * \todo Figure out why it crashes in the destructor when the
98  *       ast_list_t type is a list of smart_ptr<ASTNode>.
99  */
100 class ListASTNode : public ASTNode
101 {
102 public:
103         typedef std::list< /*smart_ptr<ASTNode>*/ ASTNode * > ast_list_t;       
104         typedef ast_list_t::iterator iterator;
105         typedef ast_list_t::const_iterator const_iterator;
106
107 public:
108         ListASTNode() {}
109         
110         ListASTNode(const ListASTNode & other);
111         
112         virtual ~ListASTNode();
113         
114         virtual ASTNode * clone() const { return new ListASTNode(*this); }
115         
116         virtual std::string nodeName() const { return "ListASTNode"; }
117
118         virtual void printTree(int indent) const;
119
120         //! \name List operations
121         //@{
122         //! \brief Adds \a node to the end of the ordered list of child nodes.
123         virtual void appendNode(ASTNode * node);
124         
125         //! \brief Returns the number of nodes in this list.
126         virtual unsigned nodeCount() const { return static_cast<unsigned>(m_list.size()); }
127         //@}
128
129         //! \name Node iterators
130         //@{
131         inline iterator begin() { return m_list.begin(); }
132         inline iterator end() { return m_list.end(); }
133
134         inline const_iterator begin() const { return m_list.begin(); }
135         inline const_iterator end() const { return m_list.end(); }
136         //@}
137         
138         //! \name Location
139         //@{
140         virtual void updateLocation();
141         //@}
142
143 protected:
144         ast_list_t m_list;      //!< Ordered list of child nodes.
145 };
146
147 /*!
148  *
149  */
150 class OptionsBlockASTNode : public ASTNode
151 {
152 public:
153         OptionsBlockASTNode(ListASTNode * options) : ASTNode(), m_options(options) {}
154         
155         inline ListASTNode * getOptions() { return m_options; }
156         
157         virtual ASTNode * clone() const { return NULL; }
158
159 protected:
160         smart_ptr<ListASTNode> m_options;
161 };
162
163 /*!
164  *
165  */
166 class ConstantsBlockASTNode : public ASTNode
167 {
168 public:
169         ConstantsBlockASTNode(ListASTNode * constants) : ASTNode(), m_constants(constants) {}
170         
171         inline ListASTNode * getConstants() { return m_constants; }
172         
173         virtual ASTNode * clone() const { return NULL; }
174         
175 protected:
176         smart_ptr<ListASTNode> m_constants;
177 };
178
179 /*!
180  *
181  */
182 class SourcesBlockASTNode : public ASTNode
183 {
184 public:
185         SourcesBlockASTNode(ListASTNode * sources) : ASTNode(), m_sources(sources) {}
186         
187         inline ListASTNode * getSources() { return m_sources; }
188         
189         virtual ASTNode * clone() const { return NULL; }
190         
191 protected:
192         smart_ptr<ListASTNode> m_sources;
193 };
194
195 /*!
196  * \brief Root node for the entire file.
197  */
198 class CommandFileASTNode : public ASTNode
199 {
200 public:
201         CommandFileASTNode();
202         CommandFileASTNode(const CommandFileASTNode & other);
203         
204         virtual std::string nodeName() const { return "CommandFileASTNode"; }
205         
206         virtual ASTNode * clone() const { return new CommandFileASTNode(*this); }
207
208         virtual void printTree(int indent) const;
209
210         inline void setBlocks(ListASTNode * blocks) { m_blocks = blocks; }
211         inline void setOptions(ListASTNode * options) { m_options = options; }
212         inline void setConstants(ListASTNode * constants) { m_constants = constants; }
213         inline void setSources(ListASTNode * sources) { m_sources = sources; }
214         inline void setSections(ListASTNode * sections) { m_sections = sections; }
215         
216         inline ListASTNode * getBlocks() { return m_blocks; }
217         inline ListASTNode * getOptions() { return m_options; }
218         inline ListASTNode * getConstants() { return m_constants; }
219         inline ListASTNode * getSources() { return m_sources; }
220         inline ListASTNode * getSections() { return m_sections; }
221
222 protected:
223         smart_ptr<ListASTNode> m_blocks;
224         smart_ptr<ListASTNode> m_options;
225         smart_ptr<ListASTNode> m_constants;
226         smart_ptr<ListASTNode> m_sources;
227         smart_ptr<ListASTNode> m_sections;
228 };
229
230 /*!
231  * \brief Abstract base class for all expression AST nodes.
232  */
233 class ExprASTNode : public ASTNode
234 {
235 public:
236         ExprASTNode() : ASTNode() {}
237         ExprASTNode(const ExprASTNode & other) : ASTNode(other) {}
238
239         virtual std::string nodeName() const { return "ExprASTNode"; }
240
241         //! \brief Evaluate the expression and produce a result node to replace this one.
242         //!
243         //! The default implementation simply return this node unmodified. This
244         //! method is responsible for deleting any nodes that are no longer needed.
245         //! (?) how to delete this?
246         virtual ExprASTNode * reduce(EvalContext & context) { return this; }
247         
248         int_size_t resultIntSize(int_size_t a, int_size_t b);
249 };
250
251 /*!
252  *
253  */
254 class IntConstExprASTNode : public ExprASTNode
255 {
256 public:
257         IntConstExprASTNode(uint32_t value, int_size_t size=kWordSize)
258         :       ExprASTNode(), m_value(value), m_size(size)
259         {
260         }
261         
262         IntConstExprASTNode(const IntConstExprASTNode & other);
263
264         virtual std::string nodeName() const { return "IntConstExprASTNode"; }
265         
266         virtual ASTNode * clone() const { return new IntConstExprASTNode(*this); }
267
268         virtual void printTree(int indent) const;
269         
270         uint32_t getValue() const { return m_value; }
271         int_size_t getSize() const { return m_size; }
272
273 protected:
274         uint32_t m_value;
275         int_size_t m_size;
276 };
277
278 /*!
279  *
280  */
281 class VariableExprASTNode : public ExprASTNode
282 {
283 public:
284         VariableExprASTNode(std::string * name) : ExprASTNode(), m_variable(name) {}
285         VariableExprASTNode(const VariableExprASTNode & other);
286         
287         inline std::string * getVariableName() { return m_variable; }
288         
289         virtual ASTNode * clone() const { return new VariableExprASTNode(*this); }
290         
291         virtual std::string nodeName() const { return "VariableExprASTNode"; }
292
293         virtual void printTree(int indent) const;
294         
295         virtual ExprASTNode * reduce(EvalContext & context);
296         
297 protected:
298         smart_ptr<std::string> m_variable;
299 };
300
301 /*!
302  * \brief Expression node for a symbol reference.
303  *
304  * The symbol evaluates to its address.
305  */
306 class SymbolRefExprASTNode : public ExprASTNode
307 {
308 public:
309         SymbolRefExprASTNode(SymbolASTNode * sym) : ExprASTNode(), m_symbol(sym) {}
310         SymbolRefExprASTNode(const SymbolRefExprASTNode & other);
311         
312         virtual ASTNode * clone() const { return new SymbolRefExprASTNode(*this); }
313         
314         virtual std::string nodeName() const { return "SymbolRefExprASTNode"; }
315         
316         virtual void printTree(int indent) const;
317         
318         virtual ExprASTNode * reduce(EvalContext & context);
319         
320 protected:
321         SymbolASTNode * m_symbol;
322 };
323
324 /*!
325  * \brief Negates an expression.
326  */
327 class NegativeExprASTNode : public ExprASTNode
328 {
329 public:
330         NegativeExprASTNode(ExprASTNode * expr) : ExprASTNode(), m_expr(expr) {}
331         NegativeExprASTNode(const NegativeExprASTNode & other);
332
333         virtual ASTNode * clone() const { return new NegativeExprASTNode(*this); }
334
335         virtual std::string nodeName() const { return "NegativeExprASTNode"; }
336         
337         virtual void printTree(int indent) const;
338         
339         virtual ExprASTNode * reduce(EvalContext & context);
340         
341         ExprASTNode * getExpr() { return m_expr; }
342
343 protected:
344         smart_ptr<ExprASTNode> m_expr;
345 };
346
347 /*!
348  * \brief Performa a boolean inversion.
349  */
350 class BooleanNotExprASTNode : public ExprASTNode
351 {
352 public:
353         BooleanNotExprASTNode(ExprASTNode * expr) : ExprASTNode(), m_expr(expr) {}
354         BooleanNotExprASTNode(const BooleanNotExprASTNode & other);
355
356         virtual ASTNode * clone() const { return new BooleanNotExprASTNode(*this); }
357
358         virtual std::string nodeName() const { return "BooleanNotExprASTNode"; }
359         
360         virtual void printTree(int indent) const;
361         
362         virtual ExprASTNode * reduce(EvalContext & context);
363         
364         ExprASTNode * getExpr() { return m_expr; }
365
366 protected:
367         smart_ptr<ExprASTNode> m_expr;
368 };
369
370 /*!
371  * \brief Calls a built-in function with a source as the parameter.
372  */
373 class SourceFileFunctionASTNode : public ExprASTNode
374 {
375 public:
376         SourceFileFunctionASTNode(std::string * functionName, std::string * sourceFileName) : ExprASTNode(), m_functionName(functionName), m_sourceFile(sourceFileName) {}
377         SourceFileFunctionASTNode(const SourceFileFunctionASTNode & other);
378
379         virtual ASTNode * clone() const { return new SourceFileFunctionASTNode(*this); }
380
381         virtual std::string nodeName() const { return "SourceFileFunctionASTNode"; }
382         
383         virtual void printTree(int indent) const;
384         
385         virtual ExprASTNode * reduce(EvalContext & context);
386         
387         std::string * getFunctionName() { return m_functionName; }
388         std::string * getSourceFile() { return m_sourceFile; }
389
390 protected:
391         smart_ptr<std::string> m_functionName;
392         smart_ptr<std::string> m_sourceFile;
393 };
394
395 /*!
396  * \brief Returns true or false depending on whether a constant is defined.
397  */
398 class DefinedOperatorASTNode : public ExprASTNode
399 {
400 public:
401         DefinedOperatorASTNode(std::string * constantName) : ExprASTNode(), m_constantName(constantName) {}
402         DefinedOperatorASTNode(const DefinedOperatorASTNode & other);
403
404         virtual ASTNode * clone() const { return new DefinedOperatorASTNode(*this); }
405
406         virtual std::string nodeName() const { return "DefinedOperatorASTNode"; }
407         
408         virtual void printTree(int indent) const;
409         
410         virtual ExprASTNode * reduce(EvalContext & context);
411         
412         std::string * getConstantName() { return m_constantName; }
413
414 protected:
415         smart_ptr<std::string> m_constantName;  //!< Name of the constant.
416 };
417
418 class SymbolASTNode;
419
420 /*!
421  * \brief Returns an integer that is the size in bytes of the operand.
422  */
423 class SizeofOperatorASTNode : public ExprASTNode
424 {
425 public:
426         SizeofOperatorASTNode(std::string * constantName) : ExprASTNode(), m_constantName(constantName), m_symbol() {}
427         SizeofOperatorASTNode(SymbolASTNode * symbol) : ExprASTNode(), m_constantName(), m_symbol(symbol) {}
428         SizeofOperatorASTNode(const SizeofOperatorASTNode & other);
429
430         virtual ASTNode * clone() const { return new SizeofOperatorASTNode(*this); }
431
432         virtual std::string nodeName() const { return "SizeofOperatorASTNode"; }
433         
434         virtual void printTree(int indent) const;
435         
436         virtual ExprASTNode * reduce(EvalContext & context);
437         
438         std::string * getConstantName() { return m_constantName; }
439         SymbolASTNode * getSymbol() { return m_symbol; }
440
441 protected:
442         smart_ptr<std::string> m_constantName;  //!< Name of the constant.
443         smart_ptr<SymbolASTNode> m_symbol;      //!< Symbol reference. If this is non-NULL then the constant name is used instead.
444 };
445
446 /*!
447  *
448  */
449 class BinaryOpExprASTNode : public ExprASTNode
450 {
451 public:
452         enum operator_t
453         {
454                 kAdd,
455                 kSubtract,
456                 kMultiply,
457                 kDivide,
458                 kModulus,
459                 kPower,
460                 kBitwiseAnd,
461                 kBitwiseOr,
462                 kBitwiseXor,
463                 kShiftLeft,
464                 kShiftRight,
465                 kLessThan,
466                 kGreaterThan,
467                 kLessThanEqual,
468                 kGreaterThanEqual,
469                 kEqual,
470                 kNotEqual,
471                 kBooleanAnd,
472                 kBooleanOr
473         };
474         
475         BinaryOpExprASTNode(ExprASTNode * left, operator_t op, ExprASTNode * right)
476         :       ExprASTNode(), m_left(left), m_op(op), m_right(right)
477         {
478         }
479         
480         BinaryOpExprASTNode(const BinaryOpExprASTNode & other);
481         
482         virtual ASTNode * clone() const { return new BinaryOpExprASTNode(*this); }
483
484         virtual std::string nodeName() const { return "BinaryOpExprASTNode"; }
485         
486         virtual void printTree(int indent) const;
487         
488         virtual ExprASTNode * reduce(EvalContext & context);
489         
490         ExprASTNode * getLeftExpr() { return m_left; }
491         ExprASTNode * getRightExpr() { return m_right; }
492         operator_t getOp() const { return m_op; }
493
494 protected:
495         smart_ptr<ExprASTNode> m_left;
496         smart_ptr<ExprASTNode> m_right;
497         operator_t m_op;
498         
499         std::string getOperatorName() const;
500 };
501
502 /*!
503  * \brief Negates an expression.
504  */
505 class IntSizeExprASTNode : public ExprASTNode
506 {
507 public:
508         IntSizeExprASTNode(ExprASTNode * expr, int_size_t intSize) : ExprASTNode(), m_expr(expr), m_size(intSize) {}
509         IntSizeExprASTNode(const IntSizeExprASTNode & other);
510         
511         virtual ASTNode * clone() const { return new IntSizeExprASTNode(*this); }
512
513         virtual std::string nodeName() const { return "IntSizeExprASTNode"; }
514         
515         virtual void printTree(int indent) const;
516         
517         virtual ExprASTNode * reduce(EvalContext & context);
518         
519         ExprASTNode * getExpr() { return m_expr; }
520         int_size_t getIntSize() { return m_size; }
521
522 protected:
523         smart_ptr<ExprASTNode> m_expr;
524         int_size_t m_size;
525 };
526
527 /*!
528  * Base class for const AST nodes.
529  */
530 class ConstASTNode : public ASTNode
531 {
532 public:
533         ConstASTNode() : ASTNode() {}
534         ConstASTNode(const ConstASTNode & other) : ASTNode(other) {}
535
536 protected:
537 };
538
539 /*!
540  *
541  */
542 class ExprConstASTNode : public ConstASTNode
543 {
544 public:
545         ExprConstASTNode(ExprASTNode * expr) : ConstASTNode(), m_expr(expr) {}
546         ExprConstASTNode(const ExprConstASTNode & other);
547         
548         virtual ASTNode * clone() const { return new ExprConstASTNode(*this); }
549
550         virtual std::string nodeName() const { return "ExprConstASTNode"; }
551         
552         virtual void printTree(int indent) const;
553         
554         ExprASTNode * getExpr() { return m_expr; }
555
556 protected:
557         smart_ptr<ExprASTNode> m_expr;
558 };
559
560 /*!
561  *
562  */
563 class StringConstASTNode : public ConstASTNode
564 {
565 public:
566         StringConstASTNode(std::string * value) : ConstASTNode(), m_value(value) {}
567         StringConstASTNode(const StringConstASTNode & other);
568         
569         virtual ASTNode * clone() const { return new StringConstASTNode(*this); }
570
571         virtual std::string nodeName() const { return "StringConstASTNode"; }
572         
573         virtual void printTree(int indent) const;
574
575         std::string * getString() { return m_value; }
576
577 protected:
578         smart_ptr<std::string> m_value;
579 };
580
581 /*!
582  *
583  */
584 class BlobConstASTNode : public ConstASTNode
585 {
586 public:
587         BlobConstASTNode(Blob * value) : ConstASTNode(), m_blob(value) {}
588         BlobConstASTNode(const BlobConstASTNode & other);
589         
590         virtual ASTNode * clone() const { return new BlobConstASTNode(*this); }
591
592         virtual std::string nodeName() const { return "BlobConstASTNode"; }
593         
594         virtual void printTree(int indent) const;
595
596         Blob * getBlob() { return m_blob; }
597
598 protected:
599         smart_ptr<Blob> m_blob;
600 };
601
602 // Forward declaration.
603 struct hab_ivt;
604
605 /*!
606  * \brief Node for a constant IVT structure as used by HAB4.
607  */
608 class IVTConstASTNode : public ConstASTNode
609 {
610 public:
611     IVTConstASTNode() : ConstASTNode(), m_fields() {}
612     IVTConstASTNode(const IVTConstASTNode & other);
613     
614         virtual ASTNode * clone() const { return new IVTConstASTNode(*this); }
615     
616         virtual std::string nodeName() const { return "IVTConstASTNode"; }
617
618         virtual void printTree(int indent) const;
619     
620     void setFieldAssignments(ListASTNode * fields) { m_fields = fields; }
621     ListASTNode * getFieldAssignments() { return m_fields; }
622
623 protected:
624     //! Fields of the IVT are set through assignment statements.
625     smart_ptr<ListASTNode> m_fields;
626 };
627
628 /*!
629  *
630  */
631 class AssignmentASTNode : public ASTNode
632 {
633 public:
634         AssignmentASTNode(std::string * ident, ASTNode * value)
635         :       ASTNode(), m_ident(ident), m_value(value)
636         {
637         }
638         
639         AssignmentASTNode(const AssignmentASTNode & other);
640         
641         virtual ASTNode * clone() const { return new AssignmentASTNode(*this); }
642
643         virtual std::string nodeName() const { return "AssignmentASTNode"; }
644         
645         virtual void printTree(int indent) const;
646         
647         inline std::string * getIdent() { return m_ident; }
648         inline ASTNode * getValue() { return m_value; }
649
650 protected:
651         smart_ptr<std::string> m_ident;
652         smart_ptr<ASTNode> m_value;
653 };
654
655 /*!
656  * Base class for PathSourceDefASTNode and ExternSourceDefASTNode.
657  */
658 class SourceDefASTNode : public ASTNode
659 {
660 public:
661         SourceDefASTNode(std::string * name) : m_name(name) {}
662         SourceDefASTNode(const SourceDefASTNode & other);
663         
664         inline std::string * getName() { return m_name; }
665
666         inline void setAttributes(ListASTNode * attributes) { m_attributes = attributes; }
667         inline ListASTNode * getAttributes() { return m_attributes; }
668         
669 protected:
670         smart_ptr<std::string> m_name;
671         smart_ptr<ListASTNode> m_attributes;
672 };
673
674 /*!
675  *
676  */
677 class PathSourceDefASTNode : public SourceDefASTNode
678 {
679 public:
680         PathSourceDefASTNode(std::string * name, std::string * path)
681         :       SourceDefASTNode(name), m_path(path)
682         {
683         }
684         
685         PathSourceDefASTNode(const PathSourceDefASTNode & other);
686         
687         virtual PathSourceDefASTNode * clone() const { return new PathSourceDefASTNode(*this); }
688
689         virtual std::string nodeName() const { return "PathSourceDefASTNode"; }
690         
691         virtual void printTree(int indent) const;
692         
693         std::string * getPath() { return m_path; }
694         
695 protected:
696         smart_ptr<std::string> m_path;
697 };
698
699 /*!
700  *
701  */
702 class ExternSourceDefASTNode : public SourceDefASTNode
703 {
704 public:
705         ExternSourceDefASTNode(std::string * name, ExprASTNode * expr)
706         :       SourceDefASTNode(name), m_expr(expr)
707         {
708         }
709         
710         ExternSourceDefASTNode(const ExternSourceDefASTNode & other);
711         
712         virtual ASTNode * clone() const { return new ExternSourceDefASTNode(*this); }
713
714         virtual std::string nodeName() const { return "ExternSourceDefASTNode"; }
715         
716         virtual void printTree(int indent) const;
717         
718         ExprASTNode * getSourceNumberExpr() { return m_expr; }
719
720 protected:
721         smart_ptr<ExprASTNode> m_expr;
722 };
723
724 /*!
725  *
726  */
727 class SectionContentsASTNode : public ASTNode
728 {
729 public:
730         SectionContentsASTNode() : m_sectionExpr() {}
731         SectionContentsASTNode(ExprASTNode * section) : m_sectionExpr(section) {}
732         SectionContentsASTNode(const SectionContentsASTNode & other);
733         
734         virtual ASTNode * clone() const { return new SectionContentsASTNode(*this); }
735
736         virtual std::string nodeName() const { return "SectionContentsASTNode"; }
737         
738         virtual void printTree(int indent) const;
739         
740         inline void setSectionNumberExpr(ExprASTNode * section)
741         {
742                 m_sectionExpr = section;
743         }
744         
745         inline ExprASTNode * getSectionNumberExpr()
746         {
747                 return m_sectionExpr;
748         }
749         
750         inline void setOptions(ListASTNode * options)
751         {
752                 m_options = options;
753         }
754         
755         inline ListASTNode * getOptions()
756         {
757                 return m_options;
758         }
759
760 protected:
761         smart_ptr<ExprASTNode> m_sectionExpr;
762         smart_ptr<ListASTNode> m_options;
763 };
764
765 /*!
766  * @brief Node representing a raw binary section definition.
767  */
768 class DataSectionContentsASTNode : public SectionContentsASTNode
769 {
770 public:
771         DataSectionContentsASTNode(ASTNode * contents)
772         :       SectionContentsASTNode(), m_contents(contents)
773         {
774         }
775         
776         DataSectionContentsASTNode(const DataSectionContentsASTNode & other);
777         
778         virtual ASTNode * clone() const { return new DataSectionContentsASTNode(*this); }
779
780         virtual std::string nodeName() const { return "DataSectionContentsASTNode"; }
781         
782         virtual void printTree(int indent) const;
783         
784         ASTNode * getContents() { return m_contents; }
785         
786 protected:
787         smart_ptr<ASTNode> m_contents;
788 };
789
790 /*!
791  *
792  */
793 class BootableSectionContentsASTNode : public SectionContentsASTNode
794 {
795 public:
796         BootableSectionContentsASTNode(ListASTNode * statements)
797         :       SectionContentsASTNode(), m_statements(statements)
798         {
799         }
800         
801         BootableSectionContentsASTNode(const BootableSectionContentsASTNode & other);
802         
803         virtual ASTNode * clone() const { return new BootableSectionContentsASTNode(*this); }
804
805         virtual std::string nodeName() const { return "BootableSectionContentsASTNode"; }
806         
807         virtual void printTree(int indent) const;
808         
809         ListASTNode * getStatements() { return m_statements; }
810
811 protected:
812         smart_ptr<ListASTNode> m_statements;
813 };
814
815 /*!
816  *
817  */
818 class StatementASTNode : public ASTNode
819 {
820 public:
821         StatementASTNode() : ASTNode() {}
822         StatementASTNode(const StatementASTNode & other) : ASTNode(other) {}
823
824 protected:
825 };
826
827 /*!
828  *
829  */
830 class IfStatementASTNode : public StatementASTNode
831 {
832 public:
833         IfStatementASTNode() : StatementASTNode(), m_ifStatements(), m_nextIf(), m_elseStatements() {}
834         IfStatementASTNode(const IfStatementASTNode & other);
835         
836         virtual ASTNode * clone() const { return new IfStatementASTNode(*this); }
837         
838         void setConditionExpr(ExprASTNode * expr) { m_conditionExpr = expr; }
839         ExprASTNode * getConditionExpr() { return m_conditionExpr; }
840         
841         void setIfStatements(ListASTNode * statements) { m_ifStatements = statements; }
842         ListASTNode * getIfStatements() { return m_ifStatements; }
843         
844         void setNextIf(IfStatementASTNode * nextIf) { m_nextIf = nextIf; }
845         IfStatementASTNode * getNextIf() { return m_nextIf; }
846         
847         void setElseStatements(ListASTNode * statements) { m_elseStatements = statements; }
848         ListASTNode * getElseStatements() { return m_elseStatements; }
849
850 protected:
851         smart_ptr<ExprASTNode> m_conditionExpr; //!< Boolean expression.
852         smart_ptr<ListASTNode> m_ifStatements;  //!< List of "if" section statements.
853         smart_ptr<IfStatementASTNode> m_nextIf; //!< Link to next "else if". If this is non-NULL then #m_elseStatements must be NULL and vice-versa.
854         smart_ptr<ListASTNode> m_elseStatements;        //!< Statements for the "else" part of the statements.
855 };
856
857 /*!
858  * \brief Statement to insert a ROM_MODE_CMD command.
859  */
860 class ModeStatementASTNode : public StatementASTNode
861 {
862 public:
863         ModeStatementASTNode() : StatementASTNode(), m_modeExpr() {}
864         ModeStatementASTNode(ExprASTNode * modeExpr) : StatementASTNode(), m_modeExpr(modeExpr) {}
865         ModeStatementASTNode(const ModeStatementASTNode & other);
866         
867         virtual ASTNode * clone() const { return new ModeStatementASTNode(*this); }
868         
869         virtual std::string nodeName() const { return "ModeStatementASTNode"; }
870         
871         virtual void printTree(int indent) const;
872         
873         inline void setModeExpr(ExprASTNode * modeExpr) { m_modeExpr = modeExpr; }
874         inline ExprASTNode * getModeExpr() { return m_modeExpr; }
875
876 protected:
877         smart_ptr<ExprASTNode> m_modeExpr;      //!< Expression that evaluates to the new boot mode.
878 };
879
880 /*!
881  * \brief Statement to print a message to the elftosb user.
882  */
883 class MessageStatementASTNode : public StatementASTNode
884 {
885 public:
886         enum _message_type
887         {
888                 kInfo,  //!< Prints an informational messag to the user.
889                 kWarning,       //!< Prints a warning to the user.
890                 kError  //!< Throws an error exception.
891         };
892         
893         typedef enum _message_type message_type_t;
894         
895 public:
896         MessageStatementASTNode(message_type_t messageType, std::string * message) : StatementASTNode(), m_type(messageType), m_message(message) {}
897         MessageStatementASTNode(const MessageStatementASTNode & other);
898         
899         virtual ASTNode * clone() const { return new MessageStatementASTNode(*this); }
900         
901         virtual std::string nodeName() const { return "MessageStatementASTNode"; }
902         
903         virtual void printTree(int indent) const;
904         
905         inline message_type_t getType() { return m_type; }
906         inline std::string * getMessage() { return m_message; }
907         
908         const char * getTypeName() const;
909
910 protected:
911         message_type_t m_type;
912         smart_ptr<std::string> m_message;       //!< Message to report.
913 };
914
915 /*!
916  * \brief AST node for a load statement.
917  */
918 class LoadStatementASTNode : public StatementASTNode
919 {
920 public:
921         LoadStatementASTNode()
922         :       StatementASTNode(), m_data(), m_target(), m_isDCDLoad(false)
923         {
924         }
925         
926         LoadStatementASTNode(ASTNode * data, ASTNode * target)
927         :       StatementASTNode(), m_data(data), m_target(), m_isDCDLoad(false)
928         {
929         }
930         
931         LoadStatementASTNode(const LoadStatementASTNode & other);
932         
933         virtual ASTNode * clone() const { return new LoadStatementASTNode(*this); }
934
935         virtual std::string nodeName() const { return "LoadStatementASTNode"; }
936         
937         virtual void printTree(int indent) const;
938         
939         inline void setData(ASTNode * data) { m_data = data; }
940         inline ASTNode * getData() { return m_data; }
941         
942         inline void setTarget(ASTNode * target) { m_target = target; }
943         inline ASTNode * getTarget() { return m_target; }
944         
945         inline void setDCDLoad(bool isDCD) { m_isDCDLoad = isDCD; }
946         inline bool isDCDLoad() const { return m_isDCDLoad; }
947         
948 protected:
949         smart_ptr<ASTNode> m_data;
950         smart_ptr<ASTNode> m_target;
951         bool m_isDCDLoad;
952 };
953
954 /*!
955  * \brief AST node for a call statement.
956  */
957 class CallStatementASTNode : public StatementASTNode
958 {
959 public:
960         //! Possible sub-types of call statements.
961         typedef enum {
962                 kCallType,
963                 kJumpType
964         } call_type_t;
965         
966 public:
967         CallStatementASTNode(call_type_t callType=kCallType)
968         :       StatementASTNode(), m_type(callType), m_target(), m_arg(), m_isHAB(false)
969         {
970         }
971         
972         CallStatementASTNode(call_type_t callType, ASTNode * target, ASTNode * arg)
973         :       StatementASTNode(), m_type(callType), m_target(target), m_arg(arg), m_isHAB(false)
974         {
975         }
976         
977         CallStatementASTNode(const CallStatementASTNode & other);
978         
979         virtual ASTNode * clone() const { return new CallStatementASTNode(*this); }
980
981         virtual std::string nodeName() const { return "CallStatementASTNode"; }
982         
983         virtual void printTree(int indent) const;
984         
985         inline void setCallType(call_type_t callType) { m_type = callType; }
986         inline call_type_t getCallType() { return m_type; }
987         
988         inline void setTarget(ASTNode * target) { m_target = target; }
989         inline ASTNode * getTarget() { return m_target; }
990         
991         inline void setArgument(ASTNode * arg) { m_arg = arg; }
992         inline ASTNode * getArgument() { return m_arg; }
993         
994         inline void setIsHAB(bool isHAB) { m_isHAB = isHAB; }
995         inline bool isHAB() const { return m_isHAB; }
996         
997 protected:
998         call_type_t m_type;
999         smart_ptr<ASTNode> m_target;    //!< This becomes the IVT address in HAB mode.
1000         smart_ptr<ASTNode> m_arg;
1001         bool m_isHAB;
1002 };
1003
1004 /*!
1005  *
1006  */
1007 class SourceASTNode : public ASTNode
1008 {
1009 public:
1010         SourceASTNode(std::string * name) : ASTNode(), m_name(name) {}
1011         SourceASTNode(const SourceASTNode & other);
1012         
1013         virtual ASTNode * clone() const { return new SourceASTNode(*this); }
1014
1015         virtual std::string nodeName() const { return "SourceASTNode"; }
1016         
1017         virtual void printTree(int indent) const;
1018         
1019         inline std::string * getSourceName() { return m_name; }
1020         
1021 protected:
1022         smart_ptr<std::string> m_name;
1023 };
1024
1025 /*!
1026  * \brief List of section matches for a particular source name.
1027  */
1028 class SectionMatchListASTNode : public ASTNode
1029 {
1030 public:
1031         SectionMatchListASTNode(ListASTNode * sections)
1032         :       ASTNode(), m_sections(sections), m_source()
1033         {
1034         }
1035         
1036         SectionMatchListASTNode(ListASTNode * sections, std::string * source)
1037         :       ASTNode(), m_sections(sections), m_source(source)
1038         {
1039         }
1040         
1041         SectionMatchListASTNode(const SectionMatchListASTNode & other);
1042         
1043         virtual ASTNode * clone() const { return new SectionMatchListASTNode(*this); }
1044
1045         virtual std::string nodeName() const { return "SectionMatchListASTNode"; }
1046         
1047         virtual void printTree(int indent) const;
1048         
1049         inline ListASTNode * getSections() { return m_sections; }
1050         inline std::string * getSourceName() { return m_source; }
1051         
1052 protected:
1053         smart_ptr<ListASTNode> m_sections;
1054         smart_ptr<std::string> m_source;
1055 };
1056
1057 /*!
1058  * \brief AST node for a section glob.
1059  *
1060  * Can be assigned an include or exclude action for when this node is part of a
1061  * SectionMatchListASTNode.
1062  */
1063 class SectionASTNode : public ASTNode
1064 {
1065 public:
1066         //! Possible actions for a section match list.
1067         typedef enum
1068         {
1069                 kInclude,       //!< Include sections matched by this node.
1070                 kExclude        //!< Exclude sections matched by this node.
1071         } match_action_t;
1072         
1073 public:
1074         SectionASTNode(std::string * name)
1075         :       ASTNode(), m_action(kInclude), m_name(name), m_source()
1076         {
1077         }
1078         
1079         SectionASTNode(std::string * name, match_action_t action)
1080         :       ASTNode(), m_action(action), m_name(name), m_source()
1081         {
1082         }
1083         
1084         SectionASTNode(std::string * name, std::string * source)
1085         :       ASTNode(), m_action(kInclude), m_name(name), m_source(source)
1086         {
1087         }
1088         
1089         SectionASTNode(const SectionASTNode & other);
1090         
1091         virtual ASTNode * clone() const { return new SectionASTNode(*this); }
1092
1093         virtual std::string nodeName() const { return "SectionASTNode"; }
1094         
1095         virtual void printTree(int indent) const;
1096         
1097         inline match_action_t getAction() { return m_action; }
1098         inline std::string * getSectionName() { return m_name; }
1099         inline std::string * getSourceName() { return m_source; }
1100         
1101 protected:
1102         match_action_t m_action;
1103         smart_ptr<std::string> m_name;
1104         smart_ptr<std::string> m_source;
1105 };
1106
1107 /*!
1108  *
1109  */
1110 class SymbolASTNode : public ASTNode
1111 {
1112 public:
1113         SymbolASTNode()
1114         :       ASTNode(), m_symbol(), m_source()
1115         {
1116         }
1117
1118         SymbolASTNode(std::string * symbol, std::string * source=0)
1119         :       ASTNode(), m_symbol(symbol), m_source(source)
1120         {
1121         }
1122         
1123         SymbolASTNode(const SymbolASTNode & other);
1124         
1125         virtual ASTNode * clone() const { return new SymbolASTNode(*this); }
1126
1127         virtual std::string nodeName() const { return "SymbolASTNode"; }
1128         
1129         virtual void printTree(int indent) const;
1130         
1131         inline void setSymbolName(std::string * symbol) { m_symbol = symbol; }
1132         inline std::string * getSymbolName() { return m_symbol; }
1133         
1134         inline void setSource(std::string * source) { m_source = source; }
1135         inline std::string * getSource() { return m_source; }
1136
1137 protected:
1138         smart_ptr<std::string> m_symbol;        //!< Required.
1139         smart_ptr<std::string> m_source;        //!< Optional, may be NULL;
1140 };
1141
1142 /*!
1143  * If the end of the range is NULL, then only a single address was specified.
1144  */
1145 class AddressRangeASTNode : public ASTNode
1146 {
1147 public:
1148         AddressRangeASTNode()
1149         :       ASTNode(), m_begin(), m_end()
1150         {
1151         }
1152         
1153         AddressRangeASTNode(ASTNode * begin, ASTNode * end)
1154         :       ASTNode(), m_begin(begin), m_end(end)
1155         {
1156         }
1157         
1158         AddressRangeASTNode(const AddressRangeASTNode & other);
1159         
1160         virtual ASTNode * clone() const { return new AddressRangeASTNode(*this); }
1161
1162         virtual std::string nodeName() const { return "AddressRangeASTNode"; }
1163         
1164         virtual void printTree(int indent) const;
1165         
1166         inline void setBegin(ASTNode * begin) { m_begin = begin; }
1167         inline ASTNode * getBegin() { return m_begin; }
1168         
1169         inline void setEnd(ASTNode * end) { m_end = end; }
1170         inline ASTNode * getEnd() { return m_end; }
1171         
1172 protected:
1173         smart_ptr<ASTNode> m_begin;
1174         smart_ptr<ASTNode> m_end;
1175 };
1176
1177 /*!
1178  *
1179  */
1180 class NaturalLocationASTNode : public ASTNode
1181 {
1182 public:
1183         NaturalLocationASTNode()
1184         :       ASTNode()
1185         {
1186         }
1187         
1188         NaturalLocationASTNode(const NaturalLocationASTNode & other)
1189         :       ASTNode(other)
1190         {
1191         }
1192         
1193         virtual ASTNode * clone() const { return new NaturalLocationASTNode(*this); }
1194
1195         virtual std::string nodeName() const { return "NaturalLocationASTNode"; }
1196 };
1197
1198 /*!
1199  *
1200  */
1201 class FromStatementASTNode : public StatementASTNode
1202 {
1203 public:
1204         FromStatementASTNode() : StatementASTNode() {}
1205         FromStatementASTNode(std::string * source, ListASTNode * statements);
1206         FromStatementASTNode(const FromStatementASTNode & other);
1207         
1208         virtual ASTNode * clone() const { return new FromStatementASTNode(*this); }
1209
1210         virtual std::string nodeName() const { return "FromStatementASTNode"; }
1211         
1212         virtual void printTree(int indent) const;
1213         
1214         inline void setSourceName(std::string * source) { m_source = source; }
1215         inline std::string * getSourceName() { return m_source; }
1216         
1217         inline void setStatements(ListASTNode * statements) { m_statements = statements; }
1218         inline ListASTNode * getStatements() { return m_statements; }
1219
1220 protected:
1221         smart_ptr<std::string> m_source;
1222         smart_ptr<ListASTNode> m_statements;
1223 };
1224
1225 }; // namespace elftosb
1226
1227 #endif // _ElftosbAST_h_