annotate dmd/statement.h @ 1168:ab186e535e72

A different fix to #218 and DMD2682 that does not lead to constant folding regressions. Fixes run/const_15, run/c/const_16_B. The price is removing the lvalueness of struct literals. If it turns out too much code depends on this behavior or we don't want to break with DMD, we could keep struct literals as lvalues and instead convert struct literals used as expression initializers into struct initializers.
author Christian Kamm <kamm incasoftware de>
date Sun, 29 Mar 2009 11:43:45 +0200
parents c6d6a68bb5db
children e961851fb8be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
2 // Compiler implementation of the D programming language
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
3 // Copyright (c) 1999-2008 by Digital Mars
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
4 // All Rights Reserved
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
5 // written by Walter Bright
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
6 // http://www.digitalmars.com
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
7 // License for redistribution is by either the Artistic License
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
9 // See the included readme.txt for details.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
10
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
11 #ifndef DMD_STATEMENT_H
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
12 #define DMD_STATEMENT_H
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
13
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
14 #ifdef __DMC__
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
15 #pragma once
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
16 #endif /* __DMC__ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
17
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
18 #include "root.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
19
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
20 #include "arraytypes.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
21 #include "dsymbol.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
22 #include "lexer.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
23
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
24 struct OutBuffer;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
25 struct Scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
26 struct Expression;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
27 struct LabelDsymbol;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
28 struct Identifier;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
29 struct IfStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
30 struct DeclarationStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
31 struct DefaultStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
32 struct VarDeclaration;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
33 struct Condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
34 struct Module;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
35 struct Token;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
36 struct InlineCostState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
37 struct InlineDoState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
38 struct InlineScanState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
39 struct ReturnStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
40 struct CompoundStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
41 struct Argument;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
42 struct StaticAssert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
43 struct AsmStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
44 struct AsmBlockStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
45 struct GotoStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
46 struct ScopeStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
47 struct TryCatchStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
48 struct TryFinallyStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
49 struct HdrGenState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
50 struct InterState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
51 struct CaseStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
52 struct LabelStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
53 struct VolatileStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
54 struct SynchronizedStatement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
55
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
56 enum TOK;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
57
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
58 namespace llvm
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
59 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
60 class Value;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
61 class BasicBlock;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
62 class ConstantInt;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
63 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
64
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
65 // Back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
66 struct IRState;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
67 struct Blockx;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
68 #if IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
69 struct DValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
70 typedef DValue elem;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
71 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
72
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
73 #if IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
74 union tree_node; typedef union tree_node block;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
75 //union tree_node; typedef union tree_node elem;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
76 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
77 struct block;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
78 //struct elem;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
79 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
80 struct code;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
81
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 945
diff changeset
82 /* How a statement exits; this is returned by blockExit()
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
83 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
84 enum BE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
85 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
86 BEnone = 0,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
87 BEfallthru = 1,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
88 BEthrow = 2,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
89 BEreturn = 4,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
90 BEgoto = 8,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
91 BEhalt = 0x10,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
92 BEbreak = 0x20,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
93 BEcontinue = 0x40,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
94 BEany = (BEfallthru | BEthrow | BEreturn | BEgoto | BEhalt),
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
95 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
96
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
97 struct Statement : Object
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
98 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
99 Loc loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
100
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
101 Statement(Loc loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
102 virtual Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
103
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
104 void print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
105 char *toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
106
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
107 void error(const char *format, ...);
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 945
diff changeset
108 void warning(const char *format, ...);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
109 virtual void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
110 virtual TryCatchStatement *isTryCatchStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
111 virtual GotoStatement *isGotoStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
112 virtual AsmStatement *isAsmStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
113 virtual AsmBlockStatement *isAsmBlockStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
114 #ifdef _DH
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
115 int incontract;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
116 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
117 virtual ScopeStatement *isScopeStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
118 virtual Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
119 Statement *semanticScope(Scope *sc, Statement *sbreak, Statement *scontinue);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
120 virtual int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
121 virtual int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
122 virtual int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
123 virtual int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
124 virtual int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
125 virtual void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
126 virtual Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
127 virtual Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
128
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
129 virtual int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
130 virtual Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
131 virtual Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
132
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
133 // Back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
134 virtual void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
135
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
136 // Avoid dynamic_cast
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
137 virtual DeclarationStatement *isDeclarationStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
138 virtual CompoundStatement *isCompoundStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
139 virtual ReturnStatement *isReturnStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
140 virtual IfStatement *isIfStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
141 virtual CaseStatement* isCaseStatement() { return NULL; }
945
03d7c4aac654 SWITCHED TO LLVM 2.5 !
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 920
diff changeset
142
03d7c4aac654 SWITCHED TO LLVM 2.5 !
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 920
diff changeset
143 // LDC
03d7c4aac654 SWITCHED TO LLVM 2.5 !
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 920
diff changeset
144 virtual void toNakedIR(IRState *irs);
03d7c4aac654 SWITCHED TO LLVM 2.5 !
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 920
diff changeset
145 virtual AsmBlockStatement* endsWithAsm();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
146 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
147
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
148 struct ExpStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
149 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
150 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
151
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
152 ExpStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
153 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
154 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
155 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
156 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
157 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
158
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
159 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
160 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
161 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
162
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
163 void toIR(IRState *irs);
920
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
164
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
165 // LDC
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
166 void toNakedIR(IRState *irs);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
167 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
168
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
169 struct CompileStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
170 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
171 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
172
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
173 CompileStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
174 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
175 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
176 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
177 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
178 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
179
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
180 struct DeclarationStatement : ExpStatement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
181 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
182 // Doing declarations as an expression, rather than a statement,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
183 // makes inlining functions much easier.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
184
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
185 DeclarationStatement(Loc loc, Dsymbol *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
186 DeclarationStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
187 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
188 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
189 void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
190
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
191 DeclarationStatement *isDeclarationStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
192 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
193
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
194 struct CompoundStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
195 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
196 Statements *statements;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
197
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
198 CompoundStatement(Loc loc, Statements *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
199 CompoundStatement(Loc loc, Statement *s1, Statement *s2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
200 virtual Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
201 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
202 virtual Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
203 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
204 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
205 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
206 virtual Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
207 ReturnStatement *isReturnStatement();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
208 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
209
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
210 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
211 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
212 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
213
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
214 virtual void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
215
920
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
216 // LDC
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
217 virtual void toNakedIR(IRState *irs);
945
03d7c4aac654 SWITCHED TO LLVM 2.5 !
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 920
diff changeset
218 virtual AsmBlockStatement* endsWithAsm();
920
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
219
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
220 virtual CompoundStatement *isCompoundStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
221 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
222
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
223 /* The purpose of this is so that continue will go to the next
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
224 * of the statements, and break will go to the end of the statements.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
225 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
226 struct UnrolledLoopStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
227 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
228 Statements *statements;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
229
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
230 UnrolledLoopStatement(Loc loc, Statements *statements);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
231 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
232 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
233 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
234 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
235 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
236 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
237 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
238 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
239 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
240
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
241 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
242 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
243 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
244
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
245 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
246 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
247
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
248 struct ScopeStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
249 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
250 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
251
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
252 ScopeStatement(Loc loc, Statement *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
253 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
254 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
255 ScopeStatement *isScopeStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
256 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
257 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
258 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
259 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
260 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
261 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
262 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
263
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
264 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
265
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
266 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
267 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
268
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
269 struct WhileStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
270 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
271 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
272 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
273
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
274 WhileStatement(Loc loc, Expression *c, Statement *b);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
275 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
276 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
277 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
278 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
279 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
280 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
281 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
282 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
283 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
284
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
285 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
286
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
287 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
288 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
289
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
290 struct DoStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
291 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
292 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
293 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
294
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
295 DoStatement(Loc loc, Statement *b, Expression *c);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
296 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
297 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
298 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
299 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
300 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
301 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
302 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
303 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
304 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
305
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
306 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
307
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
308 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
309 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
310
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
311 struct ForStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
312 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
313 Statement *init;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
314 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
315 Expression *increment;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
316 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
317
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
318 ForStatement(Loc loc, Statement *init, Expression *condition, Expression *increment, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
319 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
320 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
321 void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
322 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
323 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
324 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
325 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
326 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
327 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
328 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
329
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
330 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
331
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
332 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
333 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
334
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
335 struct ForeachStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
336 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
337 enum TOK op; // TOKforeach or TOKforeach_reverse
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
338 Arguments *arguments; // array of Argument*'s
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
339 Expression *aggr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
340 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
341
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
342 VarDeclaration *key;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
343 VarDeclaration *value;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
344
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
345 FuncDeclaration *func; // function we're lexically in
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
346
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
347 Array cases; // put breaks, continues, gotos and returns here
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
348 Array gotos; // forward referenced goto's go here
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
349
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
350 ForeachStatement(Loc loc, enum TOK op, Arguments *arguments, Expression *aggr, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
351 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
352 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
353 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
354 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
355 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
356 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
357 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
358 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
359 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
360
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
361 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
362
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
363 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
364 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
365
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
366 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
367 struct ForeachRangeStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
368 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
369 enum TOK op; // TOKforeach or TOKforeach_reverse
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
370 Argument *arg; // loop index variable
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
371 Expression *lwr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
372 Expression *upr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
373 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
374
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
375 VarDeclaration *key;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
376
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
377 ForeachRangeStatement(Loc loc, enum TOK op, Argument *arg,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
378 Expression *lwr, Expression *upr, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
379 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
380 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
381 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
382 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
383 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
384 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
385 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
386 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
387 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
388
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
389 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
390
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
391 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
392 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
393 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
394
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
395 struct IfStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
396 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
397 Argument *arg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
398 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
399 Statement *ifbody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
400 Statement *elsebody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
401
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
402 VarDeclaration *match; // for MatchExpression results
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
403
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
404 IfStatement(Loc loc, Argument *arg, Expression *condition, Statement *ifbody, Statement *elsebody);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
405 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
406 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
407 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
408 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
409 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
410 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
411 IfStatement *isIfStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
412
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
413 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
414 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
415 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
416
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
417 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
418 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
419
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
420 struct ConditionalStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
421 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
422 Condition *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
423 Statement *ifbody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
424 Statement *elsebody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
425
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
426 ConditionalStatement(Loc loc, Condition *condition, Statement *ifbody, Statement *elsebody);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
427 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
428 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
429 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
430 int usesEH();
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 356
diff changeset
431 int blockExit();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
432
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
433 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
434 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
435
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
436 struct PragmaStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
437 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
438 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
439 Expressions *args; // array of Expression's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
440 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
441
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
442 PragmaStatement(Loc loc, Identifier *ident, Expressions *args, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
443 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
444 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
445 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
446 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
447
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
448 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
449 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
450
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
451 struct StaticAssertStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
452 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
453 StaticAssert *sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
454
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
455 StaticAssertStatement(StaticAssert *sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
456 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
457 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
458
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
459 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
460 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
461
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
462 struct SwitchStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
463 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
464 Expression *condition;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
465 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
466
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
467 DefaultStatement *sdefault;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
468
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
469 Array gotoCases; // array of unresolved GotoCaseStatement's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
470 Array *cases; // array of CaseStatement's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
471 int hasNoDefault; // !=0 if no default statement
1159
c6d6a68bb5db Add back some enclosing scope-exit information to the frontend to produce
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
472
c6d6a68bb5db Add back some enclosing scope-exit information to the frontend to produce
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
473 // LDC
c6d6a68bb5db Add back some enclosing scope-exit information to the frontend to produce
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
474 Statement *enclosingScopeExit;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
475
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
476 SwitchStatement(Loc loc, Expression *c, Statement *b);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
477 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
478 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
479 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
480 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
481 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
482 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
483 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
484
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
485 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
486
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
487 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
488 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
489
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
490 struct CaseStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
491 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
492 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
493 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
494 int index; // which case it is (since we sort this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
495 block *cblock; // back end: label for the block
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
496
1159
c6d6a68bb5db Add back some enclosing scope-exit information to the frontend to produce
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
497 // LDC
c6d6a68bb5db Add back some enclosing scope-exit information to the frontend to produce
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
498 Statement *enclosingScopeExit;
c6d6a68bb5db Add back some enclosing scope-exit information to the frontend to produce
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
499
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
500 CaseStatement(Loc loc, Expression *exp, Statement *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
501 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
502 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
503 int compare(Object *obj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
504 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
505 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
506 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
507 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
508 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
509
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
510 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
511
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
512 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
513
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
514 CaseStatement* isCaseStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
515
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 510
diff changeset
516 // LDC
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
517 llvm::BasicBlock* bodyBB;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
518 llvm::ConstantInt* llvmIdx;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
519 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
520
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
521 struct DefaultStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
522 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
523 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
524 #if IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
525 block *cblock; // back end: label for the block
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
526 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
527
1159
c6d6a68bb5db Add back some enclosing scope-exit information to the frontend to produce
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
528 // LDC
c6d6a68bb5db Add back some enclosing scope-exit information to the frontend to produce
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
529 Statement *enclosingScopeExit;
c6d6a68bb5db Add back some enclosing scope-exit information to the frontend to produce
Christian Kamm <kamm incasoftware de>
parents: 1141
diff changeset
530
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
531 DefaultStatement(Loc loc, Statement *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
532 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
533 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
534 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
535 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
536 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
537 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
538 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
539
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
540 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
541
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
542 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
543
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 510
diff changeset
544 // LDC
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
545 llvm::BasicBlock* bodyBB;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
546 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
547
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
548 struct GotoDefaultStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
549 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
550 SwitchStatement *sw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
551
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
552 GotoDefaultStatement(Loc loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
553 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
554 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
555 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
556 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
557 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
558
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
559 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
560 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
561
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
562 struct GotoCaseStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
563 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
564 Expression *exp; // NULL, or which case to goto
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
565 CaseStatement *cs; // case statement it resolves to
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
566 SwitchStatement *sw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
567
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
568 GotoCaseStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
569 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
570 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
571 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
572 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
573 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
574
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
575 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
576 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
577
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
578 struct SwitchErrorStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
579 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
580 SwitchErrorStatement(Loc loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
581 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
582 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
583
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
584 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
585 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
586
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
587 struct ReturnStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
588 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
589 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
590
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
591 ReturnStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
592 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
593 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
594 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
595 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
596 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
597
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
598 int inlineCost(InlineCostState *ics);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
599 Expression *doInline(InlineDoState *ids);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
600 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
601
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
602 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
603
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
604 ReturnStatement *isReturnStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
605 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
606
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
607 struct BreakStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
608 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
609 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
610
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
611 BreakStatement(Loc loc, Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
612 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
613 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
614 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
615 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
616 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
617
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
618 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
619
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 510
diff changeset
620 // LDC: only set if ident is set: label statement to jump to
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
621 LabelStatement *target;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
622 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
623
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
624 struct ContinueStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
625 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
626 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
627
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
628 ContinueStatement(Loc loc, Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
629 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
630 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
631 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
632 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
633 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
634
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
635 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
636
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 510
diff changeset
637 // LDC: only set if ident is set: label statement to jump to
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
638 LabelStatement *target;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
639 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
640
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
641 struct SynchronizedStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
642 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
643 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
644 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
645
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
646 SynchronizedStatement(Loc loc, Expression *exp, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
647 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
648 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
649 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
650 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
651 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
652 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
653 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
654
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
655 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
656
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
657 // Back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
658 elem *esync;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
659 SynchronizedStatement(Loc loc, elem *esync, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
660 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
661 llvm::Value* llsync;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
662 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
663
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
664 struct WithStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
665 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
666 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
667 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
668 VarDeclaration *wthis;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
669
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
670 WithStatement(Loc loc, Expression *exp, Statement *body);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
671 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
672 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
673 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
674 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
675 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
676
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
677 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
678
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
679 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
680 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
681
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
682 struct TryCatchStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
683 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
684 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
685 Array *catches;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
686
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
687 TryCatchStatement(Loc loc, Statement *body, Array *catches);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
688 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
689 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
690 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
691 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
692 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
693
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
694 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
695
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
696 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
697 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
698 TryCatchStatement *isTryCatchStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
699 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
700
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
701 struct Catch : Object
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
702 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
703 Loc loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
704 Type *type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
705 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
706 VarDeclaration *var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
707 Statement *handler;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
708
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
709 Catch(Loc loc, Type *t, Identifier *id, Statement *handler);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
710 Catch *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
711 void semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
712 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
713 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
714 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
715
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
716 struct TryFinallyStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
717 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
718 Statement *body;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
719 Statement *finalbody;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
720
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
721 TryFinallyStatement(Loc loc, Statement *body, Statement *finalbody);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
722 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
723 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
724 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
725 int hasBreak();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
726 int hasContinue();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
727 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
728 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
729
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
730 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
731
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
732 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
733 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
734
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
735 struct OnScopeStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
736 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
737 TOK tok;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
738 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
739
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
740 OnScopeStatement(Loc loc, TOK tok, Statement *statement);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
741 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
742 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
743 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
744 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
745 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
746 void scopeCode(Statement **sentry, Statement **sexit, Statement **sfinally);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
747
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
748 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
749 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
750
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
751 struct ThrowStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
752 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
753 Expression *exp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
754
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
755 ThrowStatement(Loc loc, Expression *exp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
756 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
757 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
758 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
759 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
760
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
761 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
762
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
763 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
764 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
765
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
766 struct VolatileStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
767 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
768 Statement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
769
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
770 VolatileStatement(Loc loc, Statement *statement);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
771 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
772 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
773 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
774 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
775 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
776
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
777 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
778
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
779 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
780 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
781
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
782 struct GotoStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
783 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
784 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
785 LabelDsymbol *label;
1141
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
786 TryFinallyStatement *enclosingFinally;
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
787 Statement* enclosingScopeExit;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
788
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
789 GotoStatement(Loc loc, Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
790 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
791 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
792 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
793 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
794
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
795 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
796 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
797 GotoStatement *isGotoStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
798 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
799
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
800 struct LabelStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
801 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
802 Identifier *ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
803 Statement *statement;
1141
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
804 TryFinallyStatement *enclosingFinally;
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
805 Statement* enclosingScopeExit;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
806 block *lblock; // back end
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
807 int isReturnLabel;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
808
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
809 LabelStatement(Loc loc, Identifier *ident, Statement *statement);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
810 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
811 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
812 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
813 int usesEH();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
814 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
815 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
816 Expression *interpret(InterState *istate);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
817 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
818
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
819 Statement *inlineScan(InlineScanState *iss);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
820
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
821 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
822
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 510
diff changeset
823 // LDC
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
824 bool asmLabel; // for labels inside inline assembler
920
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
825 void toNakedIR(IRState *irs);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
826 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
827
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
828 struct LabelDsymbol : Dsymbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
829 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
830 LabelStatement *statement;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
831
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
832 LabelDsymbol(Identifier *ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
833 LabelDsymbol *isLabel();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
834 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
835
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
836 struct AsmStatement : Statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
837 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
838 Token *tokens;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
839 code *asmcode;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
840 unsigned asmalign; // alignment of this statement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
841 unsigned refparam; // !=0 if function parameter is referenced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
842 unsigned naked; // !=0 if function is to be naked
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
843
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
844 AsmStatement(Loc loc, Token *tokens);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
845 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
846 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
847 int blockExit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
848 int comeFrom();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
849
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
850 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
851 virtual AsmStatement *isAsmStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
852
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
853 void toIR(IRState *irs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
854
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 510
diff changeset
855 // LDC
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
856 // non-zero if this is a branch, contains the target labels identifier
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
857 Identifier* isBranchToLabel;
920
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
858
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
859 void toNakedIR(IRState *irs);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
860 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
861
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
862 struct AsmBlockStatement : CompoundStatement
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
863 {
1141
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
864 TryFinallyStatement* enclosingFinally;
f99a3b393c03 Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents: 1103
diff changeset
865 Statement* enclosingScopeExit;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
866
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
867 AsmBlockStatement(Loc loc, Statements *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
868 Statements *flatten(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
869 Statement *syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
870 Statement *semantic(Scope *sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
871
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
872 CompoundStatement *isCompoundStatement() { return NULL; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
873 AsmBlockStatement *isAsmBlockStatement() { return this; }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
874
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
875 void toIR(IRState *irs);
920
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
876 void toNakedIR(IRState *irs);
945
03d7c4aac654 SWITCHED TO LLVM 2.5 !
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 920
diff changeset
877 AsmBlockStatement* endsWithAsm();
03d7c4aac654 SWITCHED TO LLVM 2.5 !
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 920
diff changeset
878
03d7c4aac654 SWITCHED TO LLVM 2.5 !
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 920
diff changeset
879 llvm::Value* abiret;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
880 };
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
881
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 309
diff changeset
882 #endif /* DMD_STATEMENT_H */