]> granicus.if.org Git - clang/commitdiff
Handle __attribute__((annotate("string")))
authorNate Begeman <natebegeman@mac.com>
Thu, 21 Feb 2008 19:30:49 +0000 (19:30 +0000)
committerNate Begeman <natebegeman@mac.com>
Thu, 21 Feb 2008 19:30:49 +0000 (19:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47451 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/AttributeList.cpp
Sema/Sema.h
Sema/SemaDecl.cpp
include/clang/AST/Attr.h
include/clang/Basic/DiagnosticKinds.def
include/clang/Parse/AttributeList.h

index faa50eb32d116680986a06d61bb6ec7688b3a0d5..63d07b399b3bb9a733496d2b6557e75eb6fb3a29 100644 (file)
@@ -57,6 +57,9 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
   case 7:
     if (!memcmp(Str, "aligned", 7)) return AT_aligned;
     break;
+  case 8:
+    if (!memcmp(Str, "annotate", 8)) return AT_annotate;
+    break;
   case 11:   
     if (!memcmp(Str, "vector_size", 11)) return AT_vector_size;
     break;
index 70f76cc2fe3c71d70559655ec3b73cf0b7f2bd91..95bc3b7fccd9ef91cc25610120a8a3cf59f46ccf 100644 (file)
@@ -271,6 +271,7 @@ private:
   
   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);
index e0a42a282d855e3972467990128e35884335bd75..9b33138fbb4c84dad2528a27a7e03edb953783af 100644 (file)
@@ -1777,6 +1777,9 @@ void Sema::HandleDeclAttribute(Decl *New, AttributeList *Attr) {
   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 @@ QualType Sema::HandleVectorTypeAttribute(QualType curType,
          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 @@ void Sema::HandlePackedAttribute(Decl *d, AttributeList *rawAttr) {
     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.
index 96281a97c89d4ff8e1221ca39c11f33ac5a56caf..fea0b404df3383122034b5e12f604523e2492c45 100644 (file)
@@ -15,6 +15,7 @@
 #define LLVM_CLANG_AST_ATTR_H
 
 #include <cassert>
+#include <string>
 
 namespace clang {
 
@@ -23,7 +24,8 @@ class Attr {
 public:
   enum Kind {
     Aligned,
-    Packed
+    Packed,
+    Annotate
   };
     
 private:
@@ -80,6 +82,20 @@ public:
   static bool classof(const AlignedAttr *A) { return true; }
 };
 
+class AnnotateAttr : public Attr {
+  std::string Annotation;
+public:
+  AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {}
+  
+  const std::string& getAnnotation() const { return Annotation; }
+  
+  // Implement isa/cast/dyncast/etc.
+  static bool classof(const Attr *A) {
+    return A->getKind() == Annotate;
+  }
+  static bool classof(const AnnotateAttr *A) { return true; }
+};
+
 }  // end namespace clang
 
 #endif
index 882ca92e517d6f66d49afcba3ab2589654dae72d..902ecc217e0c30ee13b4ed668cc2b1b8e909d44a 100644 (file)
@@ -581,10 +581,12 @@ DIAG(err_attribute_address_space_not_int, ERROR,
      "address space attribute requires an integer constant")
 DIAG(err_attribute_address_multiple_qualifiers, ERROR,
      "multiple address spaces specified for type")
+DIAG(err_attribute_annotate_no_string, ERROR,
+     "argument to annotate attribute was not a string literal")
 DIAG(warn_attribute_ignored, WARNING,
-       "'%0' attribute ignored")
+  "'%0' attribute ignored")
 DIAG(warn_attribute_ignored_for_field_of_type, WARNING,
-       "'%0' attribute ignored for field of type '%1'")
+  "'%0' attribute ignored for field of type '%1'")
 
 // Function Parameter Semantic Analysis.
 DIAG(err_param_with_void_type, ERROR,
index 137d7c6d88ba299b789e2e276feef014fa4d119d..d627f10b868f6ff6870748af55cbbbc5619a8bf9 100644 (file)
@@ -47,7 +47,8 @@ public:
     AT_ocu_vector_type,
     AT_address_space,
     AT_aligned,
-    AT_packed
+    AT_packed,
+    AT_annotate
   };
   
   IdentifierInfo *getName() const { return AttrName; }