Handle __attribute__((annotate("string")))


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47451 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Sema/Sema.h b/Sema/Sema.h
index 70f76cc..95bc3b7 100644
--- a/Sema/Sema.h
+++ b/Sema/Sema.h
@@ -271,6 +271,7 @@
   
   void HandleAlignedAttribute(Decl *d, AttributeList *rawAttr);
   void HandlePackedAttribute(Decl *d, AttributeList *rawAttr);
+  void HandleAnnotateAttribute(Decl *d, AttributeList *rawAttr);
   
   void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
                            bool &IncompleteImpl);
diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp
index e0a42a2..9b33138 100644
--- a/Sema/SemaDecl.cpp
+++ b/Sema/SemaDecl.cpp
@@ -1777,6 +1777,9 @@
   case AttributeList::AT_packed:
     HandlePackedAttribute(New, Attr);
     break;
+  case AttributeList::AT_annotate:
+    HandleAnnotateAttribute(New, Attr);
+    break;
   default:
     // FIXME: add other attributes...
     break;
@@ -1890,9 +1893,8 @@
          sizeExpr->getSourceRange());
     return QualType();
   }
-  // Since OpenCU requires 3 element vectors (OpenCU 5.1.2), we don't restrict
-  // the number of elements to be a power of two (unlike GCC).
-  // Instantiate the vector type, the number of elements is > 0.
+  // Instantiate the vector type, the number of elements is > 0, and not
+  // required to be a power of 2, unlike GCC.
   return Context.getVectorType(curType, vectorSize/typeSize);
 }
 
@@ -1919,7 +1921,27 @@
     Diag(rawAttr->getLoc(), diag::warn_attribute_ignored,
          rawAttr->getName()->getName());
 }
+
+void Sema::HandleAnnotateAttribute(Decl *d, AttributeList *rawAttr) {
+  // check the attribute arguments.
+  if (rawAttr->getNumArgs() != 1) {
+    Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
+         std::string("1"));
+    return;
+  }
+  Expr *argExpr = static_cast<Expr *>(rawAttr->getArg(0));
+  StringLiteral *SE = dyn_cast<StringLiteral>(argExpr);
   
+  // Make sure that there is a string literal as the annotation's single
+  // argument.
+  if (!SE) {
+    Diag(rawAttr->getLoc(), diag::err_attribute_annotate_no_string);
+    return;
+  }
+  d->addAttr(new AnnotateAttr(std::string(SE->getStrData(),
+                                          SE->getByteLength())));
+}
+
 void Sema::HandleAlignedAttribute(Decl *d, AttributeList *rawAttr)
 {
   // check the attribute arguments.