blob: be60ad41fea02305aa44d9bdc217fdff03ef0dd6 [file] [log] [blame]
Stephen Hines651f13c2014-04-23 16:59:28 -07001From 4ad30819eb30d7c72336cc61cabd85b42a350aac Mon Sep 17 00:00:00 2001
2From: Tim Murray <timmurray@google.com>
3Date: Thu, 3 Apr 2014 13:38:15 -0700
4Subject: [PATCH 3/4] Add support for RenderScript specific options.
5
6These include __attribute((kernel)), 64-bit longs, and RGBA vector syntax.
7
8Change-Id: I592e5ea2abc86269a941e0497ac11665fb562aa0
9---
10 include/clang/AST/Type.h | 8 ++++----
11 include/clang/Basic/Attr.td | 5 +++++
12 include/clang/Basic/LangOptions.def | 1 +
13 lib/Basic/Targets.cpp | 2 ++
14 lib/Sema/SemaDeclAttr.cpp | 13 +++++++++++++
15 lib/Sema/SemaExprMember.cpp | 17 +++++++++++++++++
16 6 files changed, 42 insertions(+), 4 deletions(-)
17
18diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h
19index 001a87e..7be6fcd 100644
20--- a/include/clang/AST/Type.h
21+++ b/include/clang/AST/Type.h
22@@ -2593,10 +2593,10 @@ public:
23 static int getPointAccessorIdx(char c) {
24 switch (c) {
25 default: return -1;
26- case 'x': return 0;
27- case 'y': return 1;
28- case 'z': return 2;
29- case 'w': return 3;
30+ case 'x': case 'r': return 0;
31+ case 'y': case 'g': return 1;
32+ case 'z': case 'b': return 2;
33+ case 'w': case 'a': return 3;
34 }
35 }
36 static int getNumericAccessorIdx(char c) {
37diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td
38index 12a8517..7360683 100644
39--- a/include/clang/Basic/Attr.td
40+++ b/include/clang/Basic/Attr.td
41@@ -612,6 +612,11 @@ def OpenCLConstantAddressSpace : TypeAttr {
42 let Documentation = [Undocumented];
43 }
44
45+def Kernel : Attr {
46+ let Spellings = [GNU<"kernel">];
47+ let Documentation = [Undocumented];
48+}
49+
50 def Deprecated : InheritableAttr {
51 let Spellings = [GCC<"deprecated">, Declspec<"deprecated">,
52 CXX11<"","deprecated">];
53diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def
54index 22662e0..7b21482 100644
55--- a/include/clang/Basic/LangOptions.def
56+++ b/include/clang/Basic/LangOptions.def
57@@ -123,6 +123,7 @@ LANGOPT(OpenCLVersion , 32, 0, "OpenCL version")
58 LANGOPT(NativeHalfType , 1, 0, "Native half type support")
59 LANGOPT(CUDA , 1, 0, "CUDA")
60 LANGOPT(OpenMP , 1, 0, "OpenMP support")
61+LANGOPT(Renderscript , 1, 0, "RenderScript")
62
63 LANGOPT(AssumeSaneOperatorNew , 1, 1, "implicit __attribute__((malloc)) for C++'s new operators")
64 LANGOPT(SizedDeallocation , 1, 0, "enable sized deallocation functions")
65diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
66index 3d294ce..fd59c00 100644
67--- a/lib/Basic/Targets.cpp
68+++ b/lib/Basic/Targets.cpp
69@@ -3984,6 +3984,8 @@ public:
70 FPU |= FPARMV8;
71 else if (Features[i] == "+neon")
72 FPU |= NeonFPU;
73+ else if (Features[i] == "+long64")
74+ LongWidth = LongAlign = 64; // RenderScript uses a 64-bit long type
75 else if (Features[i] == "+hwdiv")
76 HWDiv |= HWDivThumb;
77 else if (Features[i] == "+hwdiv-arm")
78diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp
79index 5f60783..38b3c45 100644
80--- a/lib/Sema/SemaDeclAttr.cpp
81+++ b/lib/Sema/SemaDeclAttr.cpp
82@@ -1396,6 +1396,16 @@ static void handleTLSModelAttr(Sema &S, Decl *D,
83 Attr.getAttributeSpellingListIndex()));
84 }
85
86+static void handleKernelAttr(Sema &S, Decl *D, const AttributeList &Attr) {
87+ if (S.LangOpts.Renderscript) {
88+ D->addAttr(::new (S.Context)
89+ KernelAttr(Attr.getRange(), S.Context,
90+ Attr.getAttributeSpellingListIndex()));
91+ } else {
92+ S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "kernel";
93+ }
94+}
95+
96 static void handleMallocAttr(Sema &S, Decl *D, const AttributeList &Attr) {
97 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
98 QualType RetTy = FD->getReturnType();
99@@ -4130,6 +4140,9 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
100 case AttributeList::AT_CUDALaunchBounds:
101 handleLaunchBoundsAttr(S, D, Attr);
102 break;
103+ case AttributeList::AT_Kernel:
104+ handleKernelAttr(S, D, Attr);
105+ break;
106 case AttributeList::AT_Malloc:
107 handleMallocAttr(S, D, Attr);
108 break;
109diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp
110index 354dfcf..c4a1780 100644
111--- a/lib/Sema/SemaExprMember.cpp
112+++ b/lib/Sema/SemaExprMember.cpp
113@@ -267,6 +267,20 @@ Sema::BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS,
114 llvm_unreachable("unexpected instance member access kind");
115 }
116
117+/// Determine whether input char is from rgba component set.
118+static bool
119+IsRGBA(char c) {
120+ switch (c) {
121+ case 'r':
122+ case 'g':
123+ case 'b':
124+ case 'a':
125+ return true;
126+ default:
127+ return false;
128+ }
129+}
130+
131 /// Check an ext-vector component access expression.
132 ///
133 /// VK should be set in advance to the value kind of the base
134@@ -306,7 +320,10 @@ CheckExtVectorComponent(Sema &S, QualType baseType, ExprValueKind &VK,
135 HalvingSwizzle = true;
136 } else if (!HexSwizzle &&
137 (Idx = vecType->getPointAccessorIdx(*compStr)) != -1) {
138+ bool HasRGBA = IsRGBA(*compStr);
139 do {
140+ if (HasRGBA != IsRGBA(*compStr))
141+ break;
142 if (HasIndex[Idx]) HasRepeated = true;
143 HasIndex[Idx] = true;
144 compStr++;
145--
1461.9.1.423.g4596e3a
147