]> granicus.if.org Git - clang/blob - Parse/AttributeList.cpp
Add support for attribute(deprecated), patch by Nuno Lopes!
[clang] / Parse / AttributeList.cpp
1 //===--- AttributeList.cpp --------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the AttributeList class implementation
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "clang/Parse/AttributeList.h"
15 using namespace clang;
16
17 AttributeList::AttributeList(IdentifierInfo *aName, SourceLocation aLoc,
18                              IdentifierInfo *pName, SourceLocation pLoc,
19                              Action::ExprTy **elist, unsigned numargs, 
20                              AttributeList *n)
21   : AttrName(aName), AttrLoc(aLoc), ParmName(pName), ParmLoc(pLoc),
22     NumArgs(numargs), Next(n) {
23   Args = new Action::ExprTy*[numargs];
24   for (unsigned i = 0; i != numargs; ++i)
25     Args[i] = elist[i];
26 }
27
28 AttributeList::~AttributeList() {
29   if (Args) {
30     // FIXME: before we delete the vector, we need to make sure the Expr's 
31     // have been deleted. Since Action::ExprTy is "void", we are dependent
32     // on the actions module for actually freeing the memory. The specific
33     // hooks are ActOnDeclarator, ActOnTypeName, ActOnParamDeclaratorType, 
34     // ParseField, ParseTag. Once these routines have freed the expression, 
35     // they should zero out the Args slot (to indicate the memory has been 
36     // freed). If any element of the vector is non-null, we should assert.
37     delete [] Args;
38   }
39   delete Next;
40 }
41
42 AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
43   const char *Str = Name->getName();
44   unsigned Len = Name->getLength();
45
46   // Normalize the attribute name, __foo__ becomes foo.
47   if (Len > 4 && Str[0] == '_' && Str[1] == '_' &&
48       Str[Len - 2] == '_' && Str[Len - 1] == '_') {
49     Str += 2;
50     Len -= 4;
51   }
52
53   switch (Len) {
54   case 6: 
55     if (!memcmp(Str, "packed", 6)) return AT_packed;
56     break;
57   case 7:
58     if (!memcmp(Str, "aligned", 7)) return AT_aligned;
59     break;
60   case 8:
61     if (!memcmp(Str, "annotate", 8)) return AT_annotate;
62     if (!memcmp(Str, "noreturn", 8)) return AT_noreturn;
63     break;
64   case 10:
65     if (!memcmp(Str, "deprecated", 10)) return AT_deprecated;
66     break;
67   case 11:
68     if (!memcmp(Str, "vector_size", 11)) return AT_vector_size;
69     break;
70   case 13:
71     if (!memcmp(Str, "address_space", 13)) return AT_address_space;
72     break;
73   case 15:
74     if (!memcmp(Str, "ocu_vector_type", 15)) return AT_ocu_vector_type;
75     break;
76   }      
77   return UnknownAttribute;
78 }