1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot|*                                                                            *|
3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot|* Attribute classes' definitions                                             *|
4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot|*                                                                            *|
5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot|* Automatically generated file, do not edit!                                 *|
6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot|*                                                                            *|
7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot\*===----------------------------------------------------------------------===*/
8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_CLANG_ATTR_CLASSES_INC
10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_CLANG_ATTR_CLASSES_INC
11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AMDGPUFlatWorkGroupSizeAttr : public InheritableAttr {
13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned min;
14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned max;
16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AMDGPUFlatWorkGroupSizeAttr *CreateImplicit(ASTContext &Ctx, unsigned Min, unsigned Max, SourceRange Loc = SourceRange()) {
19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AMDGPUFlatWorkGroupSizeAttr(Loc, Ctx, Min, Max, 0);
20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AMDGPUFlatWorkGroupSizeAttr(SourceRange R, ASTContext &Ctx
25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Min
26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Max
27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AMDGPUFlatWorkGroupSize, R, SI, false, false)
30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , min(Min)
31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , max(Max)
32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AMDGPUFlatWorkGroupSizeAttr *clone(ASTContext &C) const;
36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMin() const {
40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return min;
41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMax() const {
44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return max;
45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AMDGPUFlatWorkGroupSize; }
50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AMDGPUNumSGPRAttr : public InheritableAttr {
53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned numSGPR;
54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AMDGPUNumSGPRAttr *CreateImplicit(ASTContext &Ctx, unsigned NumSGPR, SourceRange Loc = SourceRange()) {
57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AMDGPUNumSGPRAttr(Loc, Ctx, NumSGPR, 0);
58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AMDGPUNumSGPRAttr(SourceRange R, ASTContext &Ctx
63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned NumSGPR
64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AMDGPUNumSGPR, R, SI, false, false)
67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , numSGPR(NumSGPR)
68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AMDGPUNumSGPRAttr *clone(ASTContext &C) const;
72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getNumSGPR() const {
76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return numSGPR;
77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AMDGPUNumSGPR; }
82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AMDGPUNumVGPRAttr : public InheritableAttr {
85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned numVGPR;
86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AMDGPUNumVGPRAttr *CreateImplicit(ASTContext &Ctx, unsigned NumVGPR, SourceRange Loc = SourceRange()) {
89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AMDGPUNumVGPRAttr(Loc, Ctx, NumVGPR, 0);
90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AMDGPUNumVGPRAttr(SourceRange R, ASTContext &Ctx
95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned NumVGPR
96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AMDGPUNumVGPR, R, SI, false, false)
99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , numVGPR(NumVGPR)
100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AMDGPUNumVGPRAttr *clone(ASTContext &C) const;
104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getNumVGPR() const {
108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return numVGPR;
109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AMDGPUNumVGPR; }
114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AMDGPUWavesPerEUAttr : public InheritableAttr {
117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned min;
118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned max;
120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AMDGPUWavesPerEUAttr *CreateImplicit(ASTContext &Ctx, unsigned Min, unsigned Max, SourceRange Loc = SourceRange()) {
123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AMDGPUWavesPerEUAttr(Loc, Ctx, Min, Max, 0);
124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AMDGPUWavesPerEUAttr(SourceRange R, ASTContext &Ctx
129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Min
130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Max
131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AMDGPUWavesPerEU, R, SI, false, false)
134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , min(Min)
135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , max(Max)
136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AMDGPUWavesPerEUAttr(SourceRange R, ASTContext &Ctx
140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Min
141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AMDGPUWavesPerEU, R, SI, false, false)
144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , min(Min)
145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , max()
146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AMDGPUWavesPerEUAttr *clone(ASTContext &C) const;
150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMin() const {
154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return min;
155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMax() const {
158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return max;
159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AMDGPUWavesPerEU; }
164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ARMInterruptAttr : public InheritableAttr {
167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum InterruptType {
169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IRQ,
170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    FIQ,
171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SWI,
172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ABORT,
173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    UNDEF,
174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Generic
175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InterruptType interrupt;
178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ARMInterruptAttr *CreateImplicit(ASTContext &Ctx, InterruptType Interrupt, SourceRange Loc = SourceRange()) {
181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ARMInterruptAttr(Loc, Ctx, Interrupt, 0);
182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ARMInterruptAttr(SourceRange R, ASTContext &Ctx
187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , InterruptType Interrupt
188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ARMInterrupt, R, SI, false, false)
191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , interrupt(Interrupt)
192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ARMInterruptAttr(SourceRange R, ASTContext &Ctx
196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ARMInterrupt, R, SI, false, false)
199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , interrupt(InterruptType(0))
200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ARMInterruptAttr *clone(ASTContext &C) const;
204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InterruptType getInterrupt() const {
208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return interrupt;
209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToInterruptType(StringRef Val, InterruptType &Out) {
212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<InterruptType> R = llvm::StringSwitch<Optional<InterruptType>>(Val)
213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("IRQ", ARMInterruptAttr::IRQ)
214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("FIQ", ARMInterruptAttr::FIQ)
215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("SWI", ARMInterruptAttr::SWI)
216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("ABORT", ARMInterruptAttr::ABORT)
217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("UNDEF", ARMInterruptAttr::UNDEF)
218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("", ARMInterruptAttr::Generic)
219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<InterruptType>());
220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertInterruptTypeToStr(InterruptType Val) {
228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ARMInterruptAttr::IRQ: return "IRQ";
230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ARMInterruptAttr::FIQ: return "FIQ";
231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ARMInterruptAttr::SWI: return "SWI";
232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ARMInterruptAttr::ABORT: return "ABORT";
233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ARMInterruptAttr::UNDEF: return "UNDEF";
234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ARMInterruptAttr::Generic: return "";
235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ARMInterrupt; }
241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AVRInterruptAttr : public InheritableAttr {
244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AVRInterruptAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AVRInterruptAttr(Loc, Ctx, 0);
247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AVRInterruptAttr(SourceRange R, ASTContext &Ctx
252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AVRInterrupt, R, SI, false, false)
255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AVRInterruptAttr *clone(ASTContext &C) const;
259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AVRInterrupt; }
265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AVRSignalAttr : public InheritableAttr {
268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AVRSignalAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AVRSignalAttr(Loc, Ctx, 0);
271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AVRSignalAttr(SourceRange R, ASTContext &Ctx
276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AVRSignal, R, SI, false, false)
279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AVRSignalAttr *clone(ASTContext &C) const;
283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AVRSignal; }
289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AbiTagAttr : public Attr {
292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned tags_Size;
293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  StringRef *tags_;
294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AbiTagAttr *CreateImplicit(ASTContext &Ctx, StringRef *Tags, unsigned TagsSize, SourceRange Loc = SourceRange()) {
297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AbiTagAttr(Loc, Ctx, Tags, TagsSize, 0);
298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AbiTagAttr(SourceRange R, ASTContext &Ctx
303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , StringRef *Tags, unsigned TagsSize
304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::AbiTag, R, SI, false, false)
307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , tags_Size(TagsSize), tags_(new (Ctx, 16) StringRef[tags_Size])
308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    for (size_t I = 0, E = tags_Size; I != E;
310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot         ++I) {
311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      StringRef Ref = Tags[I];
312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Ref.empty()) {
313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        char *Mem = new (Ctx, 1) char[Ref.size()];
314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(Mem, Ref.data(), Ref.size());
315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        tags_[I] = StringRef(Mem, Ref.size());
316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AbiTagAttr(SourceRange R, ASTContext &Ctx
321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::AbiTag, R, SI, false, false)
324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , tags_Size(0), tags_(nullptr)
325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AbiTagAttr *clone(ASTContext &C) const;
329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef StringRef* tags_iterator;
333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  tags_iterator tags_begin() const { return tags_; }
334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  tags_iterator tags_end() const { return tags_ + tags_Size; }
335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned tags_size() const { return tags_Size; }
336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<tags_iterator> tags() const { return llvm::make_range(tags_begin(), tags_end()); }
337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AbiTag; }
342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AcquireCapabilityAttr : public InheritableAttr {
345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_acquire_capability = 0,
351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_acquire_capability = 1,
352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_acquire_shared_capability = 2,
353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_acquire_shared_capability = 3,
354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_exclusive_lock_function = 4,
355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_shared_lock_function = 5
356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AcquireCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AcquireCapabilityAttr(Loc, Ctx, Args, ArgsSize, S);
360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AcquireCapabilityAttr(SourceRange R, ASTContext &Ctx
365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AcquireCapability, R, SI, true, true)
369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AcquireCapabilityAttr(SourceRange R, ASTContext &Ctx
375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AcquireCapability, R, SI, true, true)
378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AcquireCapabilityAttr *clone(ASTContext &C) const;
383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_acquire_capability;
390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_clang_acquire_capability;
391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_acquire_shared_capability;
392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return CXX11_clang_acquire_shared_capability;
393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 4: return GNU_exclusive_lock_function;
394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 5: return GNU_shared_lock_function;
395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isShared() const { return SpellingListIndex == 2 ||
398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 3 ||
399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 5; }
400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AcquireCapability; }
410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AcquiredAfterAttr : public InheritableAttr {
413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AcquiredAfterAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AcquiredAfterAttr(Loc, Ctx, Args, ArgsSize, 0);
419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AcquiredAfterAttr(SourceRange R, ASTContext &Ctx
424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AcquiredAfter, R, SI, true, true)
428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AcquiredAfterAttr(SourceRange R, ASTContext &Ctx
434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AcquiredAfter, R, SI, true, true)
437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AcquiredAfterAttr *clone(ASTContext &C) const;
442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AcquiredAfter; }
455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AcquiredBeforeAttr : public InheritableAttr {
458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AcquiredBeforeAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AcquiredBeforeAttr(Loc, Ctx, Args, ArgsSize, 0);
464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AcquiredBeforeAttr(SourceRange R, ASTContext &Ctx
469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AcquiredBefore, R, SI, true, true)
473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AcquiredBeforeAttr(SourceRange R, ASTContext &Ctx
479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AcquiredBefore, R, SI, true, true)
482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AcquiredBeforeAttr *clone(ASTContext &C) const;
487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AcquiredBefore; }
500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AliasAttr : public Attr {
503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned aliaseeLength;
504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *aliasee;
505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AliasAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Aliasee, SourceRange Loc = SourceRange()) {
508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AliasAttr(Loc, Ctx, Aliasee, 0);
509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AliasAttr(SourceRange R, ASTContext &Ctx
514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Aliasee
515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::Alias, R, SI, false, false)
518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , aliaseeLength(Aliasee.size()),aliasee(new (Ctx, 1) char[aliaseeLength])
519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Aliasee.empty())
521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(aliasee, Aliasee.data(), aliaseeLength);
522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AliasAttr *clone(ASTContext &C) const;
525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getAliasee() const {
529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(aliasee, aliaseeLength);
530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getAliaseeLength() const {
532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return aliaseeLength;
533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setAliasee(ASTContext &C, llvm::StringRef S) {
535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    aliaseeLength = S.size();
536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->aliasee = new (C, 1) char [aliaseeLength];
537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->aliasee, S.data(), aliaseeLength);
539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Alias; }
544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AlignMac68kAttr : public InheritableAttr {
547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AlignMac68kAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AlignMac68kAttr(Loc, Ctx, 0);
550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AlignMac68kAttr(SourceRange R, ASTContext &Ctx
555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AlignMac68k, R, SI, false, false)
558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AlignMac68kAttr *clone(ASTContext &C) const;
562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AlignMac68k; }
568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AlignValueAttr : public Attr {
571f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * alignment;
572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AlignValueAttr *CreateImplicit(ASTContext &Ctx, Expr * Alignment, SourceRange Loc = SourceRange()) {
575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AlignValueAttr(Loc, Ctx, Alignment, 0);
576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AlignValueAttr(SourceRange R, ASTContext &Ctx
581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Alignment
582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::AlignValue, R, SI, false, false)
585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , alignment(Alignment)
586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AlignValueAttr *clone(ASTContext &C) const;
590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getAlignment() const {
594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return alignment;
595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AlignValue; }
600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AlignedAttr : public InheritableAttr {
603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool isalignmentExpr;
604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunion {
605f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr *alignmentExpr;
606f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotTypeSourceInfo *alignmentType;
607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_aligned = 0,
612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_aligned = 1,
613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Declspec_align = 2,
614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_alignas = 3,
615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_Alignas = 4
616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AlignedAttr *CreateImplicit(ASTContext &Ctx, Spelling S, bool IsAlignmentExpr, void *Alignment, SourceRange Loc = SourceRange()) {
619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AlignedAttr(Loc, Ctx, IsAlignmentExpr, Alignment, S);
620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AlignedAttr(SourceRange R, ASTContext &Ctx
625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bool IsAlignmentExpr, void *Alignment
626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Aligned, R, SI, false, false)
629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , isalignmentExpr(IsAlignmentExpr)
630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (isalignmentExpr)
632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot       alignmentExpr = reinterpret_cast<Expr *>(Alignment);
633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    else
634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot       alignmentType = reinterpret_cast<TypeSourceInfo *>(Alignment);
635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AlignedAttr(SourceRange R, ASTContext &Ctx
638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Aligned, R, SI, false, false)
641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , isalignmentExpr(false)
642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AlignedAttr *clone(ASTContext &C) const;
646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_aligned;
653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_gnu_aligned;
654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return Declspec_align;
655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return Keyword_alignas;
656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 4: return Keyword_Alignas;
657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isGNU() const { return SpellingListIndex == 0 ||
660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 1; }
661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isC11() const { return SpellingListIndex == 4; }
662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isAlignas() const { return SpellingListIndex == 3 ||
663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 4; }
664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isDeclspec() const { return SpellingListIndex == 2; }
665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isAlignmentDependent() const;
666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getAlignment(ASTContext &Ctx) const;
667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isAlignmentExpr() const {
668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return isalignmentExpr;
669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr *getAlignmentExpr() const {
671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(isalignmentExpr);
672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return alignmentExpr;
673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TypeSourceInfo *getAlignmentType() const {
675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(!isalignmentExpr);
676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return alignmentType;
677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Aligned; }
682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AllocAlignAttr : public InheritableAttr {
685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint paramIndex;
686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AllocAlignAttr *CreateImplicit(ASTContext &Ctx, int ParamIndex, SourceRange Loc = SourceRange()) {
689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AllocAlignAttr(Loc, Ctx, ParamIndex, 0);
690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AllocAlignAttr(SourceRange R, ASTContext &Ctx
695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int ParamIndex
696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AllocAlign, R, SI, false, false)
699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , paramIndex(ParamIndex)
700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AllocAlignAttr *clone(ASTContext &C) const;
704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getParamIndex() const {
708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return paramIndex;
709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AllocAlign; }
714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AllocSizeAttr : public InheritableAttr {
717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint elemSizeParam;
718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint numElemsParam;
720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AllocSizeAttr *CreateImplicit(ASTContext &Ctx, int ElemSizeParam, int NumElemsParam, SourceRange Loc = SourceRange()) {
723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AllocSizeAttr(Loc, Ctx, ElemSizeParam, NumElemsParam, 0);
724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AllocSizeAttr(SourceRange R, ASTContext &Ctx
729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int ElemSizeParam
730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int NumElemsParam
731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AllocSize, R, SI, false, false)
734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , elemSizeParam(ElemSizeParam)
735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , numElemsParam(NumElemsParam)
736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AllocSizeAttr(SourceRange R, ASTContext &Ctx
740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int ElemSizeParam
741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AllocSize, R, SI, false, false)
744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , elemSizeParam(ElemSizeParam)
745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , numElemsParam()
746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AllocSizeAttr *clone(ASTContext &C) const;
750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getElemSizeParam() const {
754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return elemSizeParam;
755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getNumElemsParam() const {
758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return numElemsParam;
759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
762f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AllocSize; }
764f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AlwaysInlineAttr : public InheritableAttr {
767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_always_inline = 0,
770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_always_inline = 1,
771f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_forceinline = 2
772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AlwaysInlineAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AlwaysInlineAttr(Loc, Ctx, S);
776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
778f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AlwaysInlineAttr(SourceRange R, ASTContext &Ctx
781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AlwaysInline, R, SI, false, false)
784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AlwaysInlineAttr *clone(ASTContext &C) const;
788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_always_inline;
795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_gnu_always_inline;
796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return Keyword_forceinline;
797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AlwaysInline; }
802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AnalyzerNoReturnAttr : public InheritableAttr {
805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AnalyzerNoReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AnalyzerNoReturnAttr(Loc, Ctx, 0);
808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AnalyzerNoReturnAttr(SourceRange R, ASTContext &Ctx
813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AnalyzerNoReturn, R, SI, false, false)
816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AnalyzerNoReturnAttr *clone(ASTContext &C) const;
820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AnalyzerNoReturn; }
826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AnnotateAttr : public InheritableParamAttr {
829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned annotationLength;
830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *annotation;
831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AnnotateAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Annotation, SourceRange Loc = SourceRange()) {
834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AnnotateAttr(Loc, Ctx, Annotation, 0);
835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AnnotateAttr(SourceRange R, ASTContext &Ctx
840f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Annotation
841f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
842f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
843f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableParamAttr(attr::Annotate, R, SI, false, false)
844f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , annotationLength(Annotation.size()),annotation(new (Ctx, 1) char[annotationLength])
845f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
846f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Annotation.empty())
847f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(annotation, Annotation.data(), annotationLength);
848f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
849f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
850f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AnnotateAttr *clone(ASTContext &C) const;
851f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
852f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
853f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
854f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getAnnotation() const {
855f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(annotation, annotationLength);
856f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
857f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getAnnotationLength() const {
858f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return annotationLength;
859f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
860f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setAnnotation(ASTContext &C, llvm::StringRef S) {
861f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    annotationLength = S.size();
862f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->annotation = new (C, 1) char [annotationLength];
863f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
864f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->annotation, S.data(), annotationLength);
865f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
866f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
867f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
868f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
869f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Annotate; }
870f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
871f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
872f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AnyX86InterruptAttr : public InheritableAttr {
873f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
874f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AnyX86InterruptAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
875f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AnyX86InterruptAttr(Loc, Ctx, 0);
876f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
877f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
878f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
879f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
880f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AnyX86InterruptAttr(SourceRange R, ASTContext &Ctx
881f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
882f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
883f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AnyX86Interrupt, R, SI, false, false)
884f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
885f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
886f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
887f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AnyX86InterruptAttr *clone(ASTContext &C) const;
888f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
889f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
890f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
891f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
892f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
893f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AnyX86Interrupt; }
894f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
895f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
896f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AnyX86NoCallerSavedRegistersAttr : public InheritableAttr {
897f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
898f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AnyX86NoCallerSavedRegistersAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
899f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AnyX86NoCallerSavedRegistersAttr(Loc, Ctx, 0);
900f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
901f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
902f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
903f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
904f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AnyX86NoCallerSavedRegistersAttr(SourceRange R, ASTContext &Ctx
905f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
906f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
907f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AnyX86NoCallerSavedRegisters, R, SI, false, false)
908f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
909f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
910f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
911f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AnyX86NoCallerSavedRegistersAttr *clone(ASTContext &C) const;
912f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
913f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
914f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
915f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
916f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
917f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AnyX86NoCallerSavedRegisters; }
918f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
919f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
920f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ArcWeakrefUnavailableAttr : public InheritableAttr {
921f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
922f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ArcWeakrefUnavailableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
923f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ArcWeakrefUnavailableAttr(Loc, Ctx, 0);
924f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
925f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
926f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
927f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
928f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ArcWeakrefUnavailableAttr(SourceRange R, ASTContext &Ctx
929f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
930f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
931f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ArcWeakrefUnavailable, R, SI, false, false)
932f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
933f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
934f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
935f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ArcWeakrefUnavailableAttr *clone(ASTContext &C) const;
936f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
937f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
938f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
939f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
940f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
941f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ArcWeakrefUnavailable; }
942f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
943f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
944f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ArgumentWithTypeTagAttr : public InheritableAttr {
945f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * argumentKind;
946f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
947f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned argumentIdx;
948f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
949f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned typeTagIdx;
950f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
951f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool isPointer;
952f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
953f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
954f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
955f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_argument_with_type_tag = 0,
956f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_pointer_with_type_tag = 1
957f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
958f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
959f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ArgumentWithTypeTagAttr *CreateImplicit(ASTContext &Ctx, Spelling S, IdentifierInfo * ArgumentKind, unsigned ArgumentIdx, unsigned TypeTagIdx, bool IsPointer, SourceRange Loc = SourceRange()) {
960f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ArgumentWithTypeTagAttr(Loc, Ctx, ArgumentKind, ArgumentIdx, TypeTagIdx, IsPointer, S);
961f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
962f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
963f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
964f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
965f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ArgumentWithTypeTagAttr(SourceRange R, ASTContext &Ctx
966f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * ArgumentKind
967f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned ArgumentIdx
968f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned TypeTagIdx
969f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bool IsPointer
970f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
971f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
972f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ArgumentWithTypeTag, R, SI, false, false)
973f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , argumentKind(ArgumentKind)
974f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , argumentIdx(ArgumentIdx)
975f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , typeTagIdx(TypeTagIdx)
976f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , isPointer(IsPointer)
977f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
978f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
979f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
980f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ArgumentWithTypeTagAttr *clone(ASTContext &C) const;
981f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
982f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
983f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
984f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
985f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
986f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
987f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_argument_with_type_tag;
988f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return GNU_pointer_with_type_tag;
989f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
990f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
991f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getArgumentKind() const {
992f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return argumentKind;
993f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
994f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
995f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getArgumentIdx() const {
996f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return argumentIdx;
997f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
998f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
999f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getTypeTagIdx() const {
1000f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return typeTagIdx;
1001f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1002f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1003f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getIsPointer() const {
1004f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return isPointer;
1005f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1006f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1007f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1008f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1009f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ArgumentWithTypeTag; }
1010f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1011f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1012f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AsmLabelAttr : public InheritableAttr {
1013f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned labelLength;
1014f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *label;
1015f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1016f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1017f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AsmLabelAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Label, SourceRange Loc = SourceRange()) {
1018f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AsmLabelAttr(Loc, Ctx, Label, 0);
1019f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1020f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1021f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1022f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1023f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AsmLabelAttr(SourceRange R, ASTContext &Ctx
1024f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Label
1025f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1026f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1027f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AsmLabel, R, SI, false, false)
1028f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , labelLength(Label.size()),label(new (Ctx, 1) char[labelLength])
1029f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1030f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Label.empty())
1031f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(label, Label.data(), labelLength);
1032f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1033f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1034f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AsmLabelAttr *clone(ASTContext &C) const;
1035f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1036f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1037f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1038f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getLabel() const {
1039f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(label, labelLength);
1040f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1041f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getLabelLength() const {
1042f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return labelLength;
1043f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1044f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setLabel(ASTContext &C, llvm::StringRef S) {
1045f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    labelLength = S.size();
1046f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->label = new (C, 1) char [labelLength];
1047f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
1048f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->label, S.data(), labelLength);
1049f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1050f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1051f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1052f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1053f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AsmLabel; }
1054f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1055f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1056f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AssertCapabilityAttr : public InheritableAttr {
1057f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
1058f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
1059f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1060f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1061f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
1062f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_assert_capability = 0,
1063f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_assert_capability = 1,
1064f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_assert_shared_capability = 2,
1065f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_assert_shared_capability = 3
1066f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
1067f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1068f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AssertCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
1069f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AssertCapabilityAttr(Loc, Ctx, Args, ArgsSize, S);
1070f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1071f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1072f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1073f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1074f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssertCapabilityAttr(SourceRange R, ASTContext &Ctx
1075f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
1076f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1077f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1078f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AssertCapability, R, SI, true, true)
1079f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
1080f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1081f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
1082f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1083f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1084f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssertCapabilityAttr(SourceRange R, ASTContext &Ctx
1085f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1086f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1087f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AssertCapability, R, SI, true, true)
1088f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
1089f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1090f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1091f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1092f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssertCapabilityAttr *clone(ASTContext &C) const;
1093f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1094f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1095f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1096f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
1097f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
1098f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
1099f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_assert_capability;
1100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_clang_assert_capability;
1101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_assert_shared_capability;
1102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return CXX11_clang_assert_shared_capability;
1103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isShared() const { return SpellingListIndex == 2 ||
1106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 3; }
1107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
1108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
1109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
1110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
1111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
1112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AssertCapability; }
1117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AssertExclusiveLockAttr : public InheritableAttr {
1120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
1121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
1122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AssertExclusiveLockAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
1125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AssertExclusiveLockAttr(Loc, Ctx, Args, ArgsSize, 0);
1126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssertExclusiveLockAttr(SourceRange R, ASTContext &Ctx
1131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
1132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AssertExclusiveLock, R, SI, true, true)
1135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
1136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
1138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssertExclusiveLockAttr(SourceRange R, ASTContext &Ctx
1141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AssertExclusiveLock, R, SI, true, true)
1144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
1145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssertExclusiveLockAttr *clone(ASTContext &C) const;
1149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
1153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
1154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
1155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
1156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
1157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AssertExclusiveLock; }
1162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AssertSharedLockAttr : public InheritableAttr {
1165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
1166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
1167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AssertSharedLockAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
1170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AssertSharedLockAttr(Loc, Ctx, Args, ArgsSize, 0);
1171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssertSharedLockAttr(SourceRange R, ASTContext &Ctx
1176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
1177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AssertSharedLock, R, SI, true, true)
1180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
1181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
1183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssertSharedLockAttr(SourceRange R, ASTContext &Ctx
1186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AssertSharedLock, R, SI, true, true)
1189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
1190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssertSharedLockAttr *clone(ASTContext &C) const;
1194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
1198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
1199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
1200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
1201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
1202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AssertSharedLock; }
1207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AssumeAlignedAttr : public InheritableAttr {
1210f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * alignment;
1211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1212f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * offset;
1213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AssumeAlignedAttr *CreateImplicit(ASTContext &Ctx, Expr * Alignment, Expr * Offset, SourceRange Loc = SourceRange()) {
1216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AssumeAlignedAttr(Loc, Ctx, Alignment, Offset, 0);
1217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssumeAlignedAttr(SourceRange R, ASTContext &Ctx
1222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Alignment
1223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Offset
1224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AssumeAligned, R, SI, false, false)
1227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , alignment(Alignment)
1228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , offset(Offset)
1229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssumeAlignedAttr(SourceRange R, ASTContext &Ctx
1233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Alignment
1234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::AssumeAligned, R, SI, false, false)
1237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , alignment(Alignment)
1238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , offset()
1239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AssumeAlignedAttr *clone(ASTContext &C) const;
1243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getAlignment() const {
1247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return alignment;
1248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getOffset() const {
1251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return offset;
1252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::AssumeAligned; }
1257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass AvailabilityAttr : public InheritableAttr {
1260f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * platform;
1261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1262f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotVersionTuple introduced;
1263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1265f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotVersionTuple deprecated;
1266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1268f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotVersionTuple obsoleted;
1269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool unavailable;
1272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned messageLength;
1274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *message;
1275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool strict;
1277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned replacementLength;
1279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *replacement;
1280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static AvailabilityAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * Platform, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool Unavailable, llvm::StringRef Message, bool Strict, llvm::StringRef Replacement, SourceRange Loc = SourceRange()) {
1283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) AvailabilityAttr(Loc, Ctx, Platform, Introduced, Deprecated, Obsoleted, Unavailable, Message, Strict, Replacement, 0);
1284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AvailabilityAttr(SourceRange R, ASTContext &Ctx
1289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * Platform
1290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , VersionTuple Introduced
1291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , VersionTuple Deprecated
1292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , VersionTuple Obsoleted
1293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bool Unavailable
1294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Message
1295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bool Strict
1296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Replacement
1297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Availability, R, SI, false, true)
1300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , platform(Platform)
1301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , introduced(Introduced)
1302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , deprecated(Deprecated)
1303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , obsoleted(Obsoleted)
1304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unavailable(Unavailable)
1305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
1306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , strict(Strict)
1307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , replacementLength(Replacement.size()),replacement(new (Ctx, 1) char[replacementLength])
1308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Message.empty())
1310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(message, Message.data(), messageLength);
1311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Replacement.empty())
1312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(replacement, Replacement.data(), replacementLength);
1313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  AvailabilityAttr *clone(ASTContext &C) const;
1316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getPlatform() const {
1320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return platform;
1321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VersionTuple getIntroduced() const {
1324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return introduced;
1325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setIntroduced(ASTContext &C, VersionTuple V) {
1327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    introduced = V;
1328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VersionTuple getDeprecated() const {
1331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return deprecated;
1332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setDeprecated(ASTContext &C, VersionTuple V) {
1334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    deprecated = V;
1335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VersionTuple getObsoleted() const {
1338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return obsoleted;
1339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setObsoleted(ASTContext &C, VersionTuple V) {
1341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    obsoleted = V;
1342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getUnavailable() const {
1345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return unavailable;
1346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getMessage() const {
1349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(message, messageLength);
1350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMessageLength() const {
1352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return messageLength;
1353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setMessage(ASTContext &C, llvm::StringRef S) {
1355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    messageLength = S.size();
1356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->message = new (C, 1) char [messageLength];
1357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
1358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->message, S.data(), messageLength);
1359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getStrict() const {
1362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return strict;
1363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getReplacement() const {
1366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(replacement, replacementLength);
1367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getReplacementLength() const {
1369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return replacementLength;
1370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setReplacement(ASTContext &C, llvm::StringRef S) {
1372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    replacementLength = S.size();
1373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->replacement = new (C, 1) char [replacementLength];
1374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
1375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->replacement, S.data(), replacementLength);
1376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotstatic llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) {
1379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringSwitch<llvm::StringRef>(Platform)
1380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("android", "Android")
1381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("ios", "iOS")
1382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("macos", "macOS")
1383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("tvos", "tvOS")
1384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("watchos", "watchOS")
1385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("ios_app_extension", "iOS (App Extension)")
1386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("macos_app_extension", "macOS (App Extension)")
1387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("tvos_app_extension", "tvOS (App Extension)")
1388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("watchos_app_extension", "watchOS (App Extension)")
1389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Default(llvm::StringRef());
1390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}
1391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotstatic llvm::StringRef getPlatformNameSourceSpelling(llvm::StringRef Platform) {
1392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringSwitch<llvm::StringRef>(Platform)
1393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("ios", "iOS")
1394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("macos", "macOS")
1395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("tvos", "tvOS")
1396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("watchos", "watchOS")
1397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("ios_app_extension", "iOSApplicationExtension")
1398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("macos_app_extension", "macOSApplicationExtension")
1399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("tvos_app_extension", "tvOSApplicationExtension")
1400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("watchos_app_extension", "watchOSApplicationExtension")
1401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Default(Platform);
1402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}
1403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotstatic llvm::StringRef canonicalizePlatformName(llvm::StringRef Platform) {
1404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringSwitch<llvm::StringRef>(Platform)
1405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("iOS", "ios")
1406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("macOS", "macos")
1407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("tvOS", "tvos")
1408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("watchOS", "watchos")
1409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("iOSApplicationExtension", "ios_app_extension")
1410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("macOSApplicationExtension", "macos_app_extension")
1411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("tvOSApplicationExtension", "tvos_app_extension")
1412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Case("watchOSApplicationExtension", "watchos_app_extension")
1413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             .Default(Platform);
1414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}
1415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Availability; }
1417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass BlocksAttr : public InheritableAttr {
1420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum BlockType {
1422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ByRef
1423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
1424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
1425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  BlockType type;
1426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static BlocksAttr *CreateImplicit(ASTContext &Ctx, BlockType Type, SourceRange Loc = SourceRange()) {
1429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) BlocksAttr(Loc, Ctx, Type, 0);
1430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  BlocksAttr(SourceRange R, ASTContext &Ctx
1435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , BlockType Type
1436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Blocks, R, SI, false, false)
1439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , type(Type)
1440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  BlocksAttr *clone(ASTContext &C) const;
1444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  BlockType getType() const {
1448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return type;
1449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToBlockType(StringRef Val, BlockType &Out) {
1452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<BlockType> R = llvm::StringSwitch<Optional<BlockType>>(Val)
1453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("byref", BlocksAttr::ByRef)
1454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<BlockType>());
1455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
1456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
1457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
1458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
1459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
1460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertBlockTypeToStr(BlockType Val) {
1463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
1464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case BlocksAttr::ByRef: return "byref";
1465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
1466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
1467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Blocks; }
1471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass C11NoReturnAttr : public InheritableAttr {
1474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static C11NoReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) C11NoReturnAttr(Loc, Ctx, 0);
1477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  C11NoReturnAttr(SourceRange R, ASTContext &Ctx
1482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::C11NoReturn, R, SI, false, false)
1485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  C11NoReturnAttr *clone(ASTContext &C) const;
1489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::C11NoReturn; }
1495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CDeclAttr : public InheritableAttr {
1498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CDeclAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CDeclAttr(Loc, Ctx, 0);
1501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CDeclAttr(SourceRange R, ASTContext &Ctx
1506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CDecl, R, SI, false, false)
1509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CDeclAttr *clone(ASTContext &C) const;
1513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CDecl; }
1519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CFAuditedTransferAttr : public InheritableAttr {
1522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CFAuditedTransferAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CFAuditedTransferAttr(Loc, Ctx, 0);
1525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFAuditedTransferAttr(SourceRange R, ASTContext &Ctx
1530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CFAuditedTransfer, R, SI, false, false)
1533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFAuditedTransferAttr *clone(ASTContext &C) const;
1537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CFAuditedTransfer; }
1543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CFConsumedAttr : public InheritableParamAttr {
1546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CFConsumedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CFConsumedAttr(Loc, Ctx, 0);
1549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFConsumedAttr(SourceRange R, ASTContext &Ctx
1554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableParamAttr(attr::CFConsumed, R, SI, false, false)
1557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFConsumedAttr *clone(ASTContext &C) const;
1561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CFConsumed; }
1567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CFReturnsNotRetainedAttr : public InheritableAttr {
1570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CFReturnsNotRetainedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CFReturnsNotRetainedAttr(Loc, Ctx, 0);
1573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFReturnsNotRetainedAttr(SourceRange R, ASTContext &Ctx
1578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CFReturnsNotRetained, R, SI, false, false)
1581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFReturnsNotRetainedAttr *clone(ASTContext &C) const;
1585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CFReturnsNotRetained; }
1591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CFReturnsRetainedAttr : public InheritableAttr {
1594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CFReturnsRetainedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CFReturnsRetainedAttr(Loc, Ctx, 0);
1597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFReturnsRetainedAttr(SourceRange R, ASTContext &Ctx
1602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CFReturnsRetained, R, SI, false, false)
1605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFReturnsRetainedAttr *clone(ASTContext &C) const;
1609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CFReturnsRetained; }
1615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CFUnknownTransferAttr : public InheritableAttr {
1618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CFUnknownTransferAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CFUnknownTransferAttr(Loc, Ctx, 0);
1621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFUnknownTransferAttr(SourceRange R, ASTContext &Ctx
1626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CFUnknownTransfer, R, SI, false, false)
1629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CFUnknownTransferAttr *clone(ASTContext &C) const;
1633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CFUnknownTransfer; }
1639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CUDAConstantAttr : public InheritableAttr {
1642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CUDAConstantAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CUDAConstantAttr(Loc, Ctx, 0);
1645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDAConstantAttr(SourceRange R, ASTContext &Ctx
1650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CUDAConstant, R, SI, false, false)
1653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDAConstantAttr *clone(ASTContext &C) const;
1657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CUDAConstant; }
1663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CUDADeviceAttr : public InheritableAttr {
1666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CUDADeviceAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CUDADeviceAttr(Loc, Ctx, 0);
1669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDADeviceAttr(SourceRange R, ASTContext &Ctx
1674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CUDADevice, R, SI, false, false)
1677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDADeviceAttr *clone(ASTContext &C) const;
1681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CUDADevice; }
1687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CUDAGlobalAttr : public InheritableAttr {
1690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CUDAGlobalAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CUDAGlobalAttr(Loc, Ctx, 0);
1693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDAGlobalAttr(SourceRange R, ASTContext &Ctx
1698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CUDAGlobal, R, SI, false, false)
1701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDAGlobalAttr *clone(ASTContext &C) const;
1705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CUDAGlobal; }
1711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CUDAHostAttr : public InheritableAttr {
1714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CUDAHostAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CUDAHostAttr(Loc, Ctx, 0);
1717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDAHostAttr(SourceRange R, ASTContext &Ctx
1722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CUDAHost, R, SI, false, false)
1725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDAHostAttr *clone(ASTContext &C) const;
1729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CUDAHost; }
1735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CUDAInvalidTargetAttr : public InheritableAttr {
1738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CUDAInvalidTargetAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CUDAInvalidTargetAttr(Loc, Ctx, 0);
1741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDAInvalidTargetAttr(SourceRange R, ASTContext &Ctx
1746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CUDAInvalidTarget, R, SI, false, false)
1749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDAInvalidTargetAttr *clone(ASTContext &C) const;
1753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CUDAInvalidTarget; }
1759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CUDALaunchBoundsAttr : public InheritableAttr {
1762f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * maxThreads;
1763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1764f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * minBlocks;
1765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CUDALaunchBoundsAttr *CreateImplicit(ASTContext &Ctx, Expr * MaxThreads, Expr * MinBlocks, SourceRange Loc = SourceRange()) {
1768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CUDALaunchBoundsAttr(Loc, Ctx, MaxThreads, MinBlocks, 0);
1769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1771f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDALaunchBoundsAttr(SourceRange R, ASTContext &Ctx
1774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * MaxThreads
1775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * MinBlocks
1776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1778f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CUDALaunchBounds, R, SI, false, false)
1779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , maxThreads(MaxThreads)
1780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , minBlocks(MinBlocks)
1781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDALaunchBoundsAttr(SourceRange R, ASTContext &Ctx
1785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * MaxThreads
1786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CUDALaunchBounds, R, SI, false, false)
1789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , maxThreads(MaxThreads)
1790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , minBlocks()
1791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDALaunchBoundsAttr *clone(ASTContext &C) const;
1795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getMaxThreads() const {
1799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return maxThreads;
1800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getMinBlocks() const {
1803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return minBlocks;
1804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CUDALaunchBounds; }
1809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CUDASharedAttr : public InheritableAttr {
1812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CUDASharedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CUDASharedAttr(Loc, Ctx, 0);
1815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDASharedAttr(SourceRange R, ASTContext &Ctx
1820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CUDAShared, R, SI, false, false)
1823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CUDASharedAttr *clone(ASTContext &C) const;
1827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CUDAShared; }
1833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CXX11NoReturnAttr : public InheritableAttr {
1836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CXX11NoReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
1838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CXX11NoReturnAttr(Loc, Ctx, 0);
1839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1840f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1841f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1842f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1843f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CXX11NoReturnAttr(SourceRange R, ASTContext &Ctx
1844f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1845f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1846f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CXX11NoReturn, R, SI, false, false)
1847f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1848f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1849f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1850f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CXX11NoReturnAttr *clone(ASTContext &C) const;
1851f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1852f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1853f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1854f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1855f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1856f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CXX11NoReturn; }
1857f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1858f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1859f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CallableWhenAttr : public InheritableAttr {
1860f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1861f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum ConsumedState {
1862f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unknown,
1863f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Consumed,
1864f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unconsumed
1865f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
1866f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
1867f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned callableStates_Size;
1868f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState *callableStates_;
1869f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1870f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1871f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CallableWhenAttr *CreateImplicit(ASTContext &Ctx, ConsumedState *CallableStates, unsigned CallableStatesSize, SourceRange Loc = SourceRange()) {
1872f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CallableWhenAttr(Loc, Ctx, CallableStates, CallableStatesSize, 0);
1873f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1874f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1875f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1876f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1877f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CallableWhenAttr(SourceRange R, ASTContext &Ctx
1878f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , ConsumedState *CallableStates, unsigned CallableStatesSize
1879f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1880f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1881f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CallableWhen, R, SI, false, false)
1882f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , callableStates_Size(CallableStatesSize), callableStates_(new (Ctx, 16) ConsumedState[callableStates_Size])
1883f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1884f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(CallableStates, CallableStates + callableStates_Size, callableStates_);
1885f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1886f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1887f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CallableWhenAttr(SourceRange R, ASTContext &Ctx
1888f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1889f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1890f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CallableWhen, R, SI, false, false)
1891f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , callableStates_Size(0), callableStates_(nullptr)
1892f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1893f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1894f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1895f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CallableWhenAttr *clone(ASTContext &C) const;
1896f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1897f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1898f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1899f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef ConsumedState* callableStates_iterator;
1900f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  callableStates_iterator callableStates_begin() const { return callableStates_; }
1901f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  callableStates_iterator callableStates_end() const { return callableStates_ + callableStates_Size; }
1902f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned callableStates_size() const { return callableStates_Size; }
1903f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<callableStates_iterator> callableStates() const { return llvm::make_range(callableStates_begin(), callableStates_end()); }
1904f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1905f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1906f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
1907f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
1908f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unknown", CallableWhenAttr::Unknown)
1909f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("consumed", CallableWhenAttr::Consumed)
1910f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unconsumed", CallableWhenAttr::Unconsumed)
1911f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<ConsumedState>());
1912f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
1913f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
1914f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
1915f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
1916f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
1917f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1918f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1919f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertConsumedStateToStr(ConsumedState Val) {
1920f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
1921f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case CallableWhenAttr::Unknown: return "unknown";
1922f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case CallableWhenAttr::Consumed: return "consumed";
1923f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case CallableWhenAttr::Unconsumed: return "unconsumed";
1924f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
1925f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
1926f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1927f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1928f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1929f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CallableWhen; }
1930f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1931f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1932f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CapabilityAttr : public InheritableAttr {
1933f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned nameLength;
1934f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *name;
1935f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1936f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1937f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
1938f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_capability = 0,
1939f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_capability = 1,
1940f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_shared_capability = 2,
1941f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_shared_capability = 3
1942f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
1943f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1944f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, llvm::StringRef Name, SourceRange Loc = SourceRange()) {
1945f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CapabilityAttr(Loc, Ctx, Name, S);
1946f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
1947f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
1948f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1949f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1950f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CapabilityAttr(SourceRange R, ASTContext &Ctx
1951f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Name
1952f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
1953f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
1954f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Capability, R, SI, false, false)
1955f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
1956f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
1957f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Name.empty())
1958f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(name, Name.data(), nameLength);
1959f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1960f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1961f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CapabilityAttr *clone(ASTContext &C) const;
1962f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
1963f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
1964f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
1965f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
1966f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
1967f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
1968f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_capability;
1969f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_clang_capability;
1970f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_shared_capability;
1971f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return CXX11_clang_shared_capability;
1972f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1973f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1974f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isShared() const { return SpellingListIndex == 2 ||
1975f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 3; }
1976f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getName() const {
1977f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(name, nameLength);
1978f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1979f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getNameLength() const {
1980f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return nameLength;
1981f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1982f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setName(ASTContext &C, llvm::StringRef S) {
1983f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    nameLength = S.size();
1984f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->name = new (C, 1) char [nameLength];
1985f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
1986f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->name, S.data(), nameLength);
1987f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
1988f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1989f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1990f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    bool isMutex() const { return getName().equals_lower("mutex"); }
1991f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    bool isRole() const { return getName().equals_lower("role"); }
1992f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1993f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1994f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Capability; }
1995f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
1996f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
1997f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CapturedRecordAttr : public InheritableAttr {
1998f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
1999f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CapturedRecordAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2000f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CapturedRecordAttr(Loc, Ctx, 0);
2001f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2002f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2003f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2004f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2005f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CapturedRecordAttr(SourceRange R, ASTContext &Ctx
2006f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2007f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2008f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::CapturedRecord, R, SI, false, false)
2009f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2010f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2011f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2012f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CapturedRecordAttr *clone(ASTContext &C) const;
2013f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2014f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2015f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2016f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2017f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2018f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CapturedRecord; }
2019f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2020f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2021f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CarriesDependencyAttr : public InheritableParamAttr {
2022f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2023f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CarriesDependencyAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2024f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CarriesDependencyAttr(Loc, Ctx, 0);
2025f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2026f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2027f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2028f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2029f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CarriesDependencyAttr(SourceRange R, ASTContext &Ctx
2030f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2031f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2032f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableParamAttr(attr::CarriesDependency, R, SI, false, false)
2033f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2034f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2035f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2036f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CarriesDependencyAttr *clone(ASTContext &C) const;
2037f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2038f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2039f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2040f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2041f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2042f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::CarriesDependency; }
2043f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2044f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2045f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CleanupAttr : public InheritableAttr {
2046f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotFunctionDecl * functionDecl;
2047f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2048f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2049f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CleanupAttr *CreateImplicit(ASTContext &Ctx, FunctionDecl * FunctionDecl, SourceRange Loc = SourceRange()) {
2050f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CleanupAttr(Loc, Ctx, FunctionDecl, 0);
2051f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2052f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2053f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2054f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2055f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CleanupAttr(SourceRange R, ASTContext &Ctx
2056f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , FunctionDecl * FunctionDecl
2057f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2058f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2059f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Cleanup, R, SI, false, false)
2060f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , functionDecl(FunctionDecl)
2061f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2062f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2063f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2064f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CleanupAttr *clone(ASTContext &C) const;
2065f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2066f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2067f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2068f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FunctionDecl * getFunctionDecl() const {
2069f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return functionDecl;
2070f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2071f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2072f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2073f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2074f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Cleanup; }
2075f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2076f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2077f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ColdAttr : public InheritableAttr {
2078f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2079f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ColdAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2080f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ColdAttr(Loc, Ctx, 0);
2081f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2082f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2083f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2084f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2085f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ColdAttr(SourceRange R, ASTContext &Ctx
2086f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2087f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2088f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Cold, R, SI, false, false)
2089f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2090f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2091f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2092f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ColdAttr *clone(ASTContext &C) const;
2093f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2094f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2095f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2096f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2097f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2098f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Cold; }
2099f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass CommonAttr : public InheritableAttr {
2102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static CommonAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) CommonAttr(Loc, Ctx, 0);
2105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CommonAttr(SourceRange R, ASTContext &Ctx
2110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Common, R, SI, false, false)
2113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  CommonAttr *clone(ASTContext &C) const;
2117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Common; }
2123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ConstAttr : public InheritableAttr {
2126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ConstAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ConstAttr(Loc, Ctx, 0);
2129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConstAttr(SourceRange R, ASTContext &Ctx
2134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Const, R, SI, false, false)
2137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConstAttr *clone(ASTContext &C) const;
2141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Const; }
2147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ConstructorAttr : public InheritableAttr {
2150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint priority;
2151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ConstructorAttr *CreateImplicit(ASTContext &Ctx, int Priority, SourceRange Loc = SourceRange()) {
2154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ConstructorAttr(Loc, Ctx, Priority, 0);
2155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConstructorAttr(SourceRange R, ASTContext &Ctx
2160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int Priority
2161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Constructor, R, SI, false, false)
2164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , priority(Priority)
2165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConstructorAttr(SourceRange R, ASTContext &Ctx
2169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Constructor, R, SI, false, false)
2172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , priority()
2173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConstructorAttr *clone(ASTContext &C) const;
2177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getPriority() const {
2181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return priority;
2182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const int DefaultPriority = 65535;
2185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Constructor; }
2189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ConsumableAttr : public InheritableAttr {
2192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum ConsumedState {
2194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unknown,
2195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Consumed,
2196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unconsumed
2197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
2198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
2199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState defaultState;
2200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ConsumableAttr *CreateImplicit(ASTContext &Ctx, ConsumedState DefaultState, SourceRange Loc = SourceRange()) {
2203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ConsumableAttr(Loc, Ctx, DefaultState, 0);
2204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumableAttr(SourceRange R, ASTContext &Ctx
2209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , ConsumedState DefaultState
2210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Consumable, R, SI, false, false)
2213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , defaultState(DefaultState)
2214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumableAttr *clone(ASTContext &C) const;
2218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState getDefaultState() const {
2222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return defaultState;
2223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
2226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
2227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unknown", ConsumableAttr::Unknown)
2228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("consumed", ConsumableAttr::Consumed)
2229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unconsumed", ConsumableAttr::Unconsumed)
2230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<ConsumedState>());
2231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
2232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
2233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
2234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
2235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
2236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertConsumedStateToStr(ConsumedState Val) {
2239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
2240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ConsumableAttr::Unknown: return "unknown";
2241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ConsumableAttr::Consumed: return "consumed";
2242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ConsumableAttr::Unconsumed: return "unconsumed";
2243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
2244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
2245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Consumable; }
2249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ConsumableAutoCastAttr : public InheritableAttr {
2252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ConsumableAutoCastAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ConsumableAutoCastAttr(Loc, Ctx, 0);
2255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumableAutoCastAttr(SourceRange R, ASTContext &Ctx
2260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ConsumableAutoCast, R, SI, false, false)
2263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumableAutoCastAttr *clone(ASTContext &C) const;
2267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ConsumableAutoCast; }
2273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ConsumableSetOnReadAttr : public InheritableAttr {
2276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ConsumableSetOnReadAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ConsumableSetOnReadAttr(Loc, Ctx, 0);
2279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumableSetOnReadAttr(SourceRange R, ASTContext &Ctx
2284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ConsumableSetOnRead, R, SI, false, false)
2287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumableSetOnReadAttr *clone(ASTContext &C) const;
2291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ConsumableSetOnRead; }
2297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ConvergentAttr : public InheritableAttr {
2300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ConvergentAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ConvergentAttr(Loc, Ctx, 0);
2303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConvergentAttr(SourceRange R, ASTContext &Ctx
2308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Convergent, R, SI, false, false)
2311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConvergentAttr *clone(ASTContext &C) const;
2315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Convergent; }
2321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass DLLExportAttr : public InheritableAttr {
2324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static DLLExportAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) DLLExportAttr(Loc, Ctx, 0);
2327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DLLExportAttr(SourceRange R, ASTContext &Ctx
2332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::DLLExport, R, SI, false, false)
2335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DLLExportAttr *clone(ASTContext &C) const;
2339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::DLLExport; }
2345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass DLLImportAttr : public InheritableAttr {
2348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static DLLImportAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) DLLImportAttr(Loc, Ctx, 0);
2351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DLLImportAttr(SourceRange R, ASTContext &Ctx
2356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::DLLImport, R, SI, false, false)
2359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DLLImportAttr *clone(ASTContext &C) const;
2363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::DLLImport; }
2369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass DeprecatedAttr : public InheritableAttr {
2372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned messageLength;
2373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *message;
2374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned replacementLength;
2376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *replacement;
2377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static DeprecatedAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, llvm::StringRef Replacement, SourceRange Loc = SourceRange()) {
2380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) DeprecatedAttr(Loc, Ctx, Message, Replacement, 0);
2381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DeprecatedAttr(SourceRange R, ASTContext &Ctx
2386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Message
2387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Replacement
2388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Deprecated, R, SI, false, false)
2391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
2392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , replacementLength(Replacement.size()),replacement(new (Ctx, 1) char[replacementLength])
2393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Message.empty())
2395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(message, Message.data(), messageLength);
2396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Replacement.empty())
2397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(replacement, Replacement.data(), replacementLength);
2398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DeprecatedAttr(SourceRange R, ASTContext &Ctx
2401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Deprecated, R, SI, false, false)
2404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , messageLength(0),message(nullptr)
2405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , replacementLength(0),replacement(nullptr)
2406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DeprecatedAttr *clone(ASTContext &C) const;
2410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getMessage() const {
2414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(message, messageLength);
2415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMessageLength() const {
2417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return messageLength;
2418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setMessage(ASTContext &C, llvm::StringRef S) {
2420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    messageLength = S.size();
2421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->message = new (C, 1) char [messageLength];
2422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
2423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->message, S.data(), messageLength);
2424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getReplacement() const {
2427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(replacement, replacementLength);
2428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getReplacementLength() const {
2430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return replacementLength;
2431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setReplacement(ASTContext &C, llvm::StringRef S) {
2433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    replacementLength = S.size();
2434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->replacement = new (C, 1) char [replacementLength];
2435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
2436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->replacement, S.data(), replacementLength);
2437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Deprecated; }
2442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass DestructorAttr : public InheritableAttr {
2445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint priority;
2446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static DestructorAttr *CreateImplicit(ASTContext &Ctx, int Priority, SourceRange Loc = SourceRange()) {
2449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) DestructorAttr(Loc, Ctx, Priority, 0);
2450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DestructorAttr(SourceRange R, ASTContext &Ctx
2455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int Priority
2456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Destructor, R, SI, false, false)
2459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , priority(Priority)
2460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DestructorAttr(SourceRange R, ASTContext &Ctx
2464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Destructor, R, SI, false, false)
2467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , priority()
2468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DestructorAttr *clone(ASTContext &C) const;
2472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getPriority() const {
2476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return priority;
2477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const int DefaultPriority = 65535;
2480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Destructor; }
2484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass DiagnoseIfAttr : public InheritableAttr {
2487f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * cond;
2488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned messageLength;
2490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *message;
2491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum DiagnosticType {
2494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    DT_Error,
2495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    DT_Warning
2496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
2497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
2498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DiagnosticType diagnosticType;
2499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool argDependent;
2501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2502f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotNamedDecl * parent;
2503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static DiagnoseIfAttr *CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnosticType DiagnosticType, bool ArgDependent, NamedDecl * Parent, SourceRange Loc = SourceRange()) {
2506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) DiagnoseIfAttr(Loc, Ctx, Cond, Message, DiagnosticType, ArgDependent, Parent, 0);
2507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static DiagnoseIfAttr *CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, DiagnosticType DiagnosticType, SourceRange Loc = SourceRange()) {
2512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) DiagnoseIfAttr(Loc, Ctx, Cond, Message, DiagnosticType, 0);
2513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DiagnoseIfAttr(SourceRange R, ASTContext &Ctx
2518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Cond
2519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Message
2520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , DiagnosticType DiagnosticType
2521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bool ArgDependent
2522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , NamedDecl * Parent
2523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::DiagnoseIf, R, SI, true, true)
2526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , cond(Cond)
2527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
2528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , diagnosticType(DiagnosticType)
2529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , argDependent(ArgDependent)
2530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , parent(Parent)
2531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Message.empty())
2533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(message, Message.data(), messageLength);
2534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DiagnoseIfAttr(SourceRange R, ASTContext &Ctx
2537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Cond
2538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Message
2539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , DiagnosticType DiagnosticType
2540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::DiagnoseIf, R, SI, true, true)
2543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , cond(Cond)
2544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
2545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , diagnosticType(DiagnosticType)
2546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , argDependent()
2547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , parent()
2548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Message.empty())
2550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(message, Message.data(), messageLength);
2551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DiagnoseIfAttr *clone(ASTContext &C) const;
2554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getCond() const {
2558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return cond;
2559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getMessage() const {
2562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(message, messageLength);
2563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMessageLength() const {
2565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return messageLength;
2566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setMessage(ASTContext &C, llvm::StringRef S) {
2568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    messageLength = S.size();
2569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->message = new (C, 1) char [messageLength];
2570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
2571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->message, S.data(), messageLength);
2572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DiagnosticType getDiagnosticType() const {
2575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return diagnosticType;
2576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToDiagnosticType(StringRef Val, DiagnosticType &Out) {
2579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<DiagnosticType> R = llvm::StringSwitch<Optional<DiagnosticType>>(Val)
2580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("error", DiagnoseIfAttr::DT_Error)
2581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("warning", DiagnoseIfAttr::DT_Warning)
2582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<DiagnosticType>());
2583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
2584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
2585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
2586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
2587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
2588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertDiagnosticTypeToStr(DiagnosticType Val) {
2591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
2592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case DiagnoseIfAttr::DT_Error: return "error";
2593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case DiagnoseIfAttr::DT_Warning: return "warning";
2594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
2595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
2596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getArgDependent() const {
2598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return argDependent;
2599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NamedDecl * getParent() const {
2602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return parent;
2603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    bool isError() const { return diagnosticType == DT_Error; }
2607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    bool isWarning() const { return diagnosticType == DT_Warning; }
2608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::DiagnoseIf; }
2611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass DisableTailCallsAttr : public InheritableAttr {
2614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static DisableTailCallsAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) DisableTailCallsAttr(Loc, Ctx, 0);
2617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DisableTailCallsAttr(SourceRange R, ASTContext &Ctx
2622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::DisableTailCalls, R, SI, false, false)
2625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DisableTailCallsAttr *clone(ASTContext &C) const;
2629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::DisableTailCalls; }
2635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass EmptyBasesAttr : public InheritableAttr {
2638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static EmptyBasesAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) EmptyBasesAttr(Loc, Ctx, 0);
2641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  EmptyBasesAttr(SourceRange R, ASTContext &Ctx
2646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::EmptyBases, R, SI, false, false)
2649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  EmptyBasesAttr *clone(ASTContext &C) const;
2653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::EmptyBases; }
2659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass EnableIfAttr : public InheritableAttr {
2662f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * cond;
2663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned messageLength;
2665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *message;
2666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static EnableIfAttr *CreateImplicit(ASTContext &Ctx, Expr * Cond, llvm::StringRef Message, SourceRange Loc = SourceRange()) {
2669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) EnableIfAttr(Loc, Ctx, Cond, Message, 0);
2670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  EnableIfAttr(SourceRange R, ASTContext &Ctx
2675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Cond
2676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Message
2677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::EnableIf, R, SI, false, false)
2680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , cond(Cond)
2681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
2682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Message.empty())
2684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(message, Message.data(), messageLength);
2685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  EnableIfAttr *clone(ASTContext &C) const;
2688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getCond() const {
2692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return cond;
2693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getMessage() const {
2696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(message, messageLength);
2697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMessageLength() const {
2699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return messageLength;
2700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setMessage(ASTContext &C, llvm::StringRef S) {
2702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    messageLength = S.size();
2703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->message = new (C, 1) char [messageLength];
2704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
2705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->message, S.data(), messageLength);
2706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::EnableIf; }
2711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass EnumExtensibilityAttr : public InheritableAttr {
2714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Kind {
2716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Closed,
2717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Open
2718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
2719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
2720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Kind extensibility;
2721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static EnumExtensibilityAttr *CreateImplicit(ASTContext &Ctx, Kind Extensibility, SourceRange Loc = SourceRange()) {
2724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) EnumExtensibilityAttr(Loc, Ctx, Extensibility, 0);
2725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  EnumExtensibilityAttr(SourceRange R, ASTContext &Ctx
2730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Kind Extensibility
2731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::EnumExtensibility, R, SI, false, false)
2734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , extensibility(Extensibility)
2735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  EnumExtensibilityAttr *clone(ASTContext &C) const;
2739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Kind getExtensibility() const {
2743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return extensibility;
2744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToKind(StringRef Val, Kind &Out) {
2747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<Kind> R = llvm::StringSwitch<Optional<Kind>>(Val)
2748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("closed", EnumExtensibilityAttr::Closed)
2749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("open", EnumExtensibilityAttr::Open)
2750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<Kind>());
2751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
2752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
2753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
2754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
2755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
2756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertKindToStr(Kind Val) {
2759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
2760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case EnumExtensibilityAttr::Closed: return "closed";
2761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case EnumExtensibilityAttr::Open: return "open";
2762f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
2763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
2764f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::EnumExtensibility; }
2768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ExclusiveTrylockFunctionAttr : public InheritableAttr {
2771f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * successValue;
2772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
2774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
2775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ExclusiveTrylockFunctionAttr *CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
2778f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ExclusiveTrylockFunctionAttr(Loc, Ctx, SuccessValue, Args, ArgsSize, 0);
2779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ExclusiveTrylockFunctionAttr(SourceRange R, ASTContext &Ctx
2784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * SuccessValue
2785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
2786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ExclusiveTrylockFunction, R, SI, true, true)
2789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , successValue(SuccessValue)
2790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
2791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
2793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ExclusiveTrylockFunctionAttr(SourceRange R, ASTContext &Ctx
2796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * SuccessValue
2797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ExclusiveTrylockFunction, R, SI, true, true)
2800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , successValue(SuccessValue)
2801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
2802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ExclusiveTrylockFunctionAttr *clone(ASTContext &C) const;
2806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getSuccessValue() const {
2810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return successValue;
2811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
2814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
2815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
2816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
2817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
2818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ExclusiveTrylockFunction; }
2823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ExternalSourceSymbolAttr : public InheritableAttr {
2826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned languageLength;
2827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *language;
2828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned definedInLength;
2830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *definedIn;
2831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool generatedDeclaration;
2833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ExternalSourceSymbolAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Language, llvm::StringRef DefinedIn, bool GeneratedDeclaration, SourceRange Loc = SourceRange()) {
2836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ExternalSourceSymbolAttr(Loc, Ctx, Language, DefinedIn, GeneratedDeclaration, 0);
2837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2840f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2841f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ExternalSourceSymbolAttr(SourceRange R, ASTContext &Ctx
2842f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Language
2843f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef DefinedIn
2844f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bool GeneratedDeclaration
2845f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2846f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2847f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ExternalSourceSymbol, R, SI, false, false)
2848f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , languageLength(Language.size()),language(new (Ctx, 1) char[languageLength])
2849f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , definedInLength(DefinedIn.size()),definedIn(new (Ctx, 1) char[definedInLength])
2850f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , generatedDeclaration(GeneratedDeclaration)
2851f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2852f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Language.empty())
2853f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(language, Language.data(), languageLength);
2854f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!DefinedIn.empty())
2855f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(definedIn, DefinedIn.data(), definedInLength);
2856f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2857f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2858f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ExternalSourceSymbolAttr(SourceRange R, ASTContext &Ctx
2859f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2860f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2861f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ExternalSourceSymbol, R, SI, false, false)
2862f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , languageLength(0),language(nullptr)
2863f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , definedInLength(0),definedIn(nullptr)
2864f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , generatedDeclaration()
2865f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2866f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2867f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2868f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ExternalSourceSymbolAttr *clone(ASTContext &C) const;
2869f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2870f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2871f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2872f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getLanguage() const {
2873f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(language, languageLength);
2874f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2875f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getLanguageLength() const {
2876f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return languageLength;
2877f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2878f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setLanguage(ASTContext &C, llvm::StringRef S) {
2879f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    languageLength = S.size();
2880f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->language = new (C, 1) char [languageLength];
2881f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
2882f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->language, S.data(), languageLength);
2883f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2884f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2885f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getDefinedIn() const {
2886f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(definedIn, definedInLength);
2887f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2888f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getDefinedInLength() const {
2889f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return definedInLength;
2890f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2891f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setDefinedIn(ASTContext &C, llvm::StringRef S) {
2892f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    definedInLength = S.size();
2893f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->definedIn = new (C, 1) char [definedInLength];
2894f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
2895f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->definedIn, S.data(), definedInLength);
2896f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2897f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2898f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getGeneratedDeclaration() const {
2899f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return generatedDeclaration;
2900f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2901f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2902f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2903f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2904f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ExternalSourceSymbol; }
2905f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2906f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2907f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FallThroughAttr : public StmtAttr {
2908f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2909f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static FallThroughAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2910f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) FallThroughAttr(Loc, Ctx, 0);
2911f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2912f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2913f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2914f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2915f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FallThroughAttr(SourceRange R, ASTContext &Ctx
2916f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2917f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2918f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : StmtAttr(attr::FallThrough, R, SI, false, false)
2919f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2920f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2921f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2922f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FallThroughAttr *clone(ASTContext &C) const;
2923f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2924f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2925f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2926f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2927f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2928f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::FallThrough; }
2929f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2930f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2931f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FastCallAttr : public InheritableAttr {
2932f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2933f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static FastCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2934f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) FastCallAttr(Loc, Ctx, 0);
2935f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2936f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2937f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2938f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2939f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FastCallAttr(SourceRange R, ASTContext &Ctx
2940f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2941f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2942f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::FastCall, R, SI, false, false)
2943f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2944f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2945f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2946f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FastCallAttr *clone(ASTContext &C) const;
2947f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2948f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2949f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2950f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2951f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2952f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::FastCall; }
2953f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2954f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2955f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FinalAttr : public InheritableAttr {
2956f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2957f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
2958f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_final = 0,
2959f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_sealed = 1
2960f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
2961f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2962f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static FinalAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
2963f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) FinalAttr(Loc, Ctx, S);
2964f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2965f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2966f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2967f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2968f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FinalAttr(SourceRange R, ASTContext &Ctx
2969f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
2970f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
2971f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Final, R, SI, false, false)
2972f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
2973f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2974f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2975f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FinalAttr *clone(ASTContext &C) const;
2976f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
2977f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
2978f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
2979f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
2980f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
2981f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
2982f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return Keyword_final;
2983f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return Keyword_sealed;
2984f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2985f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2986f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isSpelledAsSealed() const { return SpellingListIndex == 1; }
2987f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2988f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2989f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Final; }
2990f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
2991f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
2992f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FlagEnumAttr : public InheritableAttr {
2993f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
2994f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static FlagEnumAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
2995f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) FlagEnumAttr(Loc, Ctx, 0);
2996f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
2997f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
2998f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
2999f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3000f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FlagEnumAttr(SourceRange R, ASTContext &Ctx
3001f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3002f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3003f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::FlagEnum, R, SI, false, false)
3004f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3005f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3006f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3007f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FlagEnumAttr *clone(ASTContext &C) const;
3008f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3009f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3010f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3011f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3012f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3013f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::FlagEnum; }
3014f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3015f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3016f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FlattenAttr : public InheritableAttr {
3017f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3018f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static FlattenAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3019f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) FlattenAttr(Loc, Ctx, 0);
3020f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3021f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3022f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3023f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3024f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FlattenAttr(SourceRange R, ASTContext &Ctx
3025f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3026f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3027f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Flatten, R, SI, false, false)
3028f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3029f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3030f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3031f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FlattenAttr *clone(ASTContext &C) const;
3032f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3033f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3034f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3035f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3036f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3037f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Flatten; }
3038f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3039f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3040f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FormatAttr : public InheritableAttr {
3041f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * type;
3042f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3043f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint formatIdx;
3044f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3045f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint firstArg;
3046f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3047f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3048f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static FormatAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * Type, int FormatIdx, int FirstArg, SourceRange Loc = SourceRange()) {
3049f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) FormatAttr(Loc, Ctx, Type, FormatIdx, FirstArg, 0);
3050f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3051f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3052f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3053f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3054f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FormatAttr(SourceRange R, ASTContext &Ctx
3055f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * Type
3056f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int FormatIdx
3057f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int FirstArg
3058f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3059f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3060f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Format, R, SI, false, false)
3061f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , type(Type)
3062f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , formatIdx(FormatIdx)
3063f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , firstArg(FirstArg)
3064f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3065f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3066f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3067f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FormatAttr *clone(ASTContext &C) const;
3068f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3069f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3070f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3071f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getType() const {
3072f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return type;
3073f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3074f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3075f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getFormatIdx() const {
3076f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return formatIdx;
3077f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3078f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3079f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getFirstArg() const {
3080f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return firstArg;
3081f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3082f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3083f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3084f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3085f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Format; }
3086f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3087f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3088f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FormatArgAttr : public InheritableAttr {
3089f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint formatIdx;
3090f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3091f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3092f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static FormatArgAttr *CreateImplicit(ASTContext &Ctx, int FormatIdx, SourceRange Loc = SourceRange()) {
3093f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) FormatArgAttr(Loc, Ctx, FormatIdx, 0);
3094f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3095f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3096f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3097f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3098f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FormatArgAttr(SourceRange R, ASTContext &Ctx
3099f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int FormatIdx
3100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::FormatArg, R, SI, false, false)
3103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , formatIdx(FormatIdx)
3104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FormatArgAttr *clone(ASTContext &C) const;
3108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getFormatIdx() const {
3112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return formatIdx;
3113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::FormatArg; }
3118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass GNUInlineAttr : public InheritableAttr {
3121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static GNUInlineAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) GNUInlineAttr(Loc, Ctx, 0);
3124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  GNUInlineAttr(SourceRange R, ASTContext &Ctx
3129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::GNUInline, R, SI, false, false)
3132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  GNUInlineAttr *clone(ASTContext &C) const;
3136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::GNUInline; }
3142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass GuardedByAttr : public InheritableAttr {
3145f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * arg;
3146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static GuardedByAttr *CreateImplicit(ASTContext &Ctx, Expr * Arg, SourceRange Loc = SourceRange()) {
3149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) GuardedByAttr(Loc, Ctx, Arg, 0);
3150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  GuardedByAttr(SourceRange R, ASTContext &Ctx
3155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Arg
3156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::GuardedBy, R, SI, true, true)
3159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , arg(Arg)
3160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  GuardedByAttr *clone(ASTContext &C) const;
3164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getArg() const {
3168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return arg;
3169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::GuardedBy; }
3174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass GuardedVarAttr : public InheritableAttr {
3177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static GuardedVarAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) GuardedVarAttr(Loc, Ctx, 0);
3180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  GuardedVarAttr(SourceRange R, ASTContext &Ctx
3185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::GuardedVar, R, SI, false, false)
3188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  GuardedVarAttr *clone(ASTContext &C) const;
3192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::GuardedVar; }
3198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass HotAttr : public InheritableAttr {
3201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static HotAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) HotAttr(Loc, Ctx, 0);
3204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  HotAttr(SourceRange R, ASTContext &Ctx
3209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Hot, R, SI, false, false)
3212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  HotAttr *clone(ASTContext &C) const;
3216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Hot; }
3222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass IBActionAttr : public InheritableAttr {
3225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static IBActionAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) IBActionAttr(Loc, Ctx, 0);
3228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IBActionAttr(SourceRange R, ASTContext &Ctx
3233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::IBAction, R, SI, false, false)
3236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IBActionAttr *clone(ASTContext &C) const;
3240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::IBAction; }
3246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass IBOutletAttr : public InheritableAttr {
3249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static IBOutletAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) IBOutletAttr(Loc, Ctx, 0);
3252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IBOutletAttr(SourceRange R, ASTContext &Ctx
3257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::IBOutlet, R, SI, false, false)
3260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IBOutletAttr *clone(ASTContext &C) const;
3264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::IBOutlet; }
3270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass IBOutletCollectionAttr : public InheritableAttr {
3273f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotTypeSourceInfo * interface_;
3274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static IBOutletCollectionAttr *CreateImplicit(ASTContext &Ctx, TypeSourceInfo * Interface, SourceRange Loc = SourceRange()) {
3277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) IBOutletCollectionAttr(Loc, Ctx, Interface, 0);
3278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IBOutletCollectionAttr(SourceRange R, ASTContext &Ctx
3283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , TypeSourceInfo * Interface
3284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::IBOutletCollection, R, SI, false, false)
3287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , interface_(Interface)
3288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IBOutletCollectionAttr(SourceRange R, ASTContext &Ctx
3292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::IBOutletCollection, R, SI, false, false)
3295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , interface_()
3296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IBOutletCollectionAttr *clone(ASTContext &C) const;
3300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  QualType getInterface() const {
3304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return interface_->getType();
3305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }  TypeSourceInfo * getInterfaceLoc() const {
3306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return interface_;
3307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::IBOutletCollection; }
3312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass IFuncAttr : public Attr {
3315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned resolverLength;
3316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *resolver;
3317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static IFuncAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Resolver, SourceRange Loc = SourceRange()) {
3320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) IFuncAttr(Loc, Ctx, Resolver, 0);
3321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IFuncAttr(SourceRange R, ASTContext &Ctx
3326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Resolver
3327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::IFunc, R, SI, false, false)
3330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , resolverLength(Resolver.size()),resolver(new (Ctx, 1) char[resolverLength])
3331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Resolver.empty())
3333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(resolver, Resolver.data(), resolverLength);
3334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IFuncAttr *clone(ASTContext &C) const;
3337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getResolver() const {
3341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(resolver, resolverLength);
3342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getResolverLength() const {
3344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return resolverLength;
3345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setResolver(ASTContext &C, llvm::StringRef S) {
3347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    resolverLength = S.size();
3348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->resolver = new (C, 1) char [resolverLength];
3349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
3350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->resolver, S.data(), resolverLength);
3351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::IFunc; }
3356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass InitPriorityAttr : public InheritableAttr {
3359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned priority;
3360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static InitPriorityAttr *CreateImplicit(ASTContext &Ctx, unsigned Priority, SourceRange Loc = SourceRange()) {
3363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) InitPriorityAttr(Loc, Ctx, Priority, 0);
3364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InitPriorityAttr(SourceRange R, ASTContext &Ctx
3369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Priority
3370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::InitPriority, R, SI, false, false)
3373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , priority(Priority)
3374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InitPriorityAttr *clone(ASTContext &C) const;
3378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getPriority() const {
3382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return priority;
3383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::InitPriority; }
3388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass InitSegAttr : public Attr {
3391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned sectionLength;
3392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *section;
3393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static InitSegAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Section, SourceRange Loc = SourceRange()) {
3396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) InitSegAttr(Loc, Ctx, Section, 0);
3397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InitSegAttr(SourceRange R, ASTContext &Ctx
3402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Section
3403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::InitSeg, R, SI, false, false)
3406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , sectionLength(Section.size()),section(new (Ctx, 1) char[sectionLength])
3407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Section.empty())
3409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(section, Section.data(), sectionLength);
3410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InitSegAttr *clone(ASTContext &C) const;
3413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getSection() const {
3417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(section, sectionLength);
3418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getSectionLength() const {
3420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return sectionLength;
3421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setSection(ASTContext &C, llvm::StringRef S) {
3423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    sectionLength = S.size();
3424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->section = new (C, 1) char [sectionLength];
3425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
3426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->section, S.data(), sectionLength);
3427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
3431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OS << '(' << getSection() << ')';
3432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::InitSeg; }
3436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass IntelOclBiccAttr : public InheritableAttr {
3439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static IntelOclBiccAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) IntelOclBiccAttr(Loc, Ctx, 0);
3442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IntelOclBiccAttr(SourceRange R, ASTContext &Ctx
3447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::IntelOclBicc, R, SI, false, false)
3450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IntelOclBiccAttr *clone(ASTContext &C) const;
3454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::IntelOclBicc; }
3460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass InternalLinkageAttr : public InheritableAttr {
3463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static InternalLinkageAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) InternalLinkageAttr(Loc, Ctx, 0);
3466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InternalLinkageAttr(SourceRange R, ASTContext &Ctx
3471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::InternalLinkage, R, SI, false, false)
3474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InternalLinkageAttr *clone(ASTContext &C) const;
3478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::InternalLinkage; }
3484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass LTOVisibilityPublicAttr : public InheritableAttr {
3487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static LTOVisibilityPublicAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) LTOVisibilityPublicAttr(Loc, Ctx, 0);
3490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LTOVisibilityPublicAttr(SourceRange R, ASTContext &Ctx
3495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::LTOVisibilityPublic, R, SI, false, false)
3498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LTOVisibilityPublicAttr *clone(ASTContext &C) const;
3502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::LTOVisibilityPublic; }
3508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass LayoutVersionAttr : public InheritableAttr {
3511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned version;
3512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static LayoutVersionAttr *CreateImplicit(ASTContext &Ctx, unsigned Version, SourceRange Loc = SourceRange()) {
3515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) LayoutVersionAttr(Loc, Ctx, Version, 0);
3516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LayoutVersionAttr(SourceRange R, ASTContext &Ctx
3521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Version
3522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::LayoutVersion, R, SI, false, false)
3525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , version(Version)
3526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LayoutVersionAttr *clone(ASTContext &C) const;
3530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getVersion() const {
3534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return version;
3535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::LayoutVersion; }
3540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass LockReturnedAttr : public InheritableAttr {
3543f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * arg;
3544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static LockReturnedAttr *CreateImplicit(ASTContext &Ctx, Expr * Arg, SourceRange Loc = SourceRange()) {
3547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) LockReturnedAttr(Loc, Ctx, Arg, 0);
3548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LockReturnedAttr(SourceRange R, ASTContext &Ctx
3553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Arg
3554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::LockReturned, R, SI, true, false)
3557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , arg(Arg)
3558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LockReturnedAttr *clone(ASTContext &C) const;
3562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getArg() const {
3566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return arg;
3567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::LockReturned; }
3572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass LocksExcludedAttr : public InheritableAttr {
3575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
3576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
3577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static LocksExcludedAttr *CreateImplicit(ASTContext &Ctx, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
3580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) LocksExcludedAttr(Loc, Ctx, Args, ArgsSize, 0);
3581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LocksExcludedAttr(SourceRange R, ASTContext &Ctx
3586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
3587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::LocksExcluded, R, SI, true, true)
3590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
3591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
3593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LocksExcludedAttr(SourceRange R, ASTContext &Ctx
3596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::LocksExcluded, R, SI, true, true)
3599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
3600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LocksExcludedAttr *clone(ASTContext &C) const;
3604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
3608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
3609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
3610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
3611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
3612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::LocksExcluded; }
3617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass LoopHintAttr : public Attr {
3620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum OptionType {
3622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Vectorize,
3623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    VectorizeWidth,
3624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Interleave,
3625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    InterleaveCount,
3626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unroll,
3627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    UnrollCount,
3628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Distribute
3629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
3630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
3631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OptionType option;
3632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum LoopHintState {
3635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Enable,
3636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Disable,
3637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Numeric,
3638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    AssumeSafety,
3639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Full
3640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
3641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
3642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LoopHintState state;
3643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3644f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * value;
3645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
3648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Pragma_clang_loop = 0,
3649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Pragma_unroll = 1,
3650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Pragma_nounroll = 2
3651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
3652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static LoopHintAttr *CreateImplicit(ASTContext &Ctx, Spelling S, OptionType Option, LoopHintState State, Expr * Value, SourceRange Loc = SourceRange()) {
3654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) LoopHintAttr(Loc, Ctx, Option, State, Value, S);
3655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LoopHintAttr(SourceRange R, ASTContext &Ctx
3660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , OptionType Option
3661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , LoopHintState State
3662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Value
3663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::LoopHint, R, SI, false, false)
3666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , option(Option)
3667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , state(State)
3668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , value(Value)
3669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LoopHintAttr *clone(ASTContext &C) const;
3673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
3677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
3678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
3679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return Pragma_clang_loop;
3680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return Pragma_unroll;
3681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return Pragma_nounroll;
3682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OptionType getOption() const {
3685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return option;
3686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToOptionType(StringRef Val, OptionType &Out) {
3689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<OptionType> R = llvm::StringSwitch<Optional<OptionType>>(Val)
3690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vectorize", LoopHintAttr::Vectorize)
3691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vectorize_width", LoopHintAttr::VectorizeWidth)
3692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("interleave", LoopHintAttr::Interleave)
3693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("interleave_count", LoopHintAttr::InterleaveCount)
3694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unroll", LoopHintAttr::Unroll)
3695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unroll_count", LoopHintAttr::UnrollCount)
3696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("distribute", LoopHintAttr::Distribute)
3697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<OptionType>());
3698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
3699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
3700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
3701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
3702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
3703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertOptionTypeToStr(OptionType Val) {
3706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
3707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::Vectorize: return "vectorize";
3708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::VectorizeWidth: return "vectorize_width";
3709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::Interleave: return "interleave";
3710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::InterleaveCount: return "interleave_count";
3711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::Unroll: return "unroll";
3712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::UnrollCount: return "unroll_count";
3713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::Distribute: return "distribute";
3714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
3715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
3716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  LoopHintState getState() const {
3718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return state;
3719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToLoopHintState(StringRef Val, LoopHintState &Out) {
3722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<LoopHintState> R = llvm::StringSwitch<Optional<LoopHintState>>(Val)
3723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("enable", LoopHintAttr::Enable)
3724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("disable", LoopHintAttr::Disable)
3725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("numeric", LoopHintAttr::Numeric)
3726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("assume_safety", LoopHintAttr::AssumeSafety)
3727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("full", LoopHintAttr::Full)
3728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<LoopHintState>());
3729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
3730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
3731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
3732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
3733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
3734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertLoopHintStateToStr(LoopHintState Val) {
3737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
3738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::Enable: return "enable";
3739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::Disable: return "disable";
3740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::Numeric: return "numeric";
3741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::AssumeSafety: return "assume_safety";
3742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case LoopHintAttr::Full: return "full";
3743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
3744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
3745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getValue() const {
3747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return value;
3748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *getOptionName(int Option) {
3752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Option) {
3753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case Vectorize: return "vectorize";
3754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case VectorizeWidth: return "vectorize_width";
3755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case Interleave: return "interleave";
3756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case InterleaveCount: return "interleave_count";
3757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case Unroll: return "unroll";
3758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case UnrollCount: return "unroll_count";
3759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case Distribute: return "distribute";
3760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
3761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("Unhandled LoopHint option.");
3762f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3764f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
3765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    unsigned SpellingIndex = getSpellingListIndex();
3766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    // For "#pragma unroll" and "#pragma nounroll" the string "unroll" or
3767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    // "nounroll" is already emitted as the pragma name.
3768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (SpellingIndex == Pragma_nounroll)
3769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return;
3770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    else if (SpellingIndex == Pragma_unroll) {
3771f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      OS << getValueString(Policy);
3772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return;
3773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
3774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling");
3776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OS << getOptionName(option) << getValueString(Policy);
3777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3778f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // Return a string containing the loop hint argument including the
3780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // enclosing parentheses.
3781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  std::string getValueString(const PrintingPolicy &Policy) const {
3782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::string ValueName;
3783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm::raw_string_ostream OS(ValueName);
3784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OS << "(";
3785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (state == Numeric)
3786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      value->printPretty(OS, nullptr, Policy);
3787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    else if (state == Enable)
3788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      OS << "enable";
3789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    else if (state == Full)
3790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      OS << "full";
3791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    else if (state == AssumeSafety)
3792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      OS << "assume_safety";
3793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    else
3794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      OS << "disable";
3795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OS << ")";
3796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return OS.str();
3797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // Return a string suitable for identifying this attribute in diagnostics.
3800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  std::string getDiagnosticName(const PrintingPolicy &Policy) const {
3801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    unsigned SpellingIndex = getSpellingListIndex();
3802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (SpellingIndex == Pragma_nounroll)
3803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return "#pragma nounroll";
3804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    else if (SpellingIndex == Pragma_unroll)
3805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return "#pragma unroll" + (option == UnrollCount ? getValueString(Policy) : "");
3806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling");
3808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return getOptionName(option) + getValueString(Policy);
3809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::LoopHint; }
3813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MSABIAttr : public InheritableAttr {
3816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MSABIAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MSABIAttr(Loc, Ctx, 0);
3819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSABIAttr(SourceRange R, ASTContext &Ctx
3824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MSABI, R, SI, false, false)
3827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSABIAttr *clone(ASTContext &C) const;
3831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MSABI; }
3837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MSInheritanceAttr : public InheritableAttr {
3840f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool bestCase;
3841f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3842f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3843f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
3844f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_single_inheritance = 0,
3845f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_multiple_inheritance = 1,
3846f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_virtual_inheritance = 2,
3847f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_unspecified_inheritance = 3
3848f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
3849f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3850f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MSInheritanceAttr *CreateImplicit(ASTContext &Ctx, Spelling S, bool BestCase, SourceRange Loc = SourceRange()) {
3851f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MSInheritanceAttr(Loc, Ctx, BestCase, S);
3852f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3853f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3854f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3855f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3856f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSInheritanceAttr(SourceRange R, ASTContext &Ctx
3857f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bool BestCase
3858f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3859f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3860f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MSInheritance, R, SI, false, false)
3861f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bestCase(BestCase)
3862f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3863f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3864f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3865f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSInheritanceAttr(SourceRange R, ASTContext &Ctx
3866f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3867f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3868f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MSInheritance, R, SI, false, false)
3869f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bestCase()
3870f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3871f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3872f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3873f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSInheritanceAttr *clone(ASTContext &C) const;
3874f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3875f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3876f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3877f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
3878f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
3879f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
3880f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return Keyword_single_inheritance;
3881f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return Keyword_multiple_inheritance;
3882f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return Keyword_virtual_inheritance;
3883f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return Keyword_unspecified_inheritance;
3884f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3885f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3886f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getBestCase() const {
3887f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return bestCase;
3888f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3889f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3890f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const bool DefaultBestCase = true;
3891f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3892f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3893f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool hasVBPtrOffsetField(Spelling Inheritance) {
3894f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Inheritance == Keyword_unspecified_inheritance;
3895f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3896f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3897f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // Only member pointers to functions need a this adjustment, since it can be
3898f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // combined with the field offset for data pointers.
3899f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool hasNVOffsetField(bool IsMemberFunction, Spelling Inheritance) {
3900f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return IsMemberFunction && Inheritance >= Keyword_multiple_inheritance;
3901f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3902f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3903f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool hasVBTableOffsetField(Spelling Inheritance) {
3904f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Inheritance >= Keyword_virtual_inheritance;
3905f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3906f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3907f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool hasOnlyOneField(bool IsMemberFunction,
3908f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                              Spelling Inheritance) {
3909f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (IsMemberFunction)
3910f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return Inheritance <= Keyword_single_inheritance;
3911f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return Inheritance <= Keyword_multiple_inheritance;
3912f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3913f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3914f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3915f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MSInheritance; }
3916f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3917f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3918f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MSNoVTableAttr : public InheritableAttr {
3919f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3920f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MSNoVTableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3921f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MSNoVTableAttr(Loc, Ctx, 0);
3922f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3923f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3924f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3925f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3926f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSNoVTableAttr(SourceRange R, ASTContext &Ctx
3927f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3928f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3929f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MSNoVTable, R, SI, false, false)
3930f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3931f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3932f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3933f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSNoVTableAttr *clone(ASTContext &C) const;
3934f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3935f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3936f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3937f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3938f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3939f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MSNoVTable; }
3940f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3941f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3942f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MSP430InterruptAttr : public InheritableAttr {
3943f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned number;
3944f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3945f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3946f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MSP430InterruptAttr *CreateImplicit(ASTContext &Ctx, unsigned Number, SourceRange Loc = SourceRange()) {
3947f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MSP430InterruptAttr(Loc, Ctx, Number, 0);
3948f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3949f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3950f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3951f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3952f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSP430InterruptAttr(SourceRange R, ASTContext &Ctx
3953f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Number
3954f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3955f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3956f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MSP430Interrupt, R, SI, false, false)
3957f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , number(Number)
3958f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3959f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3960f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3961f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSP430InterruptAttr *clone(ASTContext &C) const;
3962f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3963f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3964f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3965f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getNumber() const {
3966f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return number;
3967f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3968f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3969f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3970f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3971f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MSP430Interrupt; }
3972f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3973f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3974f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MSStructAttr : public InheritableAttr {
3975f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
3976f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MSStructAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
3977f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MSStructAttr(Loc, Ctx, 0);
3978f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
3979f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
3980f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3981f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3982f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSStructAttr(SourceRange R, ASTContext &Ctx
3983f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
3984f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
3985f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MSStruct, R, SI, false, false)
3986f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
3987f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
3988f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3989f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSStructAttr *clone(ASTContext &C) const;
3990f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
3991f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
3992f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
3993f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3994f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3995f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MSStruct; }
3996f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
3997f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
3998f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MSVtorDispAttr : public InheritableAttr {
3999f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned vdm;
4000f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4001f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4002f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MSVtorDispAttr *CreateImplicit(ASTContext &Ctx, unsigned Vdm, SourceRange Loc = SourceRange()) {
4003f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MSVtorDispAttr(Loc, Ctx, Vdm, 0);
4004f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4005f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4006f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4007f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4008f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSVtorDispAttr(SourceRange R, ASTContext &Ctx
4009f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Vdm
4010f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4011f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4012f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MSVtorDisp, R, SI, false, false)
4013f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , vdm(Vdm)
4014f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4015f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4016f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4017f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MSVtorDispAttr *clone(ASTContext &C) const;
4018f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4019f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4020f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4021f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getVdm() const {
4022f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return vdm;
4023f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4024f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4025f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4026f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Mode {
4027f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Never,
4028f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ForVBaseOverride,
4029f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ForVFTable
4030f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
4031f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4032f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Mode getVtorDispMode() const { return Mode(vdm); }
4033f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4034f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4035f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MSVtorDisp; }
4036f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4037f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4038f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MaxFieldAlignmentAttr : public InheritableAttr {
4039f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned alignment;
4040f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4041f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4042f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MaxFieldAlignmentAttr *CreateImplicit(ASTContext &Ctx, unsigned Alignment, SourceRange Loc = SourceRange()) {
4043f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MaxFieldAlignmentAttr(Loc, Ctx, Alignment, 0);
4044f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4045f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4046f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4047f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4048f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MaxFieldAlignmentAttr(SourceRange R, ASTContext &Ctx
4049f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned Alignment
4050f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4051f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4052f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MaxFieldAlignment, R, SI, false, false)
4053f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , alignment(Alignment)
4054f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4055f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4056f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4057f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MaxFieldAlignmentAttr *clone(ASTContext &C) const;
4058f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4059f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4060f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4061f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getAlignment() const {
4062f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return alignment;
4063f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4064f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4065f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4066f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4067f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MaxFieldAlignment; }
4068f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4069f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4070f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MayAliasAttr : public InheritableAttr {
4071f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4072f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MayAliasAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4073f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MayAliasAttr(Loc, Ctx, 0);
4074f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4075f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4076f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4077f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4078f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MayAliasAttr(SourceRange R, ASTContext &Ctx
4079f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4080f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4081f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MayAlias, R, SI, false, false)
4082f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4083f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4084f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4085f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MayAliasAttr *clone(ASTContext &C) const;
4086f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4087f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4088f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4089f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4090f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4091f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MayAlias; }
4092f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4093f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4094f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MicroMipsAttr : public InheritableAttr {
4095f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4096f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MicroMipsAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4097f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MicroMipsAttr(Loc, Ctx, 0);
4098f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4099f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MicroMipsAttr(SourceRange R, ASTContext &Ctx
4103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MicroMips, R, SI, false, false)
4106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MicroMipsAttr *clone(ASTContext &C) const;
4110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MicroMips; }
4116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MinSizeAttr : public InheritableAttr {
4119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MinSizeAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MinSizeAttr(Loc, Ctx, 0);
4122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MinSizeAttr(SourceRange R, ASTContext &Ctx
4127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MinSize, R, SI, false, false)
4130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MinSizeAttr *clone(ASTContext &C) const;
4134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MinSize; }
4140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass Mips16Attr : public InheritableAttr {
4143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static Mips16Attr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) Mips16Attr(Loc, Ctx, 0);
4146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Mips16Attr(SourceRange R, ASTContext &Ctx
4151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Mips16, R, SI, false, false)
4154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Mips16Attr *clone(ASTContext &C) const;
4158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Mips16; }
4164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MipsInterruptAttr : public InheritableAttr {
4167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum InterruptType {
4169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    sw0,
4170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    sw1,
4171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    hw0,
4172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    hw1,
4173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    hw2,
4174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    hw3,
4175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    hw4,
4176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    hw5,
4177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    eic
4178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
4179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
4180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InterruptType interrupt;
4181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MipsInterruptAttr *CreateImplicit(ASTContext &Ctx, InterruptType Interrupt, SourceRange Loc = SourceRange()) {
4184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MipsInterruptAttr(Loc, Ctx, Interrupt, 0);
4185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MipsInterruptAttr(SourceRange R, ASTContext &Ctx
4190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , InterruptType Interrupt
4191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MipsInterrupt, R, SI, false, false)
4194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , interrupt(Interrupt)
4195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MipsInterruptAttr *clone(ASTContext &C) const;
4199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InterruptType getInterrupt() const {
4203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return interrupt;
4204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToInterruptType(StringRef Val, InterruptType &Out) {
4207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<InterruptType> R = llvm::StringSwitch<Optional<InterruptType>>(Val)
4208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vector=sw0", MipsInterruptAttr::sw0)
4209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vector=sw1", MipsInterruptAttr::sw1)
4210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vector=hw0", MipsInterruptAttr::hw0)
4211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vector=hw1", MipsInterruptAttr::hw1)
4212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vector=hw2", MipsInterruptAttr::hw2)
4213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vector=hw3", MipsInterruptAttr::hw3)
4214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vector=hw4", MipsInterruptAttr::hw4)
4215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("vector=hw5", MipsInterruptAttr::hw5)
4216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("eic", MipsInterruptAttr::eic)
4217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("", MipsInterruptAttr::eic)
4218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<InterruptType>());
4219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
4220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
4221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
4222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
4223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
4224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertInterruptTypeToStr(InterruptType Val) {
4227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
4228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case MipsInterruptAttr::sw0: return "vector=sw0";
4229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case MipsInterruptAttr::sw1: return "vector=sw1";
4230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case MipsInterruptAttr::hw0: return "vector=hw0";
4231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case MipsInterruptAttr::hw1: return "vector=hw1";
4232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case MipsInterruptAttr::hw2: return "vector=hw2";
4233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case MipsInterruptAttr::hw3: return "vector=hw3";
4234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case MipsInterruptAttr::hw4: return "vector=hw4";
4235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case MipsInterruptAttr::hw5: return "vector=hw5";
4236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case MipsInterruptAttr::eic: return "eic";
4237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
4238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
4239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MipsInterrupt; }
4243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MipsLongCallAttr : public InheritableAttr {
4246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
4248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_long_call = 0,
4249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_long_call = 1,
4250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_far = 2,
4251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_far = 3
4252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
4253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MipsLongCallAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
4255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MipsLongCallAttr(Loc, Ctx, S);
4256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MipsLongCallAttr(SourceRange R, ASTContext &Ctx
4261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MipsLongCall, R, SI, false, false)
4264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MipsLongCallAttr *clone(ASTContext &C) const;
4268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
4272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
4273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
4274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_long_call;
4275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_gnu_long_call;
4276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_far;
4277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return CXX11_gnu_far;
4278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MipsLongCall; }
4283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MipsShortCallAttr : public InheritableAttr {
4286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
4288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_short_call = 0,
4289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_short_call = 1,
4290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_near = 2,
4291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_near = 3
4292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
4293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static MipsShortCallAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
4295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) MipsShortCallAttr(Loc, Ctx, S);
4296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MipsShortCallAttr(SourceRange R, ASTContext &Ctx
4301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::MipsShortCall, R, SI, false, false)
4304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MipsShortCallAttr *clone(ASTContext &C) const;
4308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
4312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
4313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
4314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_short_call;
4315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_gnu_short_call;
4316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_near;
4317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return CXX11_gnu_near;
4318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::MipsShortCall; }
4323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ModeAttr : public Attr {
4326f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * mode;
4327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ModeAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * Mode, SourceRange Loc = SourceRange()) {
4330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ModeAttr(Loc, Ctx, Mode, 0);
4331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ModeAttr(SourceRange R, ASTContext &Ctx
4336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * Mode
4337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::Mode, R, SI, false, false)
4340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , mode(Mode)
4341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ModeAttr *clone(ASTContext &C) const;
4345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getMode() const {
4349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return mode;
4350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Mode; }
4355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NSConsumedAttr : public InheritableParamAttr {
4358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NSConsumedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NSConsumedAttr(Loc, Ctx, 0);
4361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSConsumedAttr(SourceRange R, ASTContext &Ctx
4366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableParamAttr(attr::NSConsumed, R, SI, false, false)
4369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSConsumedAttr *clone(ASTContext &C) const;
4373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NSConsumed; }
4379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NSConsumesSelfAttr : public InheritableAttr {
4382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NSConsumesSelfAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NSConsumesSelfAttr(Loc, Ctx, 0);
4385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSConsumesSelfAttr(SourceRange R, ASTContext &Ctx
4390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NSConsumesSelf, R, SI, false, false)
4393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSConsumesSelfAttr *clone(ASTContext &C) const;
4397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NSConsumesSelf; }
4403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NSReturnsAutoreleasedAttr : public InheritableAttr {
4406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NSReturnsAutoreleasedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NSReturnsAutoreleasedAttr(Loc, Ctx, 0);
4409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSReturnsAutoreleasedAttr(SourceRange R, ASTContext &Ctx
4414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NSReturnsAutoreleased, R, SI, false, false)
4417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSReturnsAutoreleasedAttr *clone(ASTContext &C) const;
4421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NSReturnsAutoreleased; }
4427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NSReturnsNotRetainedAttr : public InheritableAttr {
4430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NSReturnsNotRetainedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NSReturnsNotRetainedAttr(Loc, Ctx, 0);
4433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSReturnsNotRetainedAttr(SourceRange R, ASTContext &Ctx
4438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NSReturnsNotRetained, R, SI, false, false)
4441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSReturnsNotRetainedAttr *clone(ASTContext &C) const;
4445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NSReturnsNotRetained; }
4451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NSReturnsRetainedAttr : public InheritableAttr {
4454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NSReturnsRetainedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NSReturnsRetainedAttr(Loc, Ctx, 0);
4457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSReturnsRetainedAttr(SourceRange R, ASTContext &Ctx
4462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NSReturnsRetained, R, SI, false, false)
4465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NSReturnsRetainedAttr *clone(ASTContext &C) const;
4469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NSReturnsRetained; }
4475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NakedAttr : public InheritableAttr {
4478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NakedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NakedAttr(Loc, Ctx, 0);
4481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NakedAttr(SourceRange R, ASTContext &Ctx
4486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Naked, R, SI, false, false)
4489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NakedAttr *clone(ASTContext &C) const;
4493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Naked; }
4499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoAliasAttr : public InheritableAttr {
4502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoAliasAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoAliasAttr(Loc, Ctx, 0);
4505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoAliasAttr(SourceRange R, ASTContext &Ctx
4510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoAlias, R, SI, false, false)
4513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoAliasAttr *clone(ASTContext &C) const;
4517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoAlias; }
4523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoCommonAttr : public InheritableAttr {
4526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoCommonAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoCommonAttr(Loc, Ctx, 0);
4529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoCommonAttr(SourceRange R, ASTContext &Ctx
4534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoCommon, R, SI, false, false)
4537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoCommonAttr *clone(ASTContext &C) const;
4541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoCommon; }
4547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoDebugAttr : public InheritableAttr {
4550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoDebugAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoDebugAttr(Loc, Ctx, 0);
4553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoDebugAttr(SourceRange R, ASTContext &Ctx
4558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoDebug, R, SI, false, false)
4561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoDebugAttr *clone(ASTContext &C) const;
4565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoDebug; }
4571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoDuplicateAttr : public InheritableAttr {
4574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoDuplicateAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoDuplicateAttr(Loc, Ctx, 0);
4577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoDuplicateAttr(SourceRange R, ASTContext &Ctx
4582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoDuplicate, R, SI, false, false)
4585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoDuplicateAttr *clone(ASTContext &C) const;
4589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoDuplicate; }
4595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoEscapeAttr : public Attr {
4598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoEscapeAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoEscapeAttr(Loc, Ctx, 0);
4601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoEscapeAttr(SourceRange R, ASTContext &Ctx
4606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::NoEscape, R, SI, false, false)
4609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoEscapeAttr *clone(ASTContext &C) const;
4613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoEscape; }
4619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoInlineAttr : public InheritableAttr {
4622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoInlineAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoInlineAttr(Loc, Ctx, 0);
4625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoInlineAttr(SourceRange R, ASTContext &Ctx
4630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoInline, R, SI, false, false)
4633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoInlineAttr *clone(ASTContext &C) const;
4637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoInline; }
4643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoInstrumentFunctionAttr : public InheritableAttr {
4646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoInstrumentFunctionAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoInstrumentFunctionAttr(Loc, Ctx, 0);
4649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoInstrumentFunctionAttr(SourceRange R, ASTContext &Ctx
4654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoInstrumentFunction, R, SI, false, false)
4657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoInstrumentFunctionAttr *clone(ASTContext &C) const;
4661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoInstrumentFunction; }
4667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoMicroMipsAttr : public InheritableAttr {
4670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoMicroMipsAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoMicroMipsAttr(Loc, Ctx, 0);
4673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoMicroMipsAttr(SourceRange R, ASTContext &Ctx
4678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoMicroMips, R, SI, false, false)
4681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoMicroMipsAttr *clone(ASTContext &C) const;
4685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoMicroMips; }
4691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoMips16Attr : public InheritableAttr {
4694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoMips16Attr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoMips16Attr(Loc, Ctx, 0);
4697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoMips16Attr(SourceRange R, ASTContext &Ctx
4702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoMips16, R, SI, false, false)
4705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoMips16Attr *clone(ASTContext &C) const;
4709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoMips16; }
4715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoReturnAttr : public InheritableAttr {
4718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoReturnAttr(Loc, Ctx, 0);
4721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoReturnAttr(SourceRange R, ASTContext &Ctx
4726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoReturn, R, SI, false, false)
4729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoReturnAttr *clone(ASTContext &C) const;
4733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoReturn; }
4739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoSanitizeAttr : public InheritableAttr {
4742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned sanitizers_Size;
4743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  StringRef *sanitizers_;
4744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoSanitizeAttr *CreateImplicit(ASTContext &Ctx, StringRef *Sanitizers, unsigned SanitizersSize, SourceRange Loc = SourceRange()) {
4747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoSanitizeAttr(Loc, Ctx, Sanitizers, SanitizersSize, 0);
4748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoSanitizeAttr(SourceRange R, ASTContext &Ctx
4753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , StringRef *Sanitizers, unsigned SanitizersSize
4754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoSanitize, R, SI, false, false)
4757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , sanitizers_Size(SanitizersSize), sanitizers_(new (Ctx, 16) StringRef[sanitizers_Size])
4758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    for (size_t I = 0, E = sanitizers_Size; I != E;
4760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot         ++I) {
4761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      StringRef Ref = Sanitizers[I];
4762f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Ref.empty()) {
4763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        char *Mem = new (Ctx, 1) char[Ref.size()];
4764f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(Mem, Ref.data(), Ref.size());
4765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        sanitizers_[I] = StringRef(Mem, Ref.size());
4766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
4767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
4768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoSanitizeAttr(SourceRange R, ASTContext &Ctx
4771f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoSanitize, R, SI, false, false)
4774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , sanitizers_Size(0), sanitizers_(nullptr)
4775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4778f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoSanitizeAttr *clone(ASTContext &C) const;
4779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef StringRef* sanitizers_iterator;
4783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  sanitizers_iterator sanitizers_begin() const { return sanitizers_; }
4784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  sanitizers_iterator sanitizers_end() const { return sanitizers_ + sanitizers_Size; }
4785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned sanitizers_size() const { return sanitizers_Size; }
4786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<sanitizers_iterator> sanitizers() const { return llvm::make_range(sanitizers_begin(), sanitizers_end()); }
4787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SanitizerMask getMask() const {
4791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      SanitizerMask Mask = 0;
4792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      for (auto SanitizerName : sanitizers()) {
4793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        SanitizerMask ParsedMask =
4794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot            parseSanitizerValue(SanitizerName, /*AllowGroups=*/true);
4795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        Mask |= expandSanitizerGroups(ParsedMask);
4796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
4797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return Mask;
4798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
4799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoSanitize; }
4802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoSplitStackAttr : public InheritableAttr {
4805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoSplitStackAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoSplitStackAttr(Loc, Ctx, 0);
4808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoSplitStackAttr(SourceRange R, ASTContext &Ctx
4813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoSplitStack, R, SI, false, false)
4816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoSplitStackAttr *clone(ASTContext &C) const;
4820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoSplitStack; }
4826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoThreadSafetyAnalysisAttr : public InheritableAttr {
4829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoThreadSafetyAnalysisAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoThreadSafetyAnalysisAttr(Loc, Ctx, 0);
4832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoThreadSafetyAnalysisAttr(SourceRange R, ASTContext &Ctx
4837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoThreadSafetyAnalysis, R, SI, false, false)
4840f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4841f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4842f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4843f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoThreadSafetyAnalysisAttr *clone(ASTContext &C) const;
4844f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4845f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4846f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4847f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4848f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4849f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoThreadSafetyAnalysis; }
4850f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4851f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4852f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NoThrowAttr : public InheritableAttr {
4853f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4854f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NoThrowAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4855f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NoThrowAttr(Loc, Ctx, 0);
4856f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4857f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4858f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4859f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4860f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoThrowAttr(SourceRange R, ASTContext &Ctx
4861f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4862f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4863f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NoThrow, R, SI, false, false)
4864f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4865f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4866f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4867f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NoThrowAttr *clone(ASTContext &C) const;
4868f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4869f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4870f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4871f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4872f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4873f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NoThrow; }
4874f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4875f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4876f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NonNullAttr : public InheritableParamAttr {
4877f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
4878f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned *args_;
4879f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4880f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4881f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NonNullAttr *CreateImplicit(ASTContext &Ctx, unsigned *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
4882f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NonNullAttr(Loc, Ctx, Args, ArgsSize, 0);
4883f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4884f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4885f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4886f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4887f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NonNullAttr(SourceRange R, ASTContext &Ctx
4888f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned *Args, unsigned ArgsSize
4889f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4890f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4891f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableParamAttr(attr::NonNull, R, SI, false, true)
4892f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) unsigned[args_Size])
4893f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4894f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
4895f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4896f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4897f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NonNullAttr(SourceRange R, ASTContext &Ctx
4898f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4899f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4900f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableParamAttr(attr::NonNull, R, SI, false, true)
4901f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
4902f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4903f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4904f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4905f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NonNullAttr *clone(ASTContext &C) const;
4906f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4907f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4908f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4909f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef unsigned* args_iterator;
4910f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
4911f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
4912f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
4913f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
4914f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4915f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4916f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool isNonNull(unsigned idx) const {
4917f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!args_size())
4918f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
4919f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    for (const auto &V : args())
4920f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (V == idx)
4921f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        return true;
4922f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
4923f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4924f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4925f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NonNull; }
4926f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4927f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4928f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass NotTailCalledAttr : public InheritableAttr {
4929f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4930f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static NotTailCalledAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4931f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) NotTailCalledAttr(Loc, Ctx, 0);
4932f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4933f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4934f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4935f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4936f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NotTailCalledAttr(SourceRange R, ASTContext &Ctx
4937f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4938f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4939f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::NotTailCalled, R, SI, false, false)
4940f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4941f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4942f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4943f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  NotTailCalledAttr *clone(ASTContext &C) const;
4944f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4945f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4946f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4947f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4948f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4949f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::NotTailCalled; }
4950f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4951f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4952f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OMPCaptureKindAttr : public Attr {
4953f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned captureKind;
4954f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4955f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4956f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OMPCaptureKindAttr *CreateImplicit(ASTContext &Ctx, unsigned CaptureKind, SourceRange Loc = SourceRange()) {
4957f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OMPCaptureKindAttr(Loc, Ctx, CaptureKind, 0);
4958f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4959f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4960f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4961f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4962f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPCaptureKindAttr(SourceRange R, ASTContext &Ctx
4963f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned CaptureKind
4964f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4965f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4966f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::OMPCaptureKind, R, SI, false, false)
4967f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , captureKind(CaptureKind)
4968f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4969f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4970f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4971f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPCaptureKindAttr *clone(ASTContext &C) const;
4972f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
4973f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
4974f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
4975f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getCaptureKind() const {
4976f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return captureKind;
4977f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4978f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4979f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4980f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4981f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OMPCaptureKind; }
4982f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
4983f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4984f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OMPCaptureNoInitAttr : public InheritableAttr {
4985f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
4986f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OMPCaptureNoInitAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
4987f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OMPCaptureNoInitAttr(Loc, Ctx, 0);
4988f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
4989f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
4990f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4991f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4992f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPCaptureNoInitAttr(SourceRange R, ASTContext &Ctx
4993f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
4994f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
4995f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::OMPCaptureNoInit, R, SI, false, false)
4996f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
4997f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
4998f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
4999f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPCaptureNoInitAttr *clone(ASTContext &C) const;
5000f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5001f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5002f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5003f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5004f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5005f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OMPCaptureNoInit; }
5006f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5007f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5008f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OMPDeclareSimdDeclAttr : public Attr {
5009f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5010f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum BranchStateTy {
5011f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    BS_Undefined,
5012f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    BS_Inbranch,
5013f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    BS_Notinbranch
5014f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
5015f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
5016f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  BranchStateTy branchState;
5017f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5018f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * simdlen;
5019f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5020f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned uniforms_Size;
5021f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *uniforms_;
5022f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5023f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned aligneds_Size;
5024f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *aligneds_;
5025f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5026f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned alignments_Size;
5027f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *alignments_;
5028f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5029f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned linears_Size;
5030f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *linears_;
5031f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5032f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned modifiers_Size;
5033f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned *modifiers_;
5034f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5035f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned steps_Size;
5036f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *steps_;
5037f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5038f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5039f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OMPDeclareSimdDeclAttr *CreateImplicit(ASTContext &Ctx, BranchStateTy BranchState, Expr * Simdlen, Expr * *Uniforms, unsigned UniformsSize, Expr * *Aligneds, unsigned AlignedsSize, Expr * *Alignments, unsigned AlignmentsSize, Expr * *Linears, unsigned LinearsSize, unsigned *Modifiers, unsigned ModifiersSize, Expr * *Steps, unsigned StepsSize, SourceRange Loc = SourceRange()) {
5040f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OMPDeclareSimdDeclAttr(Loc, Ctx, BranchState, Simdlen, Uniforms, UniformsSize, Aligneds, AlignedsSize, Alignments, AlignmentsSize, Linears, LinearsSize, Modifiers, ModifiersSize, Steps, StepsSize, 0);
5041f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5042f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5043f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5044f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5045f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPDeclareSimdDeclAttr(SourceRange R, ASTContext &Ctx
5046f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , BranchStateTy BranchState
5047f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Simdlen
5048f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Uniforms, unsigned UniformsSize
5049f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Aligneds, unsigned AlignedsSize
5050f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Alignments, unsigned AlignmentsSize
5051f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Linears, unsigned LinearsSize
5052f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned *Modifiers, unsigned ModifiersSize
5053f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Steps, unsigned StepsSize
5054f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5055f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5056f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::OMPDeclareSimdDecl, R, SI, false, false)
5057f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , branchState(BranchState)
5058f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , simdlen(Simdlen)
5059f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , uniforms_Size(UniformsSize), uniforms_(new (Ctx, 16) Expr *[uniforms_Size])
5060f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , aligneds_Size(AlignedsSize), aligneds_(new (Ctx, 16) Expr *[aligneds_Size])
5061f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , alignments_Size(AlignmentsSize), alignments_(new (Ctx, 16) Expr *[alignments_Size])
5062f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , linears_Size(LinearsSize), linears_(new (Ctx, 16) Expr *[linears_Size])
5063f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , modifiers_Size(ModifiersSize), modifiers_(new (Ctx, 16) unsigned[modifiers_Size])
5064f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , steps_Size(StepsSize), steps_(new (Ctx, 16) Expr *[steps_Size])
5065f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5066f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Uniforms, Uniforms + uniforms_Size, uniforms_);
5067f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Aligneds, Aligneds + aligneds_Size, aligneds_);
5068f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Alignments, Alignments + alignments_Size, alignments_);
5069f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Linears, Linears + linears_Size, linears_);
5070f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Modifiers, Modifiers + modifiers_Size, modifiers_);
5071f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Steps, Steps + steps_Size, steps_);
5072f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5073f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5074f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPDeclareSimdDeclAttr(SourceRange R, ASTContext &Ctx
5075f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , BranchStateTy BranchState
5076f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Simdlen
5077f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5078f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5079f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::OMPDeclareSimdDecl, R, SI, false, false)
5080f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , branchState(BranchState)
5081f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , simdlen(Simdlen)
5082f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , uniforms_Size(0), uniforms_(nullptr)
5083f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , aligneds_Size(0), aligneds_(nullptr)
5084f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , alignments_Size(0), alignments_(nullptr)
5085f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , linears_Size(0), linears_(nullptr)
5086f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , modifiers_Size(0), modifiers_(nullptr)
5087f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , steps_Size(0), steps_(nullptr)
5088f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5089f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5090f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5091f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPDeclareSimdDeclAttr *clone(ASTContext &C) const;
5092f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5093f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5094f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5095f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  BranchStateTy getBranchState() const {
5096f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return branchState;
5097f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5098f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5099f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToBranchStateTy(StringRef Val, BranchStateTy &Out) {
5100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<BranchStateTy> R = llvm::StringSwitch<Optional<BranchStateTy>>(Val)
5101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("", OMPDeclareSimdDeclAttr::BS_Undefined)
5102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("inbranch", OMPDeclareSimdDeclAttr::BS_Inbranch)
5103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("notinbranch", OMPDeclareSimdDeclAttr::BS_Notinbranch)
5104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<BranchStateTy>());
5105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
5106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
5107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
5108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
5109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
5110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertBranchStateTyToStr(BranchStateTy Val) {
5113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
5114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case OMPDeclareSimdDeclAttr::BS_Undefined: return "";
5115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case OMPDeclareSimdDeclAttr::BS_Inbranch: return "inbranch";
5116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case OMPDeclareSimdDeclAttr::BS_Notinbranch: return "notinbranch";
5117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
5118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
5119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getSimdlen() const {
5121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return simdlen;
5122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** uniforms_iterator;
5125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  uniforms_iterator uniforms_begin() const { return uniforms_; }
5126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  uniforms_iterator uniforms_end() const { return uniforms_ + uniforms_Size; }
5127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned uniforms_size() const { return uniforms_Size; }
5128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<uniforms_iterator> uniforms() const { return llvm::make_range(uniforms_begin(), uniforms_end()); }
5129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** aligneds_iterator;
5132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  aligneds_iterator aligneds_begin() const { return aligneds_; }
5133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  aligneds_iterator aligneds_end() const { return aligneds_ + aligneds_Size; }
5134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned aligneds_size() const { return aligneds_Size; }
5135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<aligneds_iterator> aligneds() const { return llvm::make_range(aligneds_begin(), aligneds_end()); }
5136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** alignments_iterator;
5139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  alignments_iterator alignments_begin() const { return alignments_; }
5140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  alignments_iterator alignments_end() const { return alignments_ + alignments_Size; }
5141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned alignments_size() const { return alignments_Size; }
5142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<alignments_iterator> alignments() const { return llvm::make_range(alignments_begin(), alignments_end()); }
5143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** linears_iterator;
5146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  linears_iterator linears_begin() const { return linears_; }
5147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  linears_iterator linears_end() const { return linears_ + linears_Size; }
5148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned linears_size() const { return linears_Size; }
5149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<linears_iterator> linears() const { return llvm::make_range(linears_begin(), linears_end()); }
5150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef unsigned* modifiers_iterator;
5153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  modifiers_iterator modifiers_begin() const { return modifiers_; }
5154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  modifiers_iterator modifiers_end() const { return modifiers_ + modifiers_Size; }
5155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned modifiers_size() const { return modifiers_Size; }
5156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<modifiers_iterator> modifiers() const { return llvm::make_range(modifiers_begin(), modifiers_end()); }
5157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** steps_iterator;
5160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  steps_iterator steps_begin() const { return steps_; }
5161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  steps_iterator steps_end() const { return steps_ + steps_Size; }
5162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned steps_size() const { return steps_Size; }
5163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<steps_iterator> steps() const { return llvm::make_range(steps_begin(), steps_end()); }
5164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy)
5168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        const {
5169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (getBranchState() != BS_Undefined)
5170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << ConvertBranchStateTyToStr(getBranchState()) << " ";
5171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (auto *E = getSimdlen()) {
5172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << "simdlen(";
5173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        E->printPretty(OS, nullptr, Policy);
5174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << ") ";
5175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
5176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (uniforms_size() > 0) {
5177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << "uniform";
5178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        StringRef Sep = "(";
5179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        for (auto *E : uniforms()) {
5180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          OS << Sep;
5181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          E->printPretty(OS, nullptr, Policy);
5182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          Sep = ", ";
5183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        }
5184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << ") ";
5185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
5186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      alignments_iterator NI = alignments_begin();
5187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      for (auto *E : aligneds()) {
5188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << "aligned(";
5189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        E->printPretty(OS, nullptr, Policy);
5190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        if (*NI) {
5191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          OS << ": ";
5192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          (*NI)->printPretty(OS, nullptr, Policy);
5193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        }
5194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << ") ";
5195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        ++NI;
5196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
5197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      steps_iterator I = steps_begin();
5198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      modifiers_iterator MI = modifiers_begin();
5199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      for (auto *E : linears()) {
5200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << "linear(";
5201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        if (*MI != OMPC_LINEAR_unknown)
5202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          OS << getOpenMPSimpleClauseTypeName(OMPC_linear, *MI) << "(";
5203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        E->printPretty(OS, nullptr, Policy);
5204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        if (*MI != OMPC_LINEAR_unknown)
5205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          OS << ")";
5206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        if (*I) {
5207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          OS << ": ";
5208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          (*I)->printPretty(OS, nullptr, Policy);
5209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        }
5210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << ") ";
5211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        ++I;
5212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        ++MI;
5213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
5214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
5215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OMPDeclareSimdDecl; }
5218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OMPDeclareTargetDeclAttr : public Attr {
5221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum MapTypeTy {
5223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    MT_To,
5224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    MT_Link
5225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
5226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
5227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MapTypeTy mapType;
5228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OMPDeclareTargetDeclAttr *CreateImplicit(ASTContext &Ctx, MapTypeTy MapType, SourceRange Loc = SourceRange()) {
5231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OMPDeclareTargetDeclAttr(Loc, Ctx, MapType, 0);
5232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPDeclareTargetDeclAttr(SourceRange R, ASTContext &Ctx
5237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , MapTypeTy MapType
5238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::OMPDeclareTargetDecl, R, SI, false, false)
5241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , mapType(MapType)
5242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPDeclareTargetDeclAttr *clone(ASTContext &C) const;
5246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MapTypeTy getMapType() const {
5250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return mapType;
5251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToMapTypeTy(StringRef Val, MapTypeTy &Out) {
5254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<MapTypeTy> R = llvm::StringSwitch<Optional<MapTypeTy>>(Val)
5255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("to", OMPDeclareTargetDeclAttr::MT_To)
5256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("link", OMPDeclareTargetDeclAttr::MT_Link)
5257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<MapTypeTy>());
5258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
5259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
5260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
5261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
5262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
5263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertMapTypeTyToStr(MapTypeTy Val) {
5266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
5267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case OMPDeclareTargetDeclAttr::MT_To: return "to";
5268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case OMPDeclareTargetDeclAttr::MT_Link: return "link";
5269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
5270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
5271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
5274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      // Use fake syntax because it is for testing and debugging purpose only.
5275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (getMapType() != MT_To)
5276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        OS << ConvertMapTypeTyToStr(getMapType()) << " ";
5277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
5278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OMPDeclareTargetDecl; }
5281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OMPThreadPrivateDeclAttr : public InheritableAttr {
5284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OMPThreadPrivateDeclAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OMPThreadPrivateDeclAttr(Loc, Ctx, 0);
5287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPThreadPrivateDeclAttr(SourceRange R, ASTContext &Ctx
5292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::OMPThreadPrivateDecl, R, SI, false, false)
5295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OMPThreadPrivateDeclAttr *clone(ASTContext &C) const;
5299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OMPThreadPrivateDecl; }
5305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCBoxableAttr : public Attr {
5308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCBoxableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCBoxableAttr(Loc, Ctx, 0);
5311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCBoxableAttr(SourceRange R, ASTContext &Ctx
5316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::ObjCBoxable, R, SI, false, false)
5319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCBoxableAttr *clone(ASTContext &C) const;
5323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCBoxable; }
5329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCBridgeAttr : public InheritableAttr {
5332f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * bridgedType;
5333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCBridgeAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * BridgedType, SourceRange Loc = SourceRange()) {
5336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCBridgeAttr(Loc, Ctx, BridgedType, 0);
5337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCBridgeAttr(SourceRange R, ASTContext &Ctx
5342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * BridgedType
5343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCBridge, R, SI, false, false)
5346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bridgedType(BridgedType)
5347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCBridgeAttr *clone(ASTContext &C) const;
5351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getBridgedType() const {
5355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return bridgedType;
5356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCBridge; }
5361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCBridgeMutableAttr : public InheritableAttr {
5364f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * bridgedType;
5365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCBridgeMutableAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * BridgedType, SourceRange Loc = SourceRange()) {
5368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCBridgeMutableAttr(Loc, Ctx, BridgedType, 0);
5369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCBridgeMutableAttr(SourceRange R, ASTContext &Ctx
5374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * BridgedType
5375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCBridgeMutable, R, SI, false, false)
5378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bridgedType(BridgedType)
5379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCBridgeMutableAttr *clone(ASTContext &C) const;
5383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getBridgedType() const {
5387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return bridgedType;
5388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCBridgeMutable; }
5393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCBridgeRelatedAttr : public InheritableAttr {
5396f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * relatedClass;
5397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5398f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * classMethod;
5399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5400f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * instanceMethod;
5401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCBridgeRelatedAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * RelatedClass, IdentifierInfo * ClassMethod, IdentifierInfo * InstanceMethod, SourceRange Loc = SourceRange()) {
5404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCBridgeRelatedAttr(Loc, Ctx, RelatedClass, ClassMethod, InstanceMethod, 0);
5405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCBridgeRelatedAttr(SourceRange R, ASTContext &Ctx
5410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * RelatedClass
5411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * ClassMethod
5412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * InstanceMethod
5413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCBridgeRelated, R, SI, false, false)
5416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , relatedClass(RelatedClass)
5417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , classMethod(ClassMethod)
5418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , instanceMethod(InstanceMethod)
5419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCBridgeRelatedAttr(SourceRange R, ASTContext &Ctx
5423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * RelatedClass
5424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCBridgeRelated, R, SI, false, false)
5427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , relatedClass(RelatedClass)
5428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , classMethod()
5429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , instanceMethod()
5430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCBridgeRelatedAttr *clone(ASTContext &C) const;
5434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getRelatedClass() const {
5438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return relatedClass;
5439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getClassMethod() const {
5442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return classMethod;
5443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getInstanceMethod() const {
5446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return instanceMethod;
5447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCBridgeRelated; }
5452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCDesignatedInitializerAttr : public Attr {
5455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCDesignatedInitializerAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCDesignatedInitializerAttr(Loc, Ctx, 0);
5458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCDesignatedInitializerAttr(SourceRange R, ASTContext &Ctx
5463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::ObjCDesignatedInitializer, R, SI, false, false)
5466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCDesignatedInitializerAttr *clone(ASTContext &C) const;
5470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCDesignatedInitializer; }
5476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCExceptionAttr : public InheritableAttr {
5479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCExceptionAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCExceptionAttr(Loc, Ctx, 0);
5482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCExceptionAttr(SourceRange R, ASTContext &Ctx
5487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCException, R, SI, false, false)
5490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCExceptionAttr *clone(ASTContext &C) const;
5494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCException; }
5500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCExplicitProtocolImplAttr : public InheritableAttr {
5503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCExplicitProtocolImplAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCExplicitProtocolImplAttr(Loc, Ctx, 0);
5506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCExplicitProtocolImplAttr(SourceRange R, ASTContext &Ctx
5511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCExplicitProtocolImpl, R, SI, false, false)
5514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCExplicitProtocolImplAttr *clone(ASTContext &C) const;
5518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCExplicitProtocolImpl; }
5524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCIndependentClassAttr : public InheritableAttr {
5527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCIndependentClassAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCIndependentClassAttr(Loc, Ctx, 0);
5530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCIndependentClassAttr(SourceRange R, ASTContext &Ctx
5535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCIndependentClass, R, SI, false, false)
5538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCIndependentClassAttr *clone(ASTContext &C) const;
5542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCIndependentClass; }
5548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCMethodFamilyAttr : public InheritableAttr {
5551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum FamilyKind {
5553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OMF_None,
5554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OMF_alloc,
5555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OMF_copy,
5556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OMF_init,
5557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OMF_mutableCopy,
5558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OMF_new
5559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
5560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
5561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FamilyKind family;
5562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCMethodFamilyAttr *CreateImplicit(ASTContext &Ctx, FamilyKind Family, SourceRange Loc = SourceRange()) {
5565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCMethodFamilyAttr(Loc, Ctx, Family, 0);
5566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCMethodFamilyAttr(SourceRange R, ASTContext &Ctx
5571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , FamilyKind Family
5572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCMethodFamily, R, SI, false, false)
5575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , family(Family)
5576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCMethodFamilyAttr *clone(ASTContext &C) const;
5580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  FamilyKind getFamily() const {
5584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return family;
5585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToFamilyKind(StringRef Val, FamilyKind &Out) {
5588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<FamilyKind> R = llvm::StringSwitch<Optional<FamilyKind>>(Val)
5589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("none", ObjCMethodFamilyAttr::OMF_None)
5590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("alloc", ObjCMethodFamilyAttr::OMF_alloc)
5591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("copy", ObjCMethodFamilyAttr::OMF_copy)
5592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("init", ObjCMethodFamilyAttr::OMF_init)
5593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("mutableCopy", ObjCMethodFamilyAttr::OMF_mutableCopy)
5594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("new", ObjCMethodFamilyAttr::OMF_new)
5595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<FamilyKind>());
5596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
5597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
5598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
5599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
5600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
5601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertFamilyKindToStr(FamilyKind Val) {
5604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
5605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ObjCMethodFamilyAttr::OMF_None: return "none";
5606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ObjCMethodFamilyAttr::OMF_alloc: return "alloc";
5607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ObjCMethodFamilyAttr::OMF_copy: return "copy";
5608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ObjCMethodFamilyAttr::OMF_init: return "init";
5609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ObjCMethodFamilyAttr::OMF_mutableCopy: return "mutableCopy";
5610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ObjCMethodFamilyAttr::OMF_new: return "new";
5611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
5612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
5613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCMethodFamily; }
5617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCNSObjectAttr : public InheritableAttr {
5620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCNSObjectAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCNSObjectAttr(Loc, Ctx, 0);
5623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCNSObjectAttr(SourceRange R, ASTContext &Ctx
5628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCNSObject, R, SI, false, false)
5631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCNSObjectAttr *clone(ASTContext &C) const;
5635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCNSObject; }
5641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCPreciseLifetimeAttr : public InheritableAttr {
5644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCPreciseLifetimeAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCPreciseLifetimeAttr(Loc, Ctx, 0);
5647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCPreciseLifetimeAttr(SourceRange R, ASTContext &Ctx
5652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCPreciseLifetime, R, SI, false, false)
5655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCPreciseLifetimeAttr *clone(ASTContext &C) const;
5659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCPreciseLifetime; }
5665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCRequiresPropertyDefsAttr : public InheritableAttr {
5668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCRequiresPropertyDefsAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCRequiresPropertyDefsAttr(Loc, Ctx, 0);
5671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRequiresPropertyDefsAttr(SourceRange R, ASTContext &Ctx
5676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCRequiresPropertyDefs, R, SI, false, false)
5679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRequiresPropertyDefsAttr *clone(ASTContext &C) const;
5683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCRequiresPropertyDefs; }
5689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCRequiresSuperAttr : public InheritableAttr {
5692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCRequiresSuperAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCRequiresSuperAttr(Loc, Ctx, 0);
5695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRequiresSuperAttr(SourceRange R, ASTContext &Ctx
5700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCRequiresSuper, R, SI, false, false)
5703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRequiresSuperAttr *clone(ASTContext &C) const;
5707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCRequiresSuper; }
5713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCReturnsInnerPointerAttr : public InheritableAttr {
5716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCReturnsInnerPointerAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCReturnsInnerPointerAttr(Loc, Ctx, 0);
5719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCReturnsInnerPointerAttr(SourceRange R, ASTContext &Ctx
5724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCReturnsInnerPointer, R, SI, false, false)
5727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCReturnsInnerPointerAttr *clone(ASTContext &C) const;
5731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCReturnsInnerPointer; }
5737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCRootClassAttr : public InheritableAttr {
5740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCRootClassAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCRootClassAttr(Loc, Ctx, 0);
5743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRootClassAttr(SourceRange R, ASTContext &Ctx
5748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCRootClass, R, SI, false, false)
5751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRootClassAttr *clone(ASTContext &C) const;
5755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCRootClass; }
5761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5762f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCRuntimeNameAttr : public Attr {
5764f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned metadataNameLength;
5765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *metadataName;
5766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCRuntimeNameAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef MetadataName, SourceRange Loc = SourceRange()) {
5769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCRuntimeNameAttr(Loc, Ctx, MetadataName, 0);
5770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5771f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRuntimeNameAttr(SourceRange R, ASTContext &Ctx
5775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef MetadataName
5776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5778f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::ObjCRuntimeName, R, SI, false, false)
5779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , metadataNameLength(MetadataName.size()),metadataName(new (Ctx, 1) char[metadataNameLength])
5780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!MetadataName.empty())
5782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(metadataName, MetadataName.data(), metadataNameLength);
5783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRuntimeNameAttr *clone(ASTContext &C) const;
5786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getMetadataName() const {
5790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(metadataName, metadataNameLength);
5791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMetadataNameLength() const {
5793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return metadataNameLength;
5794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setMetadataName(ASTContext &C, llvm::StringRef S) {
5796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    metadataNameLength = S.size();
5797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->metadataName = new (C, 1) char [metadataNameLength];
5798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
5799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->metadataName, S.data(), metadataNameLength);
5800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCRuntimeName; }
5805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCRuntimeVisibleAttr : public Attr {
5808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCRuntimeVisibleAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCRuntimeVisibleAttr(Loc, Ctx, 0);
5811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRuntimeVisibleAttr(SourceRange R, ASTContext &Ctx
5816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::ObjCRuntimeVisible, R, SI, false, false)
5819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCRuntimeVisibleAttr *clone(ASTContext &C) const;
5823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCRuntimeVisible; }
5829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ObjCSubclassingRestrictedAttr : public InheritableAttr {
5832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ObjCSubclassingRestrictedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ObjCSubclassingRestrictedAttr(Loc, Ctx, 0);
5835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCSubclassingRestrictedAttr(SourceRange R, ASTContext &Ctx
5840f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5841f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5842f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ObjCSubclassingRestricted, R, SI, false, false)
5843f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5844f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5845f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5846f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ObjCSubclassingRestrictedAttr *clone(ASTContext &C) const;
5847f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5848f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5849f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5850f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5851f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5852f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ObjCSubclassingRestricted; }
5853f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5854f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5855f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OpenCLAccessAttr : public Attr {
5856f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5857f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
5858f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_read_only = 0,
5859f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_write_only = 2,
5860f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Keyword_read_write = 4
5861f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
5862f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5863f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OpenCLAccessAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
5864f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OpenCLAccessAttr(Loc, Ctx, S);
5865f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5866f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5867f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5868f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5869f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OpenCLAccessAttr(SourceRange R, ASTContext &Ctx
5870f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5871f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5872f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::OpenCLAccess, R, SI, false, false)
5873f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5874f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5875f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5876f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OpenCLAccessAttr *clone(ASTContext &C) const;
5877f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5878f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5879f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5880f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
5881f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
5882f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
5883f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return Keyword_read_only;
5884f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return Keyword_read_only;
5885f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return Keyword_write_only;
5886f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return Keyword_write_only;
5887f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 4: return Keyword_read_write;
5888f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 5: return Keyword_read_write;
5889f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5890f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5891f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isReadOnly() const { return SpellingListIndex == 0 ||
5892f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 1; }
5893f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isReadWrite() const { return SpellingListIndex == 4 ||
5894f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 5; }
5895f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isWriteOnly() const { return SpellingListIndex == 2 ||
5896f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 3; }
5897f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5898f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5899f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OpenCLAccess; }
5900f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5901f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5902f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OpenCLIntelReqdSubGroupSizeAttr : public InheritableAttr {
5903f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned subGroupSize;
5904f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5905f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5906f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OpenCLIntelReqdSubGroupSizeAttr *CreateImplicit(ASTContext &Ctx, unsigned SubGroupSize, SourceRange Loc = SourceRange()) {
5907f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OpenCLIntelReqdSubGroupSizeAttr(Loc, Ctx, SubGroupSize, 0);
5908f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5909f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5910f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5911f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5912f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OpenCLIntelReqdSubGroupSizeAttr(SourceRange R, ASTContext &Ctx
5913f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SubGroupSize
5914f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5915f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5916f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::OpenCLIntelReqdSubGroupSize, R, SI, false, false)
5917f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , subGroupSize(SubGroupSize)
5918f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5919f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5920f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5921f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OpenCLIntelReqdSubGroupSizeAttr *clone(ASTContext &C) const;
5922f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5923f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5924f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5925f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getSubGroupSize() const {
5926f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return subGroupSize;
5927f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5928f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5929f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5930f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5931f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OpenCLIntelReqdSubGroupSize; }
5932f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5933f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5934f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OpenCLKernelAttr : public InheritableAttr {
5935f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5936f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OpenCLKernelAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5937f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OpenCLKernelAttr(Loc, Ctx, 0);
5938f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5939f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5940f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5941f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5942f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OpenCLKernelAttr(SourceRange R, ASTContext &Ctx
5943f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5944f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5945f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::OpenCLKernel, R, SI, false, false)
5946f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5947f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5948f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5949f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OpenCLKernelAttr *clone(ASTContext &C) const;
5950f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5951f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5952f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5953f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5954f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5955f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OpenCLKernel; }
5956f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5957f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5958f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OpenCLUnrollHintAttr : public InheritableAttr {
5959f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned unrollHint;
5960f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5961f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5962f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OpenCLUnrollHintAttr *CreateImplicit(ASTContext &Ctx, unsigned UnrollHint, SourceRange Loc = SourceRange()) {
5963f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OpenCLUnrollHintAttr(Loc, Ctx, UnrollHint, 0);
5964f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5965f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5966f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5967f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5968f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OpenCLUnrollHintAttr(SourceRange R, ASTContext &Ctx
5969f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned UnrollHint
5970f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
5971f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
5972f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::OpenCLUnrollHint, R, SI, false, false)
5973f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unrollHint(UnrollHint)
5974f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
5975f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5976f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5977f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OpenCLUnrollHintAttr *clone(ASTContext &C) const;
5978f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
5979f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
5980f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
5981f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getUnrollHint() const {
5982f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return unrollHint;
5983f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5984f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5985f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5986f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5987f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OpenCLUnrollHint; }
5988f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
5989f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5990f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OptimizeNoneAttr : public InheritableAttr {
5991f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
5992f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OptimizeNoneAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
5993f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OptimizeNoneAttr(Loc, Ctx, 0);
5994f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
5995f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
5996f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
5997f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
5998f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OptimizeNoneAttr(SourceRange R, ASTContext &Ctx
5999f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6000f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6001f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::OptimizeNone, R, SI, false, false)
6002f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6003f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6004f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6005f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OptimizeNoneAttr *clone(ASTContext &C) const;
6006f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6007f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6008f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6009f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6010f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6011f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::OptimizeNone; }
6012f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6013f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6014f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OverloadableAttr : public Attr {
6015f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6016f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OverloadableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6017f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OverloadableAttr(Loc, Ctx, 0);
6018f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6019f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6020f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6021f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6022f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OverloadableAttr(SourceRange R, ASTContext &Ctx
6023f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6024f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6025f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::Overloadable, R, SI, false, false)
6026f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6027f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6028f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6029f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OverloadableAttr *clone(ASTContext &C) const;
6030f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6031f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6032f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6033f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6034f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6035f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Overloadable; }
6036f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6037f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6038f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OverrideAttr : public InheritableAttr {
6039f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6040f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OverrideAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6041f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OverrideAttr(Loc, Ctx, 0);
6042f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6043f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6044f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6045f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6046f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OverrideAttr(SourceRange R, ASTContext &Ctx
6047f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6048f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6049f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Override, R, SI, false, false)
6050f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6051f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6052f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6053f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OverrideAttr *clone(ASTContext &C) const;
6054f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6055f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6056f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6057f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6058f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6059f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Override; }
6060f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6061f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6062f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass OwnershipAttr : public InheritableAttr {
6063f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * module;
6064f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6065f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
6066f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned *args_;
6067f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6068f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6069f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
6070f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_ownership_holds = 0,
6071f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_ownership_returns = 1,
6072f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_ownership_takes = 2
6073f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
6074f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6075f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static OwnershipAttr *CreateImplicit(ASTContext &Ctx, Spelling S, IdentifierInfo * Module, unsigned *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
6076f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) OwnershipAttr(Loc, Ctx, Module, Args, ArgsSize, S);
6077f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6078f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6079f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6080f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6081f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OwnershipAttr(SourceRange R, ASTContext &Ctx
6082f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * Module
6083f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned *Args, unsigned ArgsSize
6084f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6085f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6086f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Ownership, R, SI, false, false)
6087f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , module(Module)
6088f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) unsigned[args_Size])
6089f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6090f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
6091f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6092f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6093f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OwnershipAttr(SourceRange R, ASTContext &Ctx
6094f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * Module
6095f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6096f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6097f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Ownership, R, SI, false, false)
6098f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , module(Module)
6099f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
6100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  OwnershipAttr *clone(ASTContext &C) const;
6104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
6108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
6109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
6110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_ownership_holds;
6111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return GNU_ownership_returns;
6112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_ownership_takes;
6113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isHolds() const { return SpellingListIndex == 0; }
6116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isReturns() const { return SpellingListIndex == 1; }
6117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isTakes() const { return SpellingListIndex == 2; }
6118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getModule() const {
6119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return module;
6120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef unsigned* args_iterator;
6123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
6124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
6125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
6126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
6127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    enum OwnershipKind { Holds, Returns, Takes };
6131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    OwnershipKind getOwnKind() const {
6132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return isHolds() ? Holds :
6133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             isTakes() ? Takes :
6134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             Returns;
6135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
6136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Ownership; }
6139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PackedAttr : public InheritableAttr {
6142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PackedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PackedAttr(Loc, Ctx, 0);
6145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PackedAttr(SourceRange R, ASTContext &Ctx
6150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Packed, R, SI, false, false)
6153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PackedAttr *clone(ASTContext &C) const;
6157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Packed; }
6163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ParamTypestateAttr : public InheritableAttr {
6166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum ConsumedState {
6168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unknown,
6169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Consumed,
6170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unconsumed
6171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
6172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
6173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState paramState;
6174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ParamTypestateAttr *CreateImplicit(ASTContext &Ctx, ConsumedState ParamState, SourceRange Loc = SourceRange()) {
6177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ParamTypestateAttr(Loc, Ctx, ParamState, 0);
6178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ParamTypestateAttr(SourceRange R, ASTContext &Ctx
6183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , ConsumedState ParamState
6184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ParamTypestate, R, SI, false, false)
6187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , paramState(ParamState)
6188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ParamTypestateAttr *clone(ASTContext &C) const;
6192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState getParamState() const {
6196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return paramState;
6197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
6200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
6201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unknown", ParamTypestateAttr::Unknown)
6202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("consumed", ParamTypestateAttr::Consumed)
6203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unconsumed", ParamTypestateAttr::Unconsumed)
6204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<ConsumedState>());
6205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
6206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
6207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
6208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
6209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
6210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertConsumedStateToStr(ConsumedState Val) {
6213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
6214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ParamTypestateAttr::Unknown: return "unknown";
6215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ParamTypestateAttr::Consumed: return "consumed";
6216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ParamTypestateAttr::Unconsumed: return "unconsumed";
6217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
6218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
6219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ParamTypestate; }
6223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PascalAttr : public InheritableAttr {
6226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PascalAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PascalAttr(Loc, Ctx, 0);
6229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PascalAttr(SourceRange R, ASTContext &Ctx
6234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Pascal, R, SI, false, false)
6237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PascalAttr *clone(ASTContext &C) const;
6241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Pascal; }
6247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PassObjectSizeAttr : public InheritableParamAttr {
6250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint type;
6251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PassObjectSizeAttr *CreateImplicit(ASTContext &Ctx, int Type, SourceRange Loc = SourceRange()) {
6254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PassObjectSizeAttr(Loc, Ctx, Type, 0);
6255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PassObjectSizeAttr(SourceRange R, ASTContext &Ctx
6260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int Type
6261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableParamAttr(attr::PassObjectSize, R, SI, false, false)
6264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , type(Type)
6265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PassObjectSizeAttr *clone(ASTContext &C) const;
6269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getType() const {
6273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return type;
6274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::PassObjectSize; }
6279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PcsAttr : public InheritableAttr {
6282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum PCSType {
6284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    AAPCS,
6285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    AAPCS_VFP
6286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
6287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
6288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PCSType pCS;
6289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PcsAttr *CreateImplicit(ASTContext &Ctx, PCSType PCS, SourceRange Loc = SourceRange()) {
6292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PcsAttr(Loc, Ctx, PCS, 0);
6293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PcsAttr(SourceRange R, ASTContext &Ctx
6298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , PCSType PCS
6299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Pcs, R, SI, false, false)
6302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , pCS(PCS)
6303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PcsAttr *clone(ASTContext &C) const;
6307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PCSType getPCS() const {
6311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return pCS;
6312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToPCSType(StringRef Val, PCSType &Out) {
6315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<PCSType> R = llvm::StringSwitch<Optional<PCSType>>(Val)
6316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("aapcs", PcsAttr::AAPCS)
6317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("aapcs-vfp", PcsAttr::AAPCS_VFP)
6318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<PCSType>());
6319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
6320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
6321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
6322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
6323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
6324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertPCSTypeToStr(PCSType Val) {
6327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
6328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case PcsAttr::AAPCS: return "aapcs";
6329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case PcsAttr::AAPCS_VFP: return "aapcs-vfp";
6330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
6331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
6332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Pcs; }
6336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PragmaClangBSSSectionAttr : public InheritableAttr {
6339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned nameLength;
6340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *name;
6341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PragmaClangBSSSectionAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Loc = SourceRange()) {
6344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PragmaClangBSSSectionAttr(Loc, Ctx, Name, 0);
6345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PragmaClangBSSSectionAttr(SourceRange R, ASTContext &Ctx
6350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Name
6351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::PragmaClangBSSSection, R, SI, false, false)
6354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
6355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Name.empty())
6357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(name, Name.data(), nameLength);
6358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PragmaClangBSSSectionAttr *clone(ASTContext &C) const;
6361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getName() const {
6365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(name, nameLength);
6366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getNameLength() const {
6368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return nameLength;
6369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setName(ASTContext &C, llvm::StringRef S) {
6371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    nameLength = S.size();
6372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->name = new (C, 1) char [nameLength];
6373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
6374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->name, S.data(), nameLength);
6375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::PragmaClangBSSSection; }
6380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PragmaClangDataSectionAttr : public InheritableAttr {
6383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned nameLength;
6384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *name;
6385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PragmaClangDataSectionAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Loc = SourceRange()) {
6388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PragmaClangDataSectionAttr(Loc, Ctx, Name, 0);
6389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PragmaClangDataSectionAttr(SourceRange R, ASTContext &Ctx
6394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Name
6395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::PragmaClangDataSection, R, SI, false, false)
6398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
6399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Name.empty())
6401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(name, Name.data(), nameLength);
6402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PragmaClangDataSectionAttr *clone(ASTContext &C) const;
6405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getName() const {
6409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(name, nameLength);
6410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getNameLength() const {
6412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return nameLength;
6413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setName(ASTContext &C, llvm::StringRef S) {
6415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    nameLength = S.size();
6416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->name = new (C, 1) char [nameLength];
6417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
6418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->name, S.data(), nameLength);
6419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::PragmaClangDataSection; }
6424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PragmaClangRodataSectionAttr : public InheritableAttr {
6427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned nameLength;
6428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *name;
6429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PragmaClangRodataSectionAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Loc = SourceRange()) {
6432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PragmaClangRodataSectionAttr(Loc, Ctx, Name, 0);
6433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PragmaClangRodataSectionAttr(SourceRange R, ASTContext &Ctx
6438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Name
6439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::PragmaClangRodataSection, R, SI, false, false)
6442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
6443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Name.empty())
6445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(name, Name.data(), nameLength);
6446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PragmaClangRodataSectionAttr *clone(ASTContext &C) const;
6449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getName() const {
6453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(name, nameLength);
6454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getNameLength() const {
6456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return nameLength;
6457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setName(ASTContext &C, llvm::StringRef S) {
6459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    nameLength = S.size();
6460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->name = new (C, 1) char [nameLength];
6461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
6462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->name, S.data(), nameLength);
6463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::PragmaClangRodataSection; }
6468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PragmaClangTextSectionAttr : public InheritableAttr {
6471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned nameLength;
6472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *name;
6473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PragmaClangTextSectionAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Name, SourceRange Loc = SourceRange()) {
6476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PragmaClangTextSectionAttr(Loc, Ctx, Name, 0);
6477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PragmaClangTextSectionAttr(SourceRange R, ASTContext &Ctx
6482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Name
6483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::PragmaClangTextSection, R, SI, false, false)
6486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
6487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Name.empty())
6489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(name, Name.data(), nameLength);
6490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PragmaClangTextSectionAttr *clone(ASTContext &C) const;
6493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getName() const {
6497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(name, nameLength);
6498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getNameLength() const {
6500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return nameLength;
6501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setName(ASTContext &C, llvm::StringRef S) {
6503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    nameLength = S.size();
6504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->name = new (C, 1) char [nameLength];
6505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
6506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->name, S.data(), nameLength);
6507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::PragmaClangTextSection; }
6512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PreserveAllAttr : public InheritableAttr {
6515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PreserveAllAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PreserveAllAttr(Loc, Ctx, 0);
6518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PreserveAllAttr(SourceRange R, ASTContext &Ctx
6523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::PreserveAll, R, SI, false, false)
6526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PreserveAllAttr *clone(ASTContext &C) const;
6530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::PreserveAll; }
6536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PreserveMostAttr : public InheritableAttr {
6539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PreserveMostAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PreserveMostAttr(Loc, Ctx, 0);
6542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PreserveMostAttr(SourceRange R, ASTContext &Ctx
6547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::PreserveMost, R, SI, false, false)
6550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PreserveMostAttr *clone(ASTContext &C) const;
6554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::PreserveMost; }
6560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PtGuardedByAttr : public InheritableAttr {
6563f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * arg;
6564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PtGuardedByAttr *CreateImplicit(ASTContext &Ctx, Expr * Arg, SourceRange Loc = SourceRange()) {
6567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PtGuardedByAttr(Loc, Ctx, Arg, 0);
6568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PtGuardedByAttr(SourceRange R, ASTContext &Ctx
6573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * Arg
6574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::PtGuardedBy, R, SI, true, true)
6577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , arg(Arg)
6578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PtGuardedByAttr *clone(ASTContext &C) const;
6582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getArg() const {
6586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return arg;
6587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::PtGuardedBy; }
6592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PtGuardedVarAttr : public InheritableAttr {
6595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PtGuardedVarAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PtGuardedVarAttr(Loc, Ctx, 0);
6598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PtGuardedVarAttr(SourceRange R, ASTContext &Ctx
6603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::PtGuardedVar, R, SI, false, false)
6606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PtGuardedVarAttr *clone(ASTContext &C) const;
6610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::PtGuardedVar; }
6616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass PureAttr : public InheritableAttr {
6619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static PureAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) PureAttr(Loc, Ctx, 0);
6622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PureAttr(SourceRange R, ASTContext &Ctx
6627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Pure, R, SI, false, false)
6630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PureAttr *clone(ASTContext &C) const;
6634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Pure; }
6640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass RegCallAttr : public InheritableAttr {
6643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static RegCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) RegCallAttr(Loc, Ctx, 0);
6646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RegCallAttr(SourceRange R, ASTContext &Ctx
6651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::RegCall, R, SI, false, false)
6654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RegCallAttr *clone(ASTContext &C) const;
6658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::RegCall; }
6664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ReleaseCapabilityAttr : public InheritableAttr {
6667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
6668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
6669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
6672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_release_capability = 0,
6673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_release_capability = 1,
6674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_release_shared_capability = 2,
6675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_release_shared_capability = 3,
6676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_release_generic_capability = 4,
6677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_release_generic_capability = 5,
6678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_unlock_function = 6
6679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
6680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ReleaseCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
6682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ReleaseCapabilityAttr(Loc, Ctx, Args, ArgsSize, S);
6683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReleaseCapabilityAttr(SourceRange R, ASTContext &Ctx
6688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
6689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ReleaseCapability, R, SI, true, true)
6692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
6693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
6695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReleaseCapabilityAttr(SourceRange R, ASTContext &Ctx
6698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ReleaseCapability, R, SI, true, true)
6701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
6702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReleaseCapabilityAttr *clone(ASTContext &C) const;
6706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
6710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
6711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
6712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_release_capability;
6713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_clang_release_capability;
6714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_release_shared_capability;
6715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return CXX11_clang_release_shared_capability;
6716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 4: return GNU_release_generic_capability;
6717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 5: return CXX11_clang_release_generic_capability;
6718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 6: return GNU_unlock_function;
6719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isShared() const { return SpellingListIndex == 2 ||
6722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 3; }
6723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isGeneric() const { return SpellingListIndex == 4 ||
6724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 5 ||
6725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 6; }
6726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
6727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
6728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
6729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
6730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
6731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ReleaseCapability; }
6736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass RenderScriptKernelAttr : public Attr {
6739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static RenderScriptKernelAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) RenderScriptKernelAttr(Loc, Ctx, 0);
6742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RenderScriptKernelAttr(SourceRange R, ASTContext &Ctx
6747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::RenderScriptKernel, R, SI, false, false)
6750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RenderScriptKernelAttr *clone(ASTContext &C) const;
6754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::RenderScriptKernel; }
6760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6762f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ReqdWorkGroupSizeAttr : public InheritableAttr {
6763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned xDim;
6764f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned yDim;
6766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned zDim;
6768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ReqdWorkGroupSizeAttr *CreateImplicit(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, SourceRange Loc = SourceRange()) {
6771f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ReqdWorkGroupSizeAttr(Loc, Ctx, XDim, YDim, ZDim, 0);
6772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReqdWorkGroupSizeAttr(SourceRange R, ASTContext &Ctx
6777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned XDim
6778f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned YDim
6779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned ZDim
6780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ReqdWorkGroupSize, R, SI, false, false)
6783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , xDim(XDim)
6784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , yDim(YDim)
6785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , zDim(ZDim)
6786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReqdWorkGroupSizeAttr *clone(ASTContext &C) const;
6790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getXDim() const {
6794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return xDim;
6795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getYDim() const {
6798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return yDim;
6799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getZDim() const {
6802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return zDim;
6803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ReqdWorkGroupSize; }
6808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass RequireConstantInitAttr : public InheritableAttr {
6811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static RequireConstantInitAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
6813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) RequireConstantInitAttr(Loc, Ctx, 0);
6814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RequireConstantInitAttr(SourceRange R, ASTContext &Ctx
6819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::RequireConstantInit, R, SI, false, false)
6822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RequireConstantInitAttr *clone(ASTContext &C) const;
6826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::RequireConstantInit; }
6832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass RequiresCapabilityAttr : public InheritableAttr {
6835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
6836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
6837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
6840f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_requires_capability = 0,
6841f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_requires_capability = 1,
6842f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_exclusive_locks_required = 2,
6843f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_requires_shared_capability = 3,
6844f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_requires_shared_capability = 4,
6845f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_shared_locks_required = 5
6846f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
6847f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6848f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static RequiresCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
6849f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) RequiresCapabilityAttr(Loc, Ctx, Args, ArgsSize, S);
6850f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6851f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6852f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6853f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6854f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RequiresCapabilityAttr(SourceRange R, ASTContext &Ctx
6855f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
6856f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6857f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6858f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::RequiresCapability, R, SI, true, true)
6859f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
6860f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6861f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
6862f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6863f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6864f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RequiresCapabilityAttr(SourceRange R, ASTContext &Ctx
6865f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6866f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6867f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::RequiresCapability, R, SI, true, true)
6868f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
6869f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6870f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6871f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6872f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RequiresCapabilityAttr *clone(ASTContext &C) const;
6873f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6874f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6875f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6876f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
6877f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
6878f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
6879f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_requires_capability;
6880f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_clang_requires_capability;
6881f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_exclusive_locks_required;
6882f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return GNU_requires_shared_capability;
6883f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 4: return CXX11_clang_requires_shared_capability;
6884f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 5: return GNU_shared_locks_required;
6885f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6886f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6887f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isShared() const { return SpellingListIndex == 3 ||
6888f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 5 ||
6889f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 4; }
6890f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
6891f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
6892f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
6893f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
6894f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
6895f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6896f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6897f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6898f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6899f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::RequiresCapability; }
6900f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6901f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6902f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass RestrictAttr : public InheritableAttr {
6903f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6904f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
6905f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Declspec_restrict = 0,
6906f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_malloc = 1,
6907f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_malloc = 2
6908f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
6909f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6910f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static RestrictAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
6911f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) RestrictAttr(Loc, Ctx, S);
6912f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6913f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6914f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6915f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6916f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RestrictAttr(SourceRange R, ASTContext &Ctx
6917f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6918f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6919f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Restrict, R, SI, false, false)
6920f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6921f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6922f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6923f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  RestrictAttr *clone(ASTContext &C) const;
6924f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6925f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6926f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6927f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
6928f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
6929f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
6930f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return Declspec_restrict;
6931f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return GNU_malloc;
6932f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return CXX11_gnu_malloc;
6933f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6934f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6935f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6936f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6937f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Restrict; }
6938f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6939f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6940f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ReturnTypestateAttr : public InheritableAttr {
6941f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6942f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum ConsumedState {
6943f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unknown,
6944f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Consumed,
6945f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unconsumed
6946f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
6947f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
6948f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState state;
6949f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6950f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
6951f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ReturnTypestateAttr *CreateImplicit(ASTContext &Ctx, ConsumedState State, SourceRange Loc = SourceRange()) {
6952f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ReturnTypestateAttr(Loc, Ctx, State, 0);
6953f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
6954f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
6955f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6956f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6957f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReturnTypestateAttr(SourceRange R, ASTContext &Ctx
6958f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , ConsumedState State
6959f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
6960f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
6961f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ReturnTypestate, R, SI, false, false)
6962f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , state(State)
6963f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
6964f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6965f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6966f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReturnTypestateAttr *clone(ASTContext &C) const;
6967f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
6968f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
6969f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
6970f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState getState() const {
6971f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return state;
6972f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6973f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6974f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
6975f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
6976f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unknown", ReturnTypestateAttr::Unknown)
6977f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("consumed", ReturnTypestateAttr::Consumed)
6978f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unconsumed", ReturnTypestateAttr::Unconsumed)
6979f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<ConsumedState>());
6980f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
6981f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
6982f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
6983f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
6984f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
6985f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6986f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6987f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertConsumedStateToStr(ConsumedState Val) {
6988f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
6989f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ReturnTypestateAttr::Unknown: return "unknown";
6990f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ReturnTypestateAttr::Consumed: return "consumed";
6991f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case ReturnTypestateAttr::Unconsumed: return "unconsumed";
6992f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
6993f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
6994f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
6995f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6996f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
6997f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ReturnTypestate; }
6998f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
6999f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7000f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ReturnsNonNullAttr : public InheritableAttr {
7001f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7002f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ReturnsNonNullAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7003f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ReturnsNonNullAttr(Loc, Ctx, 0);
7004f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7005f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7006f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7007f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7008f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReturnsNonNullAttr(SourceRange R, ASTContext &Ctx
7009f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7010f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7011f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ReturnsNonNull, R, SI, false, false)
7012f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7013f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7014f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7015f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReturnsNonNullAttr *clone(ASTContext &C) const;
7016f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7017f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7018f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7019f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7020f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7021f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ReturnsNonNull; }
7022f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7023f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7024f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ReturnsTwiceAttr : public InheritableAttr {
7025f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7026f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ReturnsTwiceAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7027f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ReturnsTwiceAttr(Loc, Ctx, 0);
7028f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7029f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7030f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7031f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7032f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReturnsTwiceAttr(SourceRange R, ASTContext &Ctx
7033f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7034f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7035f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ReturnsTwice, R, SI, false, false)
7036f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7037f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7038f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7039f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ReturnsTwiceAttr *clone(ASTContext &C) const;
7040f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7041f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7042f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7043f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7044f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7045f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ReturnsTwice; }
7046f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7047f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7048f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ScopedLockableAttr : public InheritableAttr {
7049f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7050f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ScopedLockableAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7051f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ScopedLockableAttr(Loc, Ctx, 0);
7052f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7053f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7054f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7055f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7056f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ScopedLockableAttr(SourceRange R, ASTContext &Ctx
7057f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7058f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7059f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ScopedLockable, R, SI, false, false)
7060f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7061f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7062f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7063f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ScopedLockableAttr *clone(ASTContext &C) const;
7064f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7065f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7066f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7067f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7068f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7069f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ScopedLockable; }
7070f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7071f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7072f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SectionAttr : public InheritableAttr {
7073f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned nameLength;
7074f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *name;
7075f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7076f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7077f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
7078f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_section = 0,
7079f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_section = 1,
7080f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Declspec_allocate = 2
7081f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
7082f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7083f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SectionAttr *CreateImplicit(ASTContext &Ctx, Spelling S, llvm::StringRef Name, SourceRange Loc = SourceRange()) {
7084f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SectionAttr(Loc, Ctx, Name, S);
7085f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7086f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7087f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7088f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7089f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SectionAttr(SourceRange R, ASTContext &Ctx
7090f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Name
7091f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7092f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7093f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Section, R, SI, false, false)
7094f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , nameLength(Name.size()),name(new (Ctx, 1) char[nameLength])
7095f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7096f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Name.empty())
7097f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(name, Name.data(), nameLength);
7098f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7099f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SectionAttr *clone(ASTContext &C) const;
7101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
7105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
7106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
7107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_section;
7108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_gnu_section;
7109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return Declspec_allocate;
7110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getName() const {
7113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(name, nameLength);
7114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getNameLength() const {
7116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return nameLength;
7117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setName(ASTContext &C, llvm::StringRef S) {
7119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    nameLength = S.size();
7120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->name = new (C, 1) char [nameLength];
7121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
7122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->name, S.data(), nameLength);
7123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Section; }
7128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SelectAnyAttr : public InheritableAttr {
7131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SelectAnyAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SelectAnyAttr(Loc, Ctx, 0);
7134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SelectAnyAttr(SourceRange R, ASTContext &Ctx
7139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::SelectAny, R, SI, false, false)
7142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SelectAnyAttr *clone(ASTContext &C) const;
7146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::SelectAny; }
7152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SentinelAttr : public InheritableAttr {
7155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint sentinel;
7156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotint nullPos;
7158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SentinelAttr *CreateImplicit(ASTContext &Ctx, int Sentinel, int NullPos, SourceRange Loc = SourceRange()) {
7161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SentinelAttr(Loc, Ctx, Sentinel, NullPos, 0);
7162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SentinelAttr(SourceRange R, ASTContext &Ctx
7167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int Sentinel
7168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , int NullPos
7169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Sentinel, R, SI, false, false)
7172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , sentinel(Sentinel)
7173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , nullPos(NullPos)
7174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SentinelAttr(SourceRange R, ASTContext &Ctx
7178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Sentinel, R, SI, false, false)
7181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , sentinel()
7182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , nullPos()
7183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SentinelAttr *clone(ASTContext &C) const;
7187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getSentinel() const {
7191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return sentinel;
7192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const int DefaultSentinel = 0;
7195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  int getNullPos() const {
7197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return nullPos;
7198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const int DefaultNullPos = 0;
7201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Sentinel; }
7205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SetTypestateAttr : public InheritableAttr {
7208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum ConsumedState {
7210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unknown,
7211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Consumed,
7212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unconsumed
7213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
7214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
7215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState newState;
7216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SetTypestateAttr *CreateImplicit(ASTContext &Ctx, ConsumedState NewState, SourceRange Loc = SourceRange()) {
7219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SetTypestateAttr(Loc, Ctx, NewState, 0);
7220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SetTypestateAttr(SourceRange R, ASTContext &Ctx
7225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , ConsumedState NewState
7226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::SetTypestate, R, SI, false, false)
7229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , newState(NewState)
7230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SetTypestateAttr *clone(ASTContext &C) const;
7234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState getNewState() const {
7238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return newState;
7239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
7242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
7243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unknown", SetTypestateAttr::Unknown)
7244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("consumed", SetTypestateAttr::Consumed)
7245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unconsumed", SetTypestateAttr::Unconsumed)
7246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<ConsumedState>());
7247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
7248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
7249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
7250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
7251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
7252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertConsumedStateToStr(ConsumedState Val) {
7255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
7256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case SetTypestateAttr::Unknown: return "unknown";
7257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case SetTypestateAttr::Consumed: return "consumed";
7258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case SetTypestateAttr::Unconsumed: return "unconsumed";
7259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
7260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
7261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::SetTypestate; }
7265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SharedTrylockFunctionAttr : public InheritableAttr {
7268f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * successValue;
7269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
7271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
7272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SharedTrylockFunctionAttr *CreateImplicit(ASTContext &Ctx, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
7275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SharedTrylockFunctionAttr(Loc, Ctx, SuccessValue, Args, ArgsSize, 0);
7276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SharedTrylockFunctionAttr(SourceRange R, ASTContext &Ctx
7281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * SuccessValue
7282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
7283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::SharedTrylockFunction, R, SI, true, true)
7286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , successValue(SuccessValue)
7287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
7288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
7290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SharedTrylockFunctionAttr(SourceRange R, ASTContext &Ctx
7293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * SuccessValue
7294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::SharedTrylockFunction, R, SI, true, true)
7297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , successValue(SuccessValue)
7298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
7299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SharedTrylockFunctionAttr *clone(ASTContext &C) const;
7303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getSuccessValue() const {
7307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return successValue;
7308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
7311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
7312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
7313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
7314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
7315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::SharedTrylockFunction; }
7320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass StdCallAttr : public InheritableAttr {
7323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static StdCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) StdCallAttr(Loc, Ctx, 0);
7326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  StdCallAttr(SourceRange R, ASTContext &Ctx
7331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::StdCall, R, SI, false, false)
7334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  StdCallAttr *clone(ASTContext &C) const;
7338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::StdCall; }
7344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SuppressAttr : public StmtAttr {
7347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned diagnosticIdentifiers_Size;
7348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  StringRef *diagnosticIdentifiers_;
7349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SuppressAttr *CreateImplicit(ASTContext &Ctx, StringRef *DiagnosticIdentifiers, unsigned DiagnosticIdentifiersSize, SourceRange Loc = SourceRange()) {
7352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SuppressAttr(Loc, Ctx, DiagnosticIdentifiers, DiagnosticIdentifiersSize, 0);
7353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SuppressAttr(SourceRange R, ASTContext &Ctx
7358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , StringRef *DiagnosticIdentifiers, unsigned DiagnosticIdentifiersSize
7359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : StmtAttr(attr::Suppress, R, SI, false, false)
7362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , diagnosticIdentifiers_Size(DiagnosticIdentifiersSize), diagnosticIdentifiers_(new (Ctx, 16) StringRef[diagnosticIdentifiers_Size])
7363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    for (size_t I = 0, E = diagnosticIdentifiers_Size; I != E;
7365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot         ++I) {
7366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      StringRef Ref = DiagnosticIdentifiers[I];
7367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Ref.empty()) {
7368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        char *Mem = new (Ctx, 1) char[Ref.size()];
7369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(Mem, Ref.data(), Ref.size());
7370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        diagnosticIdentifiers_[I] = StringRef(Mem, Ref.size());
7371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
7372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
7373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SuppressAttr(SourceRange R, ASTContext &Ctx
7376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : StmtAttr(attr::Suppress, R, SI, false, false)
7379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , diagnosticIdentifiers_Size(0), diagnosticIdentifiers_(nullptr)
7380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SuppressAttr *clone(ASTContext &C) const;
7384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef StringRef* diagnosticIdentifiers_iterator;
7388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  diagnosticIdentifiers_iterator diagnosticIdentifiers_begin() const { return diagnosticIdentifiers_; }
7389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  diagnosticIdentifiers_iterator diagnosticIdentifiers_end() const { return diagnosticIdentifiers_ + diagnosticIdentifiers_Size; }
7390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned diagnosticIdentifiers_size() const { return diagnosticIdentifiers_Size; }
7391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<diagnosticIdentifiers_iterator> diagnosticIdentifiers() const { return llvm::make_range(diagnosticIdentifiers_begin(), diagnosticIdentifiers_end()); }
7392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Suppress; }
7397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SwiftCallAttr : public InheritableAttr {
7400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SwiftCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SwiftCallAttr(Loc, Ctx, 0);
7403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SwiftCallAttr(SourceRange R, ASTContext &Ctx
7408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::SwiftCall, R, SI, false, false)
7411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SwiftCallAttr *clone(ASTContext &C) const;
7415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::SwiftCall; }
7421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SwiftContextAttr : public ParameterABIAttr {
7424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SwiftContextAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SwiftContextAttr(Loc, Ctx, 0);
7427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SwiftContextAttr(SourceRange R, ASTContext &Ctx
7432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : ParameterABIAttr(attr::SwiftContext, R, SI, false, false)
7435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SwiftContextAttr *clone(ASTContext &C) const;
7439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::SwiftContext; }
7445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SwiftErrorResultAttr : public ParameterABIAttr {
7448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SwiftErrorResultAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SwiftErrorResultAttr(Loc, Ctx, 0);
7451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SwiftErrorResultAttr(SourceRange R, ASTContext &Ctx
7456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : ParameterABIAttr(attr::SwiftErrorResult, R, SI, false, false)
7459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SwiftErrorResultAttr *clone(ASTContext &C) const;
7463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::SwiftErrorResult; }
7469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SwiftIndirectResultAttr : public ParameterABIAttr {
7472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SwiftIndirectResultAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SwiftIndirectResultAttr(Loc, Ctx, 0);
7475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SwiftIndirectResultAttr(SourceRange R, ASTContext &Ctx
7480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : ParameterABIAttr(attr::SwiftIndirectResult, R, SI, false, false)
7483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SwiftIndirectResultAttr *clone(ASTContext &C) const;
7487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::SwiftIndirectResult; }
7493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass SysVABIAttr : public InheritableAttr {
7496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static SysVABIAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) SysVABIAttr(Loc, Ctx, 0);
7499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SysVABIAttr(SourceRange R, ASTContext &Ctx
7504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::SysVABI, R, SI, false, false)
7507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SysVABIAttr *clone(ASTContext &C) const;
7511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::SysVABI; }
7517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TLSModelAttr : public InheritableAttr {
7520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned modelLength;
7521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *model;
7522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static TLSModelAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Model, SourceRange Loc = SourceRange()) {
7525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) TLSModelAttr(Loc, Ctx, Model, 0);
7526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TLSModelAttr(SourceRange R, ASTContext &Ctx
7531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Model
7532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::TLSModel, R, SI, false, false)
7535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , modelLength(Model.size()),model(new (Ctx, 1) char[modelLength])
7536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Model.empty())
7538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(model, Model.data(), modelLength);
7539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TLSModelAttr *clone(ASTContext &C) const;
7542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getModel() const {
7546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(model, modelLength);
7547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getModelLength() const {
7549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return modelLength;
7550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setModel(ASTContext &C, llvm::StringRef S) {
7552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    modelLength = S.size();
7553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->model = new (C, 1) char [modelLength];
7554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
7555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->model, S.data(), modelLength);
7556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::TLSModel; }
7561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TargetAttr : public InheritableAttr {
7564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned featuresStrLength;
7565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *featuresStr;
7566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static TargetAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef FeaturesStr, SourceRange Loc = SourceRange()) {
7569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) TargetAttr(Loc, Ctx, FeaturesStr, 0);
7570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TargetAttr(SourceRange R, ASTContext &Ctx
7575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef FeaturesStr
7576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Target, R, SI, false, false)
7579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , featuresStrLength(FeaturesStr.size()),featuresStr(new (Ctx, 1) char[featuresStrLength])
7580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!FeaturesStr.empty())
7582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(featuresStr, FeaturesStr.data(), featuresStrLength);
7583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TargetAttr *clone(ASTContext &C) const;
7586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getFeaturesStr() const {
7590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(featuresStr, featuresStrLength);
7591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getFeaturesStrLength() const {
7593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return featuresStrLength;
7594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setFeaturesStr(ASTContext &C, llvm::StringRef S) {
7596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    featuresStrLength = S.size();
7597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->featuresStr = new (C, 1) char [featuresStrLength];
7598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
7599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->featuresStr, S.data(), featuresStrLength);
7600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    struct ParsedTargetAttr {
7604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::vector<std::string> Features;
7605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      StringRef Architecture;
7606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      bool DuplicateArchitecture = false;
7607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    };
7608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    ParsedTargetAttr parse() const {
7609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return parse(getFeaturesStr());
7610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
7611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    static ParsedTargetAttr parse(StringRef Features) {
7612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      ParsedTargetAttr Ret;
7613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      SmallVector<StringRef, 1> AttrFeatures;
7614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Features.split(AttrFeatures, ",");
7615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      // Grab the various features and prepend a "+" to turn on the feature to
7617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      // the backend and add them to our existing set of features.
7618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      for (auto &Feature : AttrFeatures) {
7619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        // Go ahead and trim whitespace rather than either erroring or
7620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        // accepting it weirdly.
7621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        Feature = Feature.trim();
7622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        // We don't support cpu tuning this way currently.
7624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        // TODO: Support the fpmath option. It will require checking
7625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        // overall feature validity for the function with the rest of the
7626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        // attributes on the function.
7627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        if (Feature.startswith("fpmath=") || Feature.startswith("tune="))
7628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot	  continue;
7629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        // While we're here iterating check for a different target cpu.
7631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        if (Feature.startswith("arch=")) {
7632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          if (!Ret.Architecture.empty())
7633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot            Ret.DuplicateArchitecture = true;
7634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          else
7635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot            Ret.Architecture = Feature.split("=").second.trim();
7636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        } else if (Feature.startswith("no-"))
7637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          Ret.Features.push_back("-" + Feature.split("-").second.str());
7638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        else
7639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot          Ret.Features.push_back("+" + Feature.str());
7640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      }
7641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return Ret;
7642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
7643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Target; }
7646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TestTypestateAttr : public InheritableAttr {
7649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum ConsumedState {
7651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Consumed,
7652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Unconsumed
7653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
7654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
7655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState testState;
7656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static TestTypestateAttr *CreateImplicit(ASTContext &Ctx, ConsumedState TestState, SourceRange Loc = SourceRange()) {
7659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) TestTypestateAttr(Loc, Ctx, TestState, 0);
7660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TestTypestateAttr(SourceRange R, ASTContext &Ctx
7665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , ConsumedState TestState
7666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::TestTypestate, R, SI, false, false)
7669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , testState(TestState)
7670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TestTypestateAttr *clone(ASTContext &C) const;
7674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ConsumedState getTestState() const {
7678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return testState;
7679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToConsumedState(StringRef Val, ConsumedState &Out) {
7682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<ConsumedState> R = llvm::StringSwitch<Optional<ConsumedState>>(Val)
7683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("consumed", TestTypestateAttr::Consumed)
7684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("unconsumed", TestTypestateAttr::Unconsumed)
7685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<ConsumedState>());
7686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
7687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
7688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
7689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
7690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
7691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertConsumedStateToStr(ConsumedState Val) {
7694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
7695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case TestTypestateAttr::Consumed: return "consumed";
7696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case TestTypestateAttr::Unconsumed: return "unconsumed";
7697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
7698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
7699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::TestTypestate; }
7703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ThisCallAttr : public InheritableAttr {
7706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ThisCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ThisCallAttr(Loc, Ctx, 0);
7709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ThisCallAttr(SourceRange R, ASTContext &Ctx
7714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::ThisCall, R, SI, false, false)
7717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ThisCallAttr *clone(ASTContext &C) const;
7721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::ThisCall; }
7727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ThreadAttr : public Attr {
7730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static ThreadAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) ThreadAttr(Loc, Ctx, 0);
7733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ThreadAttr(SourceRange R, ASTContext &Ctx
7738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Attr(attr::Thread, R, SI, false, false)
7741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ThreadAttr *clone(ASTContext &C) const;
7745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Thread; }
7751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TransparentUnionAttr : public InheritableAttr {
7754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static TransparentUnionAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
7756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) TransparentUnionAttr(Loc, Ctx, 0);
7757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TransparentUnionAttr(SourceRange R, ASTContext &Ctx
7762f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7764f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::TransparentUnion, R, SI, false, false)
7765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TransparentUnionAttr *clone(ASTContext &C) const;
7769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7771f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::TransparentUnion; }
7775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TryAcquireCapabilityAttr : public InheritableAttr {
7778f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotExpr * successValue;
7779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_Size;
7781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * *args_;
7782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
7785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_try_acquire_capability = 0,
7786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_try_acquire_capability = 1,
7787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_try_acquire_shared_capability = 2,
7788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_try_acquire_shared_capability = 3
7789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
7790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static TryAcquireCapabilityAttr *CreateImplicit(ASTContext &Ctx, Spelling S, Expr * SuccessValue, Expr * *Args, unsigned ArgsSize, SourceRange Loc = SourceRange()) {
7792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) TryAcquireCapabilityAttr(Loc, Ctx, SuccessValue, Args, ArgsSize, S);
7793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TryAcquireCapabilityAttr(SourceRange R, ASTContext &Ctx
7798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * SuccessValue
7799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * *Args, unsigned ArgsSize
7800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::TryAcquireCapability, R, SI, true, true)
7803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , successValue(SuccessValue)
7804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(ArgsSize), args_(new (Ctx, 16) Expr *[args_Size])
7805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    std::copy(Args, Args + args_Size, args_);
7807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TryAcquireCapabilityAttr(SourceRange R, ASTContext &Ctx
7810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , Expr * SuccessValue
7811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::TryAcquireCapability, R, SI, true, true)
7814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , successValue(SuccessValue)
7815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , args_Size(0), args_(nullptr)
7816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TryAcquireCapabilityAttr *clone(ASTContext &C) const;
7820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
7824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
7825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
7826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_try_acquire_capability;
7827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_clang_try_acquire_capability;
7828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_try_acquire_shared_capability;
7829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return CXX11_clang_try_acquire_shared_capability;
7830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isShared() const { return SpellingListIndex == 2 ||
7833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 3; }
7834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Expr * getSuccessValue() const {
7835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return successValue;
7836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  typedef Expr ** args_iterator;
7839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_begin() const { return args_; }
7840f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  args_iterator args_end() const { return args_ + args_Size; }
7841f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned args_size() const { return args_Size; }
7842f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::iterator_range<args_iterator> args() const { return llvm::make_range(args_begin(), args_end()); }
7843f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7844f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7845f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7846f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7847f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::TryAcquireCapability; }
7848f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7849f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7850f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TypeTagForDatatypeAttr : public InheritableAttr {
7851f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotIdentifierInfo * argumentKind;
7852f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7853f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotTypeSourceInfo * matchingCType;
7854f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7855f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool layoutCompatible;
7856f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7857f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotbool mustBeNull;
7858f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7859f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7860f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static TypeTagForDatatypeAttr *CreateImplicit(ASTContext &Ctx, IdentifierInfo * ArgumentKind, TypeSourceInfo * MatchingCType, bool LayoutCompatible, bool MustBeNull, SourceRange Loc = SourceRange()) {
7861f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) TypeTagForDatatypeAttr(Loc, Ctx, ArgumentKind, MatchingCType, LayoutCompatible, MustBeNull, 0);
7862f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7863f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7864f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7865f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7866f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TypeTagForDatatypeAttr(SourceRange R, ASTContext &Ctx
7867f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , IdentifierInfo * ArgumentKind
7868f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , TypeSourceInfo * MatchingCType
7869f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bool LayoutCompatible
7870f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , bool MustBeNull
7871f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7872f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7873f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::TypeTagForDatatype, R, SI, false, false)
7874f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , argumentKind(ArgumentKind)
7875f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , matchingCType(MatchingCType)
7876f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , layoutCompatible(LayoutCompatible)
7877f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , mustBeNull(MustBeNull)
7878f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7879f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7880f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7881f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TypeTagForDatatypeAttr *clone(ASTContext &C) const;
7882f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7883f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7884f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7885f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  IdentifierInfo * getArgumentKind() const {
7886f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return argumentKind;
7887f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7888f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7889f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  QualType getMatchingCType() const {
7890f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return matchingCType->getType();
7891f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }  TypeSourceInfo * getMatchingCTypeLoc() const {
7892f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return matchingCType;
7893f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7894f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7895f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getLayoutCompatible() const {
7896f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return layoutCompatible;
7897f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7898f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7899f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getMustBeNull() const {
7900f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return mustBeNull;
7901f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7902f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7903f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7904f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7905f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::TypeTagForDatatype; }
7906f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7907f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7908f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TypeVisibilityAttr : public InheritableAttr {
7909f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7910f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum VisibilityType {
7911f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Default,
7912f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Hidden,
7913f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Protected
7914f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
7915f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
7916f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VisibilityType visibility;
7917f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7918f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7919f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static TypeVisibilityAttr *CreateImplicit(ASTContext &Ctx, VisibilityType Visibility, SourceRange Loc = SourceRange()) {
7920f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) TypeVisibilityAttr(Loc, Ctx, Visibility, 0);
7921f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7922f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7923f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7924f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7925f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TypeVisibilityAttr(SourceRange R, ASTContext &Ctx
7926f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , VisibilityType Visibility
7927f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
7928f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
7929f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::TypeVisibility, R, SI, false, false)
7930f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , visibility(Visibility)
7931f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
7932f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7933f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7934f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  TypeVisibilityAttr *clone(ASTContext &C) const;
7935f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
7936f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
7937f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
7938f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VisibilityType getVisibility() const {
7939f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return visibility;
7940f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7941f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7942f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToVisibilityType(StringRef Val, VisibilityType &Out) {
7943f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<VisibilityType> R = llvm::StringSwitch<Optional<VisibilityType>>(Val)
7944f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("default", TypeVisibilityAttr::Default)
7945f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("hidden", TypeVisibilityAttr::Hidden)
7946f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("internal", TypeVisibilityAttr::Hidden)
7947f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("protected", TypeVisibilityAttr::Protected)
7948f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<VisibilityType>());
7949f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
7950f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
7951f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
7952f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
7953f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
7954f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7955f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7956f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertVisibilityTypeToStr(VisibilityType Val) {
7957f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
7958f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case TypeVisibilityAttr::Default: return "default";
7959f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case TypeVisibilityAttr::Hidden: return "hidden";
7960f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case TypeVisibilityAttr::Protected: return "protected";
7961f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
7962f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
7963f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7964f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7965f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7966f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::TypeVisibility; }
7967f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
7968f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7969f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass UnavailableAttr : public InheritableAttr {
7970f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned messageLength;
7971f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *message;
7972f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7973f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7974f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum ImplicitReason {
7975f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IR_None,
7976f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IR_ARCForbiddenType,
7977f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IR_ForbiddenWeak,
7978f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IR_ARCForbiddenConversion,
7979f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IR_ARCInitReturnsUnrelated,
7980f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    IR_ARCFieldWithOwnership
7981f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
7982f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
7983f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ImplicitReason implicitReason;
7984f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7985f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
7986f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static UnavailableAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, ImplicitReason ImplicitReason, SourceRange Loc = SourceRange()) {
7987f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) UnavailableAttr(Loc, Ctx, Message, ImplicitReason, 0);
7988f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7989f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7990f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7991f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7992f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static UnavailableAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Message, SourceRange Loc = SourceRange()) {
7993f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) UnavailableAttr(Loc, Ctx, Message, 0);
7994f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
7995f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
7996f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
7997f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
7998f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UnavailableAttr(SourceRange R, ASTContext &Ctx
7999f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Message
8000f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , ImplicitReason ImplicitReason
8001f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8002f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8003f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Unavailable, R, SI, false, false)
8004f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
8005f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , implicitReason(ImplicitReason)
8006f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8007f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Message.empty())
8008f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(message, Message.data(), messageLength);
8009f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8010f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8011f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UnavailableAttr(SourceRange R, ASTContext &Ctx
8012f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Message
8013f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8014f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8015f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Unavailable, R, SI, false, false)
8016f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , messageLength(Message.size()),message(new (Ctx, 1) char[messageLength])
8017f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , implicitReason(ImplicitReason(0))
8018f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8019f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Message.empty())
8020f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(message, Message.data(), messageLength);
8021f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8022f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8023f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UnavailableAttr(SourceRange R, ASTContext &Ctx
8024f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8025f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8026f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Unavailable, R, SI, false, false)
8027f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , messageLength(0),message(nullptr)
8028f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , implicitReason(ImplicitReason(0))
8029f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8030f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8031f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8032f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UnavailableAttr *clone(ASTContext &C) const;
8033f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8034f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8035f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8036f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getMessage() const {
8037f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(message, messageLength);
8038f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8039f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getMessageLength() const {
8040f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return messageLength;
8041f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8042f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setMessage(ASTContext &C, llvm::StringRef S) {
8043f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    messageLength = S.size();
8044f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->message = new (C, 1) char [messageLength];
8045f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
8046f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->message, S.data(), messageLength);
8047f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8048f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8049f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ImplicitReason getImplicitReason() const {
8050f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return implicitReason;
8051f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8052f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8053f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8054f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8055f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Unavailable; }
8056f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8057f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8058f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass UnusedAttr : public InheritableAttr {
8059f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8060f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
8061f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_maybe_unused = 0,
8062f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_unused = 1,
8063f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_unused = 2,
8064f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    C2x_maybe_unused = 3
8065f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
8066f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8067f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static UnusedAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
8068f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) UnusedAttr(Loc, Ctx, S);
8069f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8070f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8071f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8072f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8073f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UnusedAttr(SourceRange R, ASTContext &Ctx
8074f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8075f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8076f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Unused, R, SI, false, false)
8077f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8078f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8079f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8080f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UnusedAttr *clone(ASTContext &C) const;
8081f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8082f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8083f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8084f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
8085f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
8086f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
8087f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return CXX11_maybe_unused;
8088f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return GNU_unused;
8089f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return CXX11_gnu_unused;
8090f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return C2x_maybe_unused;
8091f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8092f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8093f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8094f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8095f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Unused; }
8096f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8097f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8098f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass UsedAttr : public InheritableAttr {
8099f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static UsedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
8101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) UsedAttr(Loc, Ctx, 0);
8102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UsedAttr(SourceRange R, ASTContext &Ctx
8107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Used, R, SI, false, false)
8110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UsedAttr *clone(ASTContext &C) const;
8114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Used; }
8120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass UuidAttr : public InheritableAttr {
8123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned guidLength;
8124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *guid;
8125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static UuidAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Guid, SourceRange Loc = SourceRange()) {
8128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) UuidAttr(Loc, Ctx, Guid, 0);
8129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UuidAttr(SourceRange R, ASTContext &Ctx
8134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Guid
8135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Uuid, R, SI, false, false)
8138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , guidLength(Guid.size()),guid(new (Ctx, 1) char[guidLength])
8139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Guid.empty())
8141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(guid, Guid.data(), guidLength);
8142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  UuidAttr *clone(ASTContext &C) const;
8145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getGuid() const {
8149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(guid, guidLength);
8150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getGuidLength() const {
8152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return guidLength;
8153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setGuid(ASTContext &C, llvm::StringRef S) {
8155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    guidLength = S.size();
8156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->guid = new (C, 1) char [guidLength];
8157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
8158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->guid, S.data(), guidLength);
8159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Uuid; }
8164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VecReturnAttr : public InheritableAttr {
8167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static VecReturnAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
8169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) VecReturnAttr(Loc, Ctx, 0);
8170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VecReturnAttr(SourceRange R, ASTContext &Ctx
8175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::VecReturn, R, SI, false, false)
8178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VecReturnAttr *clone(ASTContext &C) const;
8182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::VecReturn; }
8188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VecTypeHintAttr : public InheritableAttr {
8191f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotTypeSourceInfo * typeHint;
8192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static VecTypeHintAttr *CreateImplicit(ASTContext &Ctx, TypeSourceInfo * TypeHint, SourceRange Loc = SourceRange()) {
8195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) VecTypeHintAttr(Loc, Ctx, TypeHint, 0);
8196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VecTypeHintAttr(SourceRange R, ASTContext &Ctx
8201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , TypeSourceInfo * TypeHint
8202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::VecTypeHint, R, SI, false, false)
8205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , typeHint(TypeHint)
8206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VecTypeHintAttr *clone(ASTContext &C) const;
8210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  QualType getTypeHint() const {
8214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return typeHint->getType();
8215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }  TypeSourceInfo * getTypeHintLoc() const {
8216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return typeHint;
8217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::VecTypeHint; }
8222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VectorCallAttr : public InheritableAttr {
8225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static VectorCallAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
8227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) VectorCallAttr(Loc, Ctx, 0);
8228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VectorCallAttr(SourceRange R, ASTContext &Ctx
8233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::VectorCall, R, SI, false, false)
8236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VectorCallAttr *clone(ASTContext &C) const;
8240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::VectorCall; }
8246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VisibilityAttr : public InheritableAttr {
8249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum VisibilityType {
8251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Default,
8252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Hidden,
8253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Protected
8254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
8255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
8256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VisibilityType visibility;
8257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static VisibilityAttr *CreateImplicit(ASTContext &Ctx, VisibilityType Visibility, SourceRange Loc = SourceRange()) {
8260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) VisibilityAttr(Loc, Ctx, Visibility, 0);
8261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VisibilityAttr(SourceRange R, ASTContext &Ctx
8266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , VisibilityType Visibility
8267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Visibility, R, SI, false, false)
8270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , visibility(Visibility)
8271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VisibilityAttr *clone(ASTContext &C) const;
8275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  VisibilityType getVisibility() const {
8279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return visibility;
8280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool ConvertStrToVisibilityType(StringRef Val, VisibilityType &Out) {
8283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    Optional<VisibilityType> R = llvm::StringSwitch<Optional<VisibilityType>>(Val)
8284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("default", VisibilityAttr::Default)
8285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("hidden", VisibilityAttr::Hidden)
8286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("internal", VisibilityAttr::Hidden)
8287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Case("protected", VisibilityAttr::Protected)
8288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      .Default(Optional<VisibilityType>());
8289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (R) {
8290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Out = *R;
8291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return true;
8292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
8293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return false;
8294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static const char *ConvertVisibilityTypeToStr(VisibilityType Val) {
8297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch(Val) {
8298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case VisibilityAttr::Default: return "default";
8299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case VisibilityAttr::Hidden: return "hidden";
8300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case VisibilityAttr::Protected: return "protected";
8301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
8302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("No enumerator with that value");
8303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Visibility; }
8307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass WarnUnusedAttr : public InheritableAttr {
8310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static WarnUnusedAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
8312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) WarnUnusedAttr(Loc, Ctx, 0);
8313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WarnUnusedAttr(SourceRange R, ASTContext &Ctx
8318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::WarnUnused, R, SI, false, false)
8321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WarnUnusedAttr *clone(ASTContext &C) const;
8325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::WarnUnused; }
8331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass WarnUnusedResultAttr : public InheritableAttr {
8334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
8336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_nodiscard = 0,
8337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    C2x_nodiscard = 1,
8338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_warn_unused_result = 2,
8339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_warn_unused_result = 3,
8340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_gnu_warn_unused_result = 4
8341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
8342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static WarnUnusedResultAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
8344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) WarnUnusedResultAttr(Loc, Ctx, S);
8345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WarnUnusedResultAttr(SourceRange R, ASTContext &Ctx
8350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::WarnUnusedResult, R, SI, false, false)
8353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WarnUnusedResultAttr *clone(ASTContext &C) const;
8357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
8361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
8362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
8363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return CXX11_nodiscard;
8364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return C2x_nodiscard;
8365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return CXX11_clang_warn_unused_result;
8366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return GNU_warn_unused_result;
8367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 4: return CXX11_gnu_warn_unused_result;
8368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::WarnUnusedResult; }
8373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass WeakAttr : public InheritableAttr {
8376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static WeakAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
8378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) WeakAttr(Loc, Ctx, 0);
8379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WeakAttr(SourceRange R, ASTContext &Ctx
8384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::Weak, R, SI, false, false)
8387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WeakAttr *clone(ASTContext &C) const;
8391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::Weak; }
8397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass WeakImportAttr : public InheritableAttr {
8400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static WeakImportAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
8402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) WeakImportAttr(Loc, Ctx, 0);
8403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WeakImportAttr(SourceRange R, ASTContext &Ctx
8408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::WeakImport, R, SI, false, false)
8411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WeakImportAttr *clone(ASTContext &C) const;
8415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::WeakImport; }
8421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass WeakRefAttr : public InheritableAttr {
8424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned aliaseeLength;
8425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotchar *aliasee;
8426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static WeakRefAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Aliasee, SourceRange Loc = SourceRange()) {
8429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) WeakRefAttr(Loc, Ctx, Aliasee, 0);
8430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WeakRefAttr(SourceRange R, ASTContext &Ctx
8435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , llvm::StringRef Aliasee
8436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::WeakRef, R, SI, false, false)
8439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , aliaseeLength(Aliasee.size()),aliasee(new (Ctx, 1) char[aliaseeLength])
8440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      if (!Aliasee.empty())
8442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot        std::memcpy(aliasee, Aliasee.data(), aliaseeLength);
8443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WeakRefAttr(SourceRange R, ASTContext &Ctx
8446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::WeakRef, R, SI, false, false)
8449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , aliaseeLength(0),aliasee(nullptr)
8450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WeakRefAttr *clone(ASTContext &C) const;
8454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  llvm::StringRef getAliasee() const {
8458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return llvm::StringRef(aliasee, aliaseeLength);
8459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getAliaseeLength() const {
8461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return aliaseeLength;
8462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setAliasee(ASTContext &C, llvm::StringRef S) {
8464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    aliaseeLength = S.size();
8465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    this->aliasee = new (C, 1) char [aliaseeLength];
8466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    if (!S.empty())
8467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      std::memcpy(this->aliasee, S.data(), aliaseeLength);
8468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::WeakRef; }
8473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass WorkGroupSizeHintAttr : public InheritableAttr {
8476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned xDim;
8477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned yDim;
8479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned zDim;
8481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static WorkGroupSizeHintAttr *CreateImplicit(ASTContext &Ctx, unsigned XDim, unsigned YDim, unsigned ZDim, SourceRange Loc = SourceRange()) {
8484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) WorkGroupSizeHintAttr(Loc, Ctx, XDim, YDim, ZDim, 0);
8485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WorkGroupSizeHintAttr(SourceRange R, ASTContext &Ctx
8490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned XDim
8491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned YDim
8492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned ZDim
8493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::WorkGroupSizeHint, R, SI, false, false)
8496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , xDim(XDim)
8497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , yDim(YDim)
8498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , zDim(ZDim)
8499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  WorkGroupSizeHintAttr *clone(ASTContext &C) const;
8503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getXDim() const {
8507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return xDim;
8508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getYDim() const {
8511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return yDim;
8512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getZDim() const {
8515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return zDim;
8516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::WorkGroupSizeHint; }
8521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass X86ForceAlignArgPointerAttr : public InheritableAttr {
8524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static X86ForceAlignArgPointerAttr *CreateImplicit(ASTContext &Ctx, SourceRange Loc = SourceRange()) {
8526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) X86ForceAlignArgPointerAttr(Loc, Ctx, 0);
8527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  X86ForceAlignArgPointerAttr(SourceRange R, ASTContext &Ctx
8532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::X86ForceAlignArgPointer, R, SI, false, false)
8535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  X86ForceAlignArgPointerAttr *clone(ASTContext &C) const;
8539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::X86ForceAlignArgPointer; }
8545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass XRayInstrumentAttr : public InheritableAttr {
8548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  enum Spelling {
8550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_xray_always_instrument = 0,
8551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_xray_always_instrument = 1,
8552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    GNU_xray_never_instrument = 2,
8553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    CXX11_clang_xray_never_instrument = 3
8554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  };
8555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static XRayInstrumentAttr *CreateImplicit(ASTContext &Ctx, Spelling S, SourceRange Loc = SourceRange()) {
8557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) XRayInstrumentAttr(Loc, Ctx, S);
8558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  XRayInstrumentAttr(SourceRange R, ASTContext &Ctx
8563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::XRayInstrument, R, SI, false, false)
8566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  XRayInstrumentAttr *clone(ASTContext &C) const;
8570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Spelling getSemanticSpelling() const {
8574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  switch (SpellingListIndex) {
8575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default: llvm_unreachable("Unknown spelling list index");
8576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 0: return GNU_xray_always_instrument;
8577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 1: return CXX11_clang_xray_always_instrument;
8578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 2: return GNU_xray_never_instrument;
8579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case 3: return CXX11_clang_xray_never_instrument;
8580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool alwaysXRayInstrument() const { return SpellingListIndex == 0 ||
8583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 1; }
8584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool neverXRayInstrument() const { return SpellingListIndex == 2 ||
8585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    SpellingListIndex == 3; }
8586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::XRayInstrument; }
8589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass XRayLogArgsAttr : public InheritableAttr {
8592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotunsigned argumentCount;
8593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
8595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static XRayLogArgsAttr *CreateImplicit(ASTContext &Ctx, unsigned ArgumentCount, SourceRange Loc = SourceRange()) {
8596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    auto *A = new (Ctx) XRayLogArgsAttr(Loc, Ctx, ArgumentCount, 0);
8597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    A->setImplicit(true);
8598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A;
8599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  XRayLogArgsAttr(SourceRange R, ASTContext &Ctx
8602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned ArgumentCount
8603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , unsigned SI
8604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot             )
8605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableAttr(attr::XRayLogArgs, R, SI, false, false)
8606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot              , argumentCount(ArgumentCount)
8607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  {
8608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  XRayLogArgsAttr *clone(ASTContext &C) const;
8611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS,
8612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   const PrintingPolicy &Policy) const;
8613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
8614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getArgumentCount() const {
8615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return argumentCount;
8616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
8617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) { return A->getKind() == attr::XRayLogArgs; }
8621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
8622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
8623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif // LLVM_CLANG_ATTR_CLASSES_INC
8624