classof implementations for all classes

This commit is contained in:
Anton Mitrokhin
2015-07-10 12:27:16 +03:00
parent 8217448ee5
commit 9f083f99ac
7 changed files with 242 additions and 20 deletions

View File

@@ -196,7 +196,7 @@ YACC=bison -d -v -t
CXX_SRC=ast.cpp builtins.cpp cbackend.cpp ctx.cpp decl.cpp expr.cpp func.cpp \ CXX_SRC=ast.cpp builtins.cpp cbackend.cpp ctx.cpp decl.cpp expr.cpp func.cpp \
ispc.cpp llvmutil.cpp main.cpp module.cpp opt.cpp stmt.cpp sym.cpp \ ispc.cpp llvmutil.cpp main.cpp module.cpp opt.cpp stmt.cpp sym.cpp \
type.cpp util.cpp test_class_of.cpp type.cpp util.cpp
HEADERS=ast.h builtins.h ctx.h decl.h expr.h func.h ispc.h llvmutil.h module.h \ HEADERS=ast.h builtins.h ctx.h decl.h expr.h func.h ispc.h llvmutil.h module.h \
opt.h stmt.h sym.h type.h util.h opt.h stmt.h sym.h type.h util.h
TARGETS=avx2-i64x4 avx11-i64x4 avx1-i64x4 avx1 avx1-x2 avx11 avx11-x2 avx2 avx2-x2 \ TARGETS=avx2-i64x4 avx11-i64x4 avx1-i64x4 avx1 avx1-x2 avx11 avx11-x2 avx2 avx2-x2 \
@@ -261,11 +261,7 @@ doxygen:
ispc: print_llvm_src dirs $(OBJS) ispc: print_llvm_src dirs $(OBJS)
@echo Creating ispc executable @echo Creating ispc executable
@$(CXX) $(OPT) $(LDFLAGS) -o $@ $(filter-out objs/test_class_of.o, $(OBJS)) $(ISPC_LIBS) @$(CXX) $(OPT) $(LDFLAGS) -o $@ $(OBJS) $(ISPC_LIBS)
tcof: print_llvm_src dirs $(OBJS)
@echo Creating test_class_of executable
@$(CXX) $(OPT) $(LDFLAGS) -o tcof $(filter-out objs/main.o, $(OBJS)) $(ISPC_LIBS)
# Use clang as a default compiler, instead of gcc # Use clang as a default compiler, instead of gcc
# This is default now. # This is default now.

2
ast.h
View File

@@ -102,6 +102,8 @@ public:
SyncExprID, SyncExprID,
TypeCastExprID, TypeCastExprID,
UnaryExprID, UnaryExprID,
/* This is a convenience separator to shorten classof implementations */
MaxExprID,
/* For classes inherited from Stmt */ /* For classes inherited from Stmt */
AssertStmtID, AssertStmtID,
BreakStmtID, BreakStmtID,

View File

@@ -1112,7 +1112,6 @@ UnaryExpr::UnaryExpr(Op o, Expr *e, SourcePos p)
expr = e; expr = e;
} }
llvm::Value * llvm::Value *
UnaryExpr::GetValue(FunctionEmitContext *ctx) const { UnaryExpr::GetValue(FunctionEmitContext *ctx) const {
if (expr == NULL) if (expr == NULL)
@@ -4725,6 +4724,11 @@ public:
StructMemberExpr(Expr *e, const char *id, SourcePos p, StructMemberExpr(Expr *e, const char *id, SourcePos p,
SourcePos idpos, bool derefLValue); SourcePos idpos, bool derefLValue);
static inline bool classof(StructMemberExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == StructMemberExprID;
}
const Type *GetType() const; const Type *GetType() const;
const Type *GetLValueType() const; const Type *GetLValueType() const;
int getElementNumber() const; int getElementNumber() const;
@@ -4892,6 +4896,11 @@ public:
VectorMemberExpr(Expr *e, const char *id, SourcePos p, VectorMemberExpr(Expr *e, const char *id, SourcePos p,
SourcePos idpos, bool derefLValue); SourcePos idpos, bool derefLValue);
static inline bool classof(VectorMemberExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == VectorMemberExprID;
}
llvm::Value *GetValue(FunctionEmitContext* ctx) const; llvm::Value *GetValue(FunctionEmitContext* ctx) const;
llvm::Value *GetLValue(FunctionEmitContext* ctx) const; llvm::Value *GetLValue(FunctionEmitContext* ctx) const;
const Type *GetType() const; const Type *GetType() const;

117
expr.h
View File

@@ -49,6 +49,11 @@ class Expr : public ASTNode {
public: public:
Expr(SourcePos p, unsigned scid) : ASTNode(p, scid) { } Expr(SourcePos p, unsigned scid) : ASTNode(p, scid) { }
static inline bool classof(Expr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() < MaxExprID;
}
/** This is the main method for Expr implementations to implement. It /** This is the main method for Expr implementations to implement. It
should call methods in the FunctionEmitContext to emit LLVM IR should call methods in the FunctionEmitContext to emit LLVM IR
instructions to the current basic block in order to generate an instructions to the current basic block in order to generate an
@@ -111,6 +116,11 @@ public:
UnaryExpr(Op op, Expr *expr, SourcePos pos); UnaryExpr(Op op, Expr *expr, SourcePos pos);
static inline bool classof(UnaryExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == UnaryExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
void Print() const; void Print() const;
@@ -152,7 +162,12 @@ public:
}; };
BinaryExpr(Op o, Expr *a, Expr *b, SourcePos p); BinaryExpr(Op o, Expr *a, Expr *b, SourcePos p);
static inline bool classof(BinaryExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == BinaryExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
const Type *GetLValueType() const; const Type *GetLValueType() const;
@@ -186,6 +201,11 @@ public:
AssignExpr(Op o, Expr *a, Expr *b, SourcePos p); AssignExpr(Op o, Expr *a, Expr *b, SourcePos p);
static inline bool classof(AssignExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == AssignExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
void Print() const; void Print() const;
@@ -207,6 +227,11 @@ class SelectExpr : public Expr {
public: public:
SelectExpr(Expr *test, Expr *a, Expr *b, SourcePos p); SelectExpr(Expr *test, Expr *a, Expr *b, SourcePos p);
static inline bool classof(SelectExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == SelectExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
void Print() const; void Print() const;
@@ -218,7 +243,6 @@ public:
Expr *test, *expr1, *expr2; Expr *test, *expr1, *expr2;
}; };
/** @brief A list of expressions. /** @brief A list of expressions.
These are mostly used for representing curly-brace delimited These are mostly used for representing curly-brace delimited
@@ -230,6 +254,11 @@ public:
ExprList(SourcePos p) : Expr(p, ExprListID) { } ExprList(SourcePos p) : Expr(p, ExprListID) { }
ExprList(Expr *e, SourcePos p) : Expr(p, ExprListID) { exprs.push_back(e); } ExprList(Expr *e, SourcePos p) : Expr(p, ExprListID) { exprs.push_back(e); }
static inline bool classof(ExprList const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ExprListID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
void Print() const; void Print() const;
@@ -250,6 +279,11 @@ public:
bool isLaunch = false, bool isLaunch = false,
Expr *launchCountExpr[3] = NULL); Expr *launchCountExpr[3] = NULL);
static inline bool classof(FunctionCallExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == FunctionCallExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
llvm::Value *GetLValue(FunctionEmitContext *ctx) const; llvm::Value *GetLValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
@@ -276,6 +310,11 @@ class IndexExpr : public Expr {
public: public:
IndexExpr(Expr *baseExpr, Expr *index, SourcePos p); IndexExpr(Expr *baseExpr, Expr *index, SourcePos p);
static inline bool classof(IndexExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == IndexExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
llvm::Value *GetLValue(FunctionEmitContext *ctx) const; llvm::Value *GetLValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
@@ -304,6 +343,13 @@ public:
static MemberExpr *create(Expr *expr, const char *identifier, static MemberExpr *create(Expr *expr, const char *identifier,
SourcePos pos, SourcePos identifierPos, SourcePos pos, SourcePos identifierPos,
bool derefLvalue); bool derefLvalue);
static inline bool classof(MemberExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return ((N->getValueID() == StructMemberExprID) ||
(N->getValueID() == VectorMemberExprID));
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
llvm::Value *GetLValue(FunctionEmitContext *ctx) const; llvm::Value *GetLValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
@@ -402,6 +448,11 @@ public:
but at the given position. */ but at the given position. */
ConstExpr(ConstExpr *old, SourcePos pos); ConstExpr(ConstExpr *old, SourcePos pos);
static inline bool classof(ConstExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ConstExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
void Print() const; void Print() const;
@@ -459,6 +510,11 @@ class TypeCastExpr : public Expr {
public: public:
TypeCastExpr(const Type *t, Expr *e, SourcePos p); TypeCastExpr(const Type *t, Expr *e, SourcePos p);
static inline bool classof(TypeCastExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == TypeCastExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
llvm::Value *GetLValue(FunctionEmitContext *ctx) const; llvm::Value *GetLValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
@@ -481,6 +537,11 @@ class ReferenceExpr : public Expr {
public: public:
ReferenceExpr(Expr *e, SourcePos p); ReferenceExpr(Expr *e, SourcePos p);
static inline bool classof(ReferenceExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ReferenceExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
const Type *GetLValueType() const; const Type *GetLValueType() const;
@@ -500,6 +561,13 @@ class DerefExpr : public Expr {
public: public:
DerefExpr(Expr *e, SourcePos p, unsigned scid = DerefExprID); DerefExpr(Expr *e, SourcePos p, unsigned scid = DerefExprID);
static inline bool classof(DerefExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return ((N->getValueID() == DerefExprID) ||
(N->getValueID() == PtrDerefExprID) ||
(N->getValueID() == RefDerefExprID));
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
llvm::Value *GetLValue(FunctionEmitContext *ctx) const; llvm::Value *GetLValue(FunctionEmitContext *ctx) const;
const Type *GetLValueType() const; const Type *GetLValueType() const;
@@ -516,6 +584,11 @@ class PtrDerefExpr : public DerefExpr {
public: public:
PtrDerefExpr(Expr *e, SourcePos p); PtrDerefExpr(Expr *e, SourcePos p);
static inline bool classof(PtrDerefExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == PtrDerefExprID;
}
const Type *GetType() const; const Type *GetType() const;
void Print() const; void Print() const;
Expr *TypeCheck(); Expr *TypeCheck();
@@ -529,6 +602,11 @@ class RefDerefExpr : public DerefExpr {
public: public:
RefDerefExpr(Expr *e, SourcePos p); RefDerefExpr(Expr *e, SourcePos p);
static inline bool classof(RefDerefExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == RefDerefExprID;
}
const Type *GetType() const; const Type *GetType() const;
void Print() const; void Print() const;
Expr *TypeCheck(); Expr *TypeCheck();
@@ -541,6 +619,11 @@ class AddressOfExpr : public Expr {
public: public:
AddressOfExpr(Expr *e, SourcePos p); AddressOfExpr(Expr *e, SourcePos p);
static inline bool classof(AddressOfExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == AddressOfExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
const Type *GetLValueType() const; const Type *GetLValueType() const;
@@ -562,6 +645,11 @@ public:
SizeOfExpr(Expr *e, SourcePos p); SizeOfExpr(Expr *e, SourcePos p);
SizeOfExpr(const Type *t, SourcePos p); SizeOfExpr(const Type *t, SourcePos p);
static inline bool classof(SizeOfExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == SizeOfExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
void Print() const; void Print() const;
@@ -581,6 +669,11 @@ class SymbolExpr : public Expr {
public: public:
SymbolExpr(Symbol *s, SourcePos p); SymbolExpr(Symbol *s, SourcePos p);
static inline bool classof(SymbolExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == SymbolExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
llvm::Value *GetLValue(FunctionEmitContext *ctx) const; llvm::Value *GetLValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
@@ -604,6 +697,11 @@ public:
FunctionSymbolExpr(const char *name, const std::vector<Symbol *> &candFuncs, FunctionSymbolExpr(const char *name, const std::vector<Symbol *> &candFuncs,
SourcePos pos); SourcePos pos);
static inline bool classof(FunctionSymbolExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == FunctionSymbolExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
Symbol *GetBaseSymbol() const; Symbol *GetBaseSymbol() const;
@@ -660,6 +758,11 @@ class SyncExpr : public Expr {
public: public:
SyncExpr(SourcePos p) : Expr(p, SyncExprID) { } SyncExpr(SourcePos p) : Expr(p, SyncExprID) { }
static inline bool classof(SyncExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == SyncExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
Expr *TypeCheck(); Expr *TypeCheck();
@@ -674,6 +777,11 @@ class NullPointerExpr : public Expr {
public: public:
NullPointerExpr(SourcePos p) : Expr(p, NullPointerExprID) { } NullPointerExpr(SourcePos p) : Expr(p, NullPointerExprID) { }
static inline bool classof(NullPointerExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == NullPointerExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
Expr *TypeCheck(); Expr *TypeCheck();
@@ -692,6 +800,11 @@ public:
NewExpr(int typeQual, const Type *type, Expr *initializer, Expr *count, NewExpr(int typeQual, const Type *type, Expr *initializer, Expr *count,
SourcePos tqPos, SourcePos p); SourcePos tqPos, SourcePos p);
static inline bool classof(NewExpr const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == NewExprID;
}
llvm::Value *GetValue(FunctionEmitContext *ctx) const; llvm::Value *GetValue(FunctionEmitContext *ctx) const;
const Type *GetType() const; const Type *GetType() const;
Expr *TypeCheck(); Expr *TypeCheck();

110
stmt.h
View File

@@ -50,6 +50,11 @@ class Stmt : public ASTNode {
public: public:
Stmt(SourcePos p, unsigned scid) : ASTNode(p, scid) { } Stmt(SourcePos p, unsigned scid) : ASTNode(p, scid) { }
static inline bool classof(Stmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() > MaxExprID;
}
/** Emit LLVM IR for the statement, using the FunctionEmitContext to create the /** Emit LLVM IR for the statement, using the FunctionEmitContext to create the
necessary instructions. necessary instructions.
*/ */
@@ -73,6 +78,11 @@ class ExprStmt : public Stmt {
public: public:
ExprStmt(Expr *expr, SourcePos pos); ExprStmt(Expr *expr, SourcePos pos);
static inline bool classof(ExprStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ExprStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -97,6 +107,11 @@ class DeclStmt : public Stmt {
public: public:
DeclStmt(const std::vector<VariableDeclaration> &v, SourcePos pos); DeclStmt(const std::vector<VariableDeclaration> &v, SourcePos pos);
static inline bool classof(DeclStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == DeclStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -115,6 +130,11 @@ public:
IfStmt(Expr *testExpr, Stmt *trueStmts, Stmt *falseStmts, IfStmt(Expr *testExpr, Stmt *trueStmts, Stmt *falseStmts,
bool doAllCheck, SourcePos pos); bool doAllCheck, SourcePos pos);
static inline bool classof(IfStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == IfStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -155,6 +175,11 @@ public:
DoStmt(Expr *testExpr, Stmt *bodyStmts, bool doCoherentCheck, DoStmt(Expr *testExpr, Stmt *bodyStmts, bool doCoherentCheck,
SourcePos pos); SourcePos pos);
static inline bool classof(DoStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == DoStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -175,6 +200,11 @@ public:
ForStmt(Stmt *initializer, Expr *testExpr, Stmt *stepStatements, ForStmt(Stmt *initializer, Expr *testExpr, Stmt *stepStatements,
Stmt *bodyStatements, bool doCoherentCheck, SourcePos pos); Stmt *bodyStatements, bool doCoherentCheck, SourcePos pos);
static inline bool classof(ForStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ForStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -201,6 +231,11 @@ class BreakStmt : public Stmt {
public: public:
BreakStmt(SourcePos pos); BreakStmt(SourcePos pos);
static inline bool classof(BreakStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == BreakStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -215,6 +250,11 @@ class ContinueStmt : public Stmt {
public: public:
ContinueStmt(SourcePos pos); ContinueStmt(SourcePos pos);
static inline bool classof(ContinueStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ContinueStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -232,6 +272,11 @@ public:
const std::vector<Expr *> &endExprs, const std::vector<Expr *> &endExprs,
Stmt *bodyStatements, bool tiled, SourcePos pos); Stmt *bodyStatements, bool tiled, SourcePos pos);
static inline bool classof(ForeachStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ForeachStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -252,6 +297,11 @@ class ForeachActiveStmt : public Stmt {
public: public:
ForeachActiveStmt(Symbol *iterSym, Stmt *stmts, SourcePos pos); ForeachActiveStmt(Symbol *iterSym, Stmt *stmts, SourcePos pos);
static inline bool classof(ForeachActiveStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ForeachActiveStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -271,6 +321,11 @@ public:
ForeachUniqueStmt(const char *iterName, Expr *expr, Stmt *stmts, ForeachUniqueStmt(const char *iterName, Expr *expr, Stmt *stmts,
SourcePos pos); SourcePos pos);
static inline bool classof(ForeachUniqueStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ForeachUniqueStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -289,6 +344,11 @@ class UnmaskedStmt : public Stmt {
public: public:
UnmaskedStmt(Stmt *stmt, SourcePos pos); UnmaskedStmt(Stmt *stmt, SourcePos pos);
static inline bool classof(UnmaskedStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == UnmaskedStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -306,6 +366,11 @@ class ReturnStmt : public Stmt {
public: public:
ReturnStmt(Expr *e, SourcePos p); ReturnStmt(Expr *e, SourcePos p);
static inline bool classof(ReturnStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == ReturnStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -323,6 +388,11 @@ class CaseStmt : public Stmt {
public: public:
CaseStmt(int value, Stmt *stmt, SourcePos pos); CaseStmt(int value, Stmt *stmt, SourcePos pos);
static inline bool classof(CaseStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == CaseStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -341,6 +411,11 @@ class DefaultStmt : public Stmt {
public: public:
DefaultStmt(Stmt *stmt, SourcePos pos); DefaultStmt(Stmt *stmt, SourcePos pos);
static inline bool classof(DefaultStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == DefaultStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -356,6 +431,11 @@ class SwitchStmt : public Stmt {
public: public:
SwitchStmt(Expr *expr, Stmt *stmts, SourcePos pos); SwitchStmt(Expr *expr, Stmt *stmts, SourcePos pos);
static inline bool classof(SwitchStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == SwitchStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -374,6 +454,11 @@ class GotoStmt : public Stmt {
public: public:
GotoStmt(const char *label, SourcePos gotoPos, SourcePos idPos); GotoStmt(const char *label, SourcePos gotoPos, SourcePos idPos);
static inline bool classof(GotoStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == GotoStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -393,6 +478,11 @@ class LabeledStmt : public Stmt {
public: public:
LabeledStmt(const char *label, Stmt *stmt, SourcePos p); LabeledStmt(const char *label, Stmt *stmt, SourcePos p);
static inline bool classof(LabeledStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == LabeledStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -413,6 +503,11 @@ class StmtList : public Stmt {
public: public:
StmtList(SourcePos p) : Stmt(p, StmtListID) { } StmtList(SourcePos p) : Stmt(p, StmtListID) { }
static inline bool classof(StmtList const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == StmtListID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -438,6 +533,11 @@ class PrintStmt : public Stmt {
public: public:
PrintStmt(const std::string &f, Expr *v, SourcePos p); PrintStmt(const std::string &f, Expr *v, SourcePos p);
static inline bool classof(PrintStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == PrintStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -464,6 +564,11 @@ class AssertStmt : public Stmt {
public: public:
AssertStmt(const std::string &msg, Expr *e, SourcePos p); AssertStmt(const std::string &msg, Expr *e, SourcePos p);
static inline bool classof(AssertStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == AssertStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;
@@ -483,6 +588,11 @@ class DeleteStmt : public Stmt {
public: public:
DeleteStmt(Expr *e, SourcePos p); DeleteStmt(Expr *e, SourcePos p);
static inline bool classof(DeleteStmt const*) { return true; }
static inline bool classof(ASTNode const* N) {
return N->getValueID() == DeleteStmtID;
}
void EmitCode(FunctionEmitContext *ctx) const; void EmitCode(FunctionEmitContext *ctx) const;
void Print(int indent) const; void Print(int indent) const;

View File

@@ -1,8 +0,0 @@
#include "ispc.h"
int main() {
return 0;
};

View File

@@ -1603,7 +1603,7 @@ ArrayType::SizeUnsizedArrays(const Type *type, Expr *initExpr) {
if (at == NULL) if (at == NULL)
return type; return type;
ExprList *exprList = llvm::dyn_cast<ExprList>(initExpr); ExprList *exprList = llvm::dyn_cast_or_null<ExprList>(initExpr);
if (exprList == NULL || exprList->exprs.size() == 0) if (exprList == NULL || exprList->exprs.size() == 0)
return type; return type;
@@ -1618,7 +1618,7 @@ ArrayType::SizeUnsizedArrays(const Type *type, Expr *initExpr) {
// now. Otherwise we'll use the first one to size the next dimension // now. Otherwise we'll use the first one to size the next dimension
// (after checking below that it has the same length as all of the // (after checking below that it has the same length as all of the
// other ones. // other ones.
ExprList *nextList = llvm::dyn_cast<ExprList>(exprList->exprs[0]); ExprList *nextList = llvm::dyn_cast_or_null<ExprList>(exprList->exprs[0]);
if (nextList == NULL) if (nextList == NULL)
return type; return type;
@@ -1638,7 +1638,7 @@ ArrayType::SizeUnsizedArrays(const Type *type, Expr *initExpr) {
continue; continue;
} }
ExprList *el = llvm::dyn_cast<ExprList>(exprList->exprs[i]); ExprList *el = llvm::dyn_cast_or_null<ExprList>(exprList->exprs[i]);
if (el == NULL || el->exprs.size() != nextSize) { if (el == NULL || el->exprs.size() != nextSize) {
Error(Union(exprList->exprs[0]->pos, exprList->exprs[i]->pos), Error(Union(exprList->exprs[0]->pos, exprList->exprs[i]->pos),
"Inconsistent initializer expression list lengths " "Inconsistent initializer expression list lengths "