]> granicus.if.org Git - clang/commitdiff
Added a new expression, OCUVectorComponent.
authorSteve Naroff <snaroff@apple.com>
Sat, 28 Jul 2007 23:10:27 +0000 (23:10 +0000)
committerSteve Naroff <snaroff@apple.com>
Sat, 28 Jul 2007 23:10:27 +0000 (23:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40577 91177308-0d34-0410-b5e6-96231b3b80d8

AST/Expr.cpp
AST/StmtPrinter.cpp
AST/Type.cpp
Sema/SemaExpr.cpp
include/clang/AST/Expr.h
include/clang/AST/StmtNodes.def
include/clang/AST/Type.h

index 542d4cab4c78d8be319a163a59689f2d3208bed6..11aca820fdc4c47ae0a1e5b0edc2970b6c78320b 100644 (file)
@@ -571,3 +571,13 @@ bool Expr::isNullPointerConstant(ASTContext &Ctx) const {
   llvm::APSInt Val(32);
   return isIntegerConstantExpr(Val, Ctx, 0, true) && Val == 0;
 }
+
+OCUVectorComponent::ComponentType OCUVectorComponent::getComponentType() const {
+  // derive the component type, no need to waste space.
+  const char *compStr = Accessor.getName();
+  const OCUVectorType *VT = getType()->isOCUVectorType();
+  if (VT->isPointAccessor(*compStr)) return Point;
+  if (VT->isColorAccessor(*compStr)) return Color;
+  if (VT->isTextureAccessor(*compStr)) return Texture;
+  assert(0 && "getComponentType(): Illegal accessor");
+}
index 2c4b21eb854d1a04ab045b0e411fac8d1a19ff7f..578f03f8ece2bf516ecf966f17d834c5b4165d57 100644 (file)
@@ -439,6 +439,11 @@ void StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
   assert(Field && "MemberExpr should alway reference a field!");
   OS << Field->getName();
 }
+void StmtPrinter::VisitOCUVectorComponent(OCUVectorComponent *Node) {
+  PrintExpr(Node->getBase());
+  OS << ".";
+  OS << Node->getAccessor().getName();
+}
 void StmtPrinter::VisitCastExpr(CastExpr *Node) {
   OS << "(" << Node->getType().getAsString() << ")";
   PrintExpr(Node->getSubExpr());
index 90cd7d0098642ea290fa490650c1f5892aeac653..214dbea4881b59ace4d47ac40e96be16daeec98b 100644 (file)
@@ -631,6 +631,13 @@ void VectorType::getAsStringInternal(std::string &S) const {
   ElementType.getAsStringInternal(S);
 }
 
+void OCUVectorType::getAsStringInternal(std::string &S) const {
+  S += " __attribute__((ocu_vector_type(";
+  S += llvm::utostr_32(NumElements);
+  S += ")))";
+  ElementType.getAsStringInternal(S);
+}
+
 void FunctionTypeNoProto::getAsStringInternal(std::string &S) const {
   // If needed for precedence reasons, wrap the inner part in grouping parens.
   if (!S.empty())
index 91d6d8de9b19c5d6e6c4d68fddc5bd98ed6ed32d..445b6b566887ab7c8de334dd758566a14b9aa04e 100644 (file)
@@ -423,8 +423,7 @@ ParseMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
     QualType ret = CheckOCUVectorComponent(BaseType, OpLoc, Member, MemberLoc);
     if (ret.isNull())
       return true;
-    // FIXME: instantiate a OCUVectorComponentExpr node...
-    return true;
+    return new OCUVectorComponent(ret, BaseExpr, Member, MemberLoc);
   } else
     return Diag(OpLoc, diag::err_typecheck_member_reference_structUnion,
                 SourceRange(MemberLoc));
index cf5ee87c797a963ade275b53da6777b894d01c0a..fc63a7823f735e8c5a4dc59c0a7c77ee588bc175 100644 (file)
@@ -461,6 +461,38 @@ public:
   static bool classof(const MemberExpr *) { return true; }
 };
 
+/// OCUVectorComponent
+///
+class OCUVectorComponent : public Expr {
+public:
+  enum ComponentType {
+    Point,
+    Color,
+    Texture
+  };
+private:
+  Expr *Base;
+  IdentifierInfo &Accessor;
+  SourceLocation AccessorLoc;
+public:
+  OCUVectorComponent(QualType ty, Expr *base, IdentifierInfo &accessor,
+                     SourceLocation loc) : Expr(OCUVectorComponentClass, ty), 
+                     Base(base), Accessor(accessor), AccessorLoc(loc) {}
+                     
+  Expr *getBase() const { return Base; }
+  IdentifierInfo & getAccessor() const { return Accessor; }
+  ComponentType getComponentType() const;
+
+  virtual SourceRange getSourceRange() const {
+    return SourceRange(getBase()->getLocStart(), AccessorLoc);
+  }
+  virtual void visit(StmtVisitor &Visitor);
+  static bool classof(const Stmt *T) { 
+    return T->getStmtClass() == OCUVectorComponentClass; 
+  }
+  static bool classof(const OCUVectorComponent *) { return true; }
+};
+
 /// CompoundLiteralExpr - [C99 6.5.2.5] 
 ///
 class CompoundLiteralExpr : public Expr {
index b99d225d2adca12ca28ec5fec98a540d0c7be1b1..4335b51469a5bcd5d0ad6d1ca179b126c74c17a3 100644 (file)
@@ -62,15 +62,16 @@ STMT(45, BinaryOperator       , Expr)
 STMT(46, ConditionalOperator  , Expr)
 STMT(47, ImplicitCastExpr     , Expr)
 STMT(48, CompoundLiteralExpr  , Expr)
+STMT(49, OCUVectorComponent   , Expr)
 
 // GNU Extensions.
-STMT(49, AddrLabel            , Expr)
-STMT(50, StmtExpr             , Expr)
+STMT(50, AddrLabel            , Expr)
+STMT(51, StmtExpr             , Expr)
 
 // C++ Expressions.
-STMT(51, CXXCastExpr          , Expr)
-STMT(52, CXXBoolLiteralExpr   , Expr)
-LAST_EXPR(52)
+STMT(52, CXXCastExpr          , Expr)
+STMT(53, CXXBoolLiteralExpr   , Expr)
+LAST_EXPR(53)
 
 #undef STMT
 #undef FIRST_STMT
index 3988b99966a47ba1220ca0c011ee994d3426adbd..6853dbcf13dfc85b5575dd17fcbbf1c1b7589dad 100644 (file)
@@ -526,6 +526,8 @@ public:
                      isTextureAccessor(c);
     }
   }
+  virtual void getAsStringInternal(std::string &InnerString) const;
+
   static bool classof(const Type *T) { 
     return T->getTypeClass() == Vector || T->getTypeClass() == OCUVector; 
   }