blob: adaaad60cb420347bff30e0fb95611c9957c4919 [file] [log] [blame]
Chris Lattner1b926492006-08-23 06:42:10 +00001//===--- Expr.cpp - Expression AST Node Implementation --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Expr class and subclasses.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/Expr.h"
Chris Lattner5e9a8782006-11-04 06:21:51 +000015#include "clang/AST/StmtVisitor.h"
Chris Lattnere165d942006-08-24 04:40:38 +000016#include "clang/Lex/IdentifierTable.h"
Chris Lattner1b926492006-08-23 06:42:10 +000017#include <iostream>
18using namespace llvm;
19using namespace clang;
20
Chris Lattner0eedafe2006-08-24 04:56:27 +000021//===----------------------------------------------------------------------===//
Chris Lattner5e9a8782006-11-04 06:21:51 +000022// Visitor Implementation.
23//===----------------------------------------------------------------------===//
24
25#define MAKE_VISITOR(CLASS) \
26 void CLASS::visit(StmtVisitor *V) { return V->Visit ## CLASS(this); }
27
Chris Lattner469d3572006-11-04 06:32:52 +000028MAKE_VISITOR(Expr)
Chris Lattner5e9a8782006-11-04 06:21:51 +000029MAKE_VISITOR(DeclRefExpr)
30MAKE_VISITOR(IntegerConstant)
31MAKE_VISITOR(FloatingConstant)
32MAKE_VISITOR(StringExpr)
33MAKE_VISITOR(ParenExpr)
34MAKE_VISITOR(UnaryOperator)
35MAKE_VISITOR(SizeOfAlignOfTypeExpr)
36MAKE_VISITOR(ArraySubscriptExpr)
37MAKE_VISITOR(CallExpr)
38MAKE_VISITOR(MemberExpr)
39MAKE_VISITOR(CastExpr)
40MAKE_VISITOR(BinaryOperator)
41MAKE_VISITOR(ConditionalOperator)
42
43#undef MAKE_VISITOR
44
45//===----------------------------------------------------------------------===//
Chris Lattner0eedafe2006-08-24 04:56:27 +000046// Primary Expressions.
47//===----------------------------------------------------------------------===//
48
Chris Lattnerf42cce72006-10-25 04:09:21 +000049void DeclRefExpr::dump_impl() const {
Chris Lattner879b9ad2006-08-24 04:53:44 +000050 std::cerr << "x";
51}
Chris Lattner1b926492006-08-23 06:42:10 +000052
53void IntegerConstant::dump_impl() const {
54 std::cerr << "1";
55}
56
57void FloatingConstant::dump_impl() const {
58 std::cerr << "1.0";
59}
60
Chris Lattnerd3e98952006-10-06 05:22:26 +000061
62
63StringExpr::StringExpr(const char *strData, unsigned byteLength, bool Wide) {
64 // OPTIMIZE: could allocate this appended to the StringExpr.
65 char *AStrData = new char[byteLength];
66 memcpy(AStrData, strData, byteLength);
67 StrData = AStrData;
68 ByteLength = byteLength;
69 isWide = Wide;
70}
71
72StringExpr::~StringExpr() {
73 delete[] StrData;
74}
75
76void StringExpr::dump_impl() const {
77 if (isWide) std::cerr << 'L';
78 std::cerr << '"' << StrData << '"';
79}
80
81
82
Chris Lattner1b926492006-08-23 06:42:10 +000083void ParenExpr::dump_impl() const {
84 std::cerr << "'('";
85 Val->dump();
86 std::cerr << "')'";
87}
88
89/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
90/// corresponds to, e.g. "sizeof" or "[pre]++".
91const char *UnaryOperator::getOpcodeStr(Opcode Op) {
92 switch (Op) {
Chris Lattnerc52b1182006-10-25 05:45:55 +000093 default: assert(0 && "Unknown unary operator");
Chris Lattner1b926492006-08-23 06:42:10 +000094 case PostInc: return "[post]++";
95 case PostDec: return "[post]--";
96 case PreInc: return "[pre]++";
97 case PreDec: return "[pre]--";
98 case AddrOf: return "&";
99 case Deref: return "*";
100 case Plus: return "+";
101 case Minus: return "-";
102 case Not: return "~";
103 case LNot: return "!";
104 case Real: return "__real";
105 case Imag: return "__imag";
Chris Lattner26115ac2006-08-24 06:10:04 +0000106 case SizeOf: return "sizeof";
107 case AlignOf: return "alignof";
Chris Lattnerc52b1182006-10-25 05:45:55 +0000108 case Extension: return "__extension__";
Chris Lattner1b926492006-08-23 06:42:10 +0000109 }
110}
111
112void UnaryOperator::dump_impl() const {
Chris Lattnere165d942006-08-24 04:40:38 +0000113 std::cerr << getOpcodeStr(Opc);
Chris Lattner1b926492006-08-23 06:42:10 +0000114 Input->dump();
Chris Lattnere165d942006-08-24 04:40:38 +0000115}
116
Chris Lattner26da7302006-08-24 06:49:19 +0000117void SizeOfAlignOfTypeExpr::dump_impl() const {
118 std::cerr << (isSizeof ? "sizeof(" : "alignof(");
119 // FIXME: print type.
120 std::cerr << "ty)";
121}
122
Chris Lattner0eedafe2006-08-24 04:56:27 +0000123//===----------------------------------------------------------------------===//
124// Postfix Operators.
125//===----------------------------------------------------------------------===//
Chris Lattnere165d942006-08-24 04:40:38 +0000126
127void ArraySubscriptExpr::dump_impl() const {
128 Base->dump();
129 std::cerr << "[";
130 Idx->dump();
131 std::cerr << "]";
132}
133
134CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs)
135 : Fn(fn), NumArgs(numargs) {
136 Args = new Expr*[numargs];
137 for (unsigned i = 0; i != numargs; ++i)
138 Args[i] = args[i];
139}
140
141void CallExpr::dump_impl() const {
142 Fn->dump();
143 std::cerr << "(";
144 for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
145 if (i) std::cerr << ", ";
146 getArg(i)->dump();
147 }
Chris Lattner1b926492006-08-23 06:42:10 +0000148 std::cerr << ")";
149}
150
Chris Lattnere165d942006-08-24 04:40:38 +0000151
152void MemberExpr::dump_impl() const {
153 Base->dump();
Chris Lattner6f3a1172006-08-24 05:19:28 +0000154 std::cerr << (isArrow ? "->" : ".");
155
156 if (MemberDecl)
157 /*TODO: Print MemberDecl*/;
158 std::cerr << "member";
Chris Lattnere165d942006-08-24 04:40:38 +0000159}
160
Chris Lattnere550a4e2006-08-24 06:37:51 +0000161
162void CastExpr::dump_impl() const {
163 std::cerr << "'('";
164 // TODO PRINT TYPE
165 std::cerr << "<type>";
166 std::cerr << "')'";
167 Op->dump();
168}
169
Chris Lattner1b926492006-08-23 06:42:10 +0000170/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
171/// corresponds to, e.g. "<<=".
172const char *BinaryOperator::getOpcodeStr(Opcode Op) {
173 switch (Op) {
174 default: assert(0 && "Unknown binary operator");
175 case Mul: return "*";
176 case Div: return "/";
177 case Rem: return "%";
178 case Add: return "+";
179 case Sub: return "-";
180 case Shl: return "<<";
181 case Shr: return ">>";
182 case LT: return "<";
183 case GT: return ">";
184 case LE: return "<=";
185 case GE: return ">=";
186 case EQ: return "==";
187 case NE: return "!=";
188 case And: return "&";
189 case Xor: return "^";
190 case Or: return "|";
191 case LAnd: return "&&";
192 case LOr: return "||";
193 case Assign: return "=";
194 case MulAssign: return "*=";
195 case DivAssign: return "/=";
196 case RemAssign: return "%=";
197 case AddAssign: return "+=";
198 case SubAssign: return "-=";
199 case ShlAssign: return "<<=";
200 case ShrAssign: return ">>=";
201 case AndAssign: return "&=";
202 case XorAssign: return "^=";
203 case OrAssign: return "|=";
204 case Comma: return ",";
205 }
206}
207
208void BinaryOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000209 LHS->dump();
210 std::cerr << " " << getOpcodeStr(Opc) << " ";
211 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000212}
213
214void ConditionalOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000215 Cond->dump();
216 std::cerr << " ? ";
217 LHS->dump();
218 std::cerr << " : ";
219 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000220}