blob: 6c1583a0feb97ab81115a8784935b2f598eadd51 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- AttributeList.cpp --------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the AttributeList class implementation
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Parse/AttributeList.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000015using namespace clang;
16
17AttributeList::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}
Chris Lattner23351912008-02-20 23:14:47 +000027
28AttributeList::~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
42AttributeList::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 }
Ted Kremenek96329d42008-07-15 22:26:48 +000052
Daniel Dunbar3068ae02008-07-31 22:40:48 +000053 // FIXME: Hand generating this is neither smart nor efficient.
Chris Lattner23351912008-02-20 23:14:47 +000054 switch (Len) {
Chris Lattnerddee4232008-03-03 03:28:21 +000055 case 4:
56 if (!memcmp(Str, "weak", 4)) return AT_weak;
57 if (!memcmp(Str, "pure", 4)) return AT_pure;
Eli Friedman3c0eb162008-05-27 03:33:27 +000058 if (!memcmp(Str, "mode", 4)) return AT_mode;
Chris Lattnerddee4232008-03-03 03:28:21 +000059 break;
Nuno Lopesd4cbda62008-06-08 15:45:52 +000060 case 5:
61 if (!memcmp(Str, "alias", 5)) return AT_alias;
62 break;
Chris Lattnerddee4232008-03-03 03:28:21 +000063 case 6:
Chris Lattner23351912008-02-20 23:14:47 +000064 if (!memcmp(Str, "packed", 6)) return AT_packed;
Chris Lattnerddee4232008-03-03 03:28:21 +000065 if (!memcmp(Str, "malloc", 6)) return AT_malloc;
66 if (!memcmp(Str, "format", 6)) return AT_format;
67 if (!memcmp(Str, "unused", 6)) return AT_unused;
Steve Naroff9eae5762008-09-18 16:44:58 +000068 if (!memcmp(Str, "blocks", 6)) return AT_blocks;
Chris Lattner23351912008-02-20 23:14:47 +000069 break;
70 case 7:
71 if (!memcmp(Str, "aligned", 7)) return AT_aligned;
Chris Lattnerddee4232008-03-03 03:28:21 +000072 if (!memcmp(Str, "nothrow", 7)) return AT_nothrow;
73 if (!memcmp(Str, "nonnull", 7)) return AT_nonnull;
Anders Carlssonaa0d25b2008-08-23 23:22:21 +000074 if (!memcmp(Str, "objc_gc", 7)) return AT_objc_gc;
Nate Begeman440b4562008-03-07 20:04:22 +000075 if (!memcmp(Str, "stdcall", 7)) return AT_stdcall;
Chris Lattner23351912008-02-20 23:14:47 +000076 break;
Nate Begemanc398f0b2008-02-21 19:30:49 +000077 case 8:
78 if (!memcmp(Str, "annotate", 8)) return AT_annotate;
Ted Kremenekaecb3832008-02-27 20:43:06 +000079 if (!memcmp(Str, "noreturn", 8)) return AT_noreturn;
Chris Lattnerddee4232008-03-03 03:28:21 +000080 if (!memcmp(Str, "noinline", 8)) return AT_noinline;
Nate Begeman440b4562008-03-07 20:04:22 +000081 if (!memcmp(Str, "fastcall", 8)) return AT_fastcall;
Ted Kremenekf135e802008-07-15 22:38:34 +000082 if (!memcmp(Str, "iboutlet", 8)) return AT_IBOutlet;
Anders Carlsson77091822008-10-05 18:05:59 +000083 if (!memcmp(Str, "sentinel", 8)) return AT_sentinel;
Fariborz Jahanianfa23c1d2009-01-13 23:34:40 +000084 if (!memcmp(Str, "NSObject", 8)) return AT_nsobject;
Chris Lattnerddee4232008-03-03 03:28:21 +000085 break;
86 case 9:
87 if (!memcmp(Str, "dllimport", 9)) return AT_dllimport;
88 if (!memcmp(Str, "dllexport", 9)) return AT_dllexport;
Nate Begemanc398f0b2008-02-21 19:30:49 +000089 break;
Chris Lattner7e669b22008-02-29 16:48:43 +000090 case 10:
91 if (!memcmp(Str, "deprecated", 10)) return AT_deprecated;
Chris Lattnerddee4232008-03-03 03:28:21 +000092 if (!memcmp(Str, "visibility", 10)) return AT_visibility;
Daniel Dunbar3068ae02008-07-31 22:40:48 +000093 if (!memcmp(Str, "destructor", 10)) return AT_destructor;
Chris Lattner7e669b22008-02-29 16:48:43 +000094 break;
95 case 11:
Chris Lattner23351912008-02-20 23:14:47 +000096 if (!memcmp(Str, "vector_size", 11)) return AT_vector_size;
Daniel Dunbar3068ae02008-07-31 22:40:48 +000097 if (!memcmp(Str, "constructor", 11)) return AT_constructor;
Fariborz Jahanianbc1c8772008-12-17 01:07:27 +000098 if (!memcmp(Str, "unavailable", 11)) return AT_unavailable;
Chris Lattner23351912008-02-20 23:14:47 +000099 break;
100 case 13:
101 if (!memcmp(Str, "address_space", 13)) return AT_address_space;
Daniel Dunbaraf668b02008-10-28 00:17:57 +0000102 if (!memcmp(Str, "always_inline", 13)) return AT_always_inline;
Chris Lattner23351912008-02-20 23:14:47 +0000103 break;
104 case 15:
Nate Begeman213541a2008-04-18 23:10:10 +0000105 if (!memcmp(Str, "ext_vector_type", 15)) return AT_ext_vector_type;
Chris Lattner23351912008-02-20 23:14:47 +0000106 break;
Nuno Lopes27ae6c62008-04-25 09:32:00 +0000107 case 17:
108 if (!memcmp(Str, "transparent_union", 17)) return AT_transparent_union;
109 break;
Chris Lattnerddee4232008-03-03 03:28:21 +0000110 case 18:
111 if (!memcmp(Str, "warn_unused_result", 18)) return AT_warn_unused_result;
112 break;
113 }
Chris Lattner23351912008-02-20 23:14:47 +0000114 return UnknownAttribute;
115}