slang_rs_context.h revision 2615f383dfc1542a05f19aee23b03a09bd018f4e
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
20a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines * Copyright 2010-2012, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_  // NOLINT
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <cstdio>
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list>
22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <map>
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
24fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni#include <vector>
25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Lex/Preprocessor.h"
27be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "clang/AST/Mangle.h"
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringSet.h"
309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringMap.h"
31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3234e6205f1d5ceb90a73192cee8b215fa0b7ab306David Gross#include "slang_pragma_list.h"
333fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines
34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm {
356315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class LLVMContext;
3623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  class DataLayout;
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace llvm
38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
406315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class VarDecl;
416315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class ASTContext;
426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class TargetInfo;
436315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class FunctionDecl;
44fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  class QualType;
456315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class SourceManager;
46fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  class TypeDecl;
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
50a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportable;
51a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportVar;
52a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportFunc;
53593a894650e81be54173106ec266f0311cebebd3Stephen Hines  class RSExportForEach;
54c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  class RSExportReduce;
5515e44e66adc350adb4fe0533a442092c64333ab5David Gross  class RSExportReduceNew;
56a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportType;
57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext {
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportVarSet;
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportFuncSet;
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportTypeSet;
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
64a41ce1d98094da84643995d40d71c529905123fcZonr Chang  typedef std::list<RSExportable*> ExportableList;
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<RSExportVar*> ExportVarList;
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<RSExportFunc*> ExportFuncList;
67fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  typedef std::vector<RSExportForEach*> ExportForEachVector;
68c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  typedef std::list<RSExportReduce*> ExportReduceList;
6915e44e66adc350adb4fe0533a442092c64333ab5David Gross  typedef std::list<RSExportReduceNew*> ExportReduceNewList;
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringMap<RSExportType*> ExportTypeMap;
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
739e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  clang::Preprocessor &mPP;
749e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  clang::ASTContext &mCtx;
753fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  PragmaList *mPragmas;
76109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  // Precision specified via pragma, either rs_fp_full or rs_fp_relaxed. If
77109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  // empty, rs_fp_full is assumed.
78109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  std::string mPrecision;
79c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes  unsigned int mTargetAPI;
80fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines  bool mVerbose;
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
8223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  llvm::DataLayout *mDataLayout;
839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  llvm::LLVMContext &mLLVMContext;
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
85a41ce1d98094da84643995d40d71c529905123fcZonr Chang  ExportableList mExportables;
86a41ce1d98094da84643995d40d71c529905123fcZonr Chang
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  NeedExportTypeSet mNeedExportTypes;
889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string *mLicenseNote;
909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mReflectJavaPackageName;
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mReflectJavaPathName;
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
930a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines  std::string mRSPackageName;
940a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines
9596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  int version;
9682754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines
972eb9a3f7c48fe54eb4e813d80e3363bc79553a1eStephen Hines  std::unique_ptr<clang::MangleContext> mMangleCtx;
9896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines
999ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  bool mIs64Bit;
1009ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportVar(const clang::VarDecl *VD);
1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportFunc(const clang::FunctionDecl *FD);
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportType(const llvm::StringRef &Name);
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
105fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  int getForEachSlotNumber(const clang::StringRef& funcName);
106fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  unsigned mNextSlot;
107c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines
1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportVarList mExportVars;
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportFuncList mExportFuncs;
110fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  std::map<llvm::StringRef, unsigned> mExportForEachMap;
111fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  ExportForEachVector mExportForEach;
112c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  ExportReduceList mExportReduce;
11315e44e66adc350adb4fe0533a442092c64333ab5David Gross  ExportReduceNewList mExportReduceNew;
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportTypeMap mExportTypes;
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
116fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  clang::QualType mAllocationType;
1172615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  clang::QualType mScriptCallType;
118fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
1209e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  RSContext(clang::Preprocessor &PP,
1219e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines            clang::ASTContext &Ctx,
1223fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines            const clang::TargetInfo &Target,
1234cc67fce91f43215d61b2695746eab102a3db516Stephen Hines            PragmaList *Pragmas,
124fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines            unsigned int TargetAPI,
125fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines            bool Verbose);
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1279e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  inline clang::Preprocessor &getPreprocessor() const { return mPP; }
1289e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  inline clang::ASTContext &getASTContext() const { return mCtx; }
129be27482cdeaf08576bc39b72a15d35d13014a636Logan  inline clang::MangleContext &getMangleContext() const {
130be27482cdeaf08576bc39b72a15d35d13014a636Logan    return *mMangleCtx;
131f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines  }
13223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  inline const llvm::DataLayout *getDataLayout() const { return mDataLayout; }
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; }
1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const clang::SourceManager *getSourceManager() const {
1359e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines    return &mPP.getSourceManager();
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1379207a2e495c8363606861e4f034504ec5c153dabLogan Chien  inline clang::DiagnosticsEngine *getDiagnostics() const {
1382ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines    return &mPP.getDiagnostics();
1392ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines  }
140c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes  inline unsigned int getTargetAPI() const {
1414a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines    return mTargetAPI;
1424a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines  }
1439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
144fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines  inline bool getVerbose() const {
145fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines    return mVerbose;
146fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines  }
1479ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  inline bool is64Bit() const {
1489ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines    return mIs64Bit;
1499ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  }
150fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines
1519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setLicenseNote(const std::string &S) {
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mLicenseNote = new std::string(S);
1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const std::string *getLicenseNote() const { return mLicenseNote; }
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void addExportType(const std::string &S) {
1579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mNeedExportTypes.insert(S);
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setReflectJavaPackageName(const std::string &S) {
1619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mReflectJavaPackageName = S;
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
163dde98533fad4c6534af537ae583aa4db35a1c699Tim Murray  inline const std::string &getReflectJavaPackageName() const {
1644cc67fce91f43215d61b2695746eab102a3db516Stephen Hines    return mReflectJavaPackageName;
1654cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  }
1669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1670a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines  inline void setRSPackageName(const std::string &S) {
1680a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines    mRSPackageName = S;
1690a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines  }
17012fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet
17112fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet  inline const std::string &getRSPackageName() const { return mRSPackageName; }
1720a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines
17388f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni  void setAllocationType(const clang::TypeDecl* TD);
17488f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni  inline const clang::QualType& getAllocationType() const {
17588f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni    return mAllocationType;
17688f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni  }
17788f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni
1782615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  void setScriptCallType(const clang::TypeDecl* TD);
1792615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  inline const clang::QualType& getScriptCallType() const {
1802615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni    return mScriptCallType;
1812615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  }
1822615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni
183fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  bool addForEach(const clang::FunctionDecl* FD);
184fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  bool processExports();
185a41ce1d98094da84643995d40d71c529905123fcZonr Chang  inline void newExportable(RSExportable *E) {
1865abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes    if (E != nullptr)
187a41ce1d98094da84643995d40d71c529905123fcZonr Chang      mExportables.push_back(E);
188a41ce1d98094da84643995d40d71c529905123fcZonr Chang  }
189641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  typedef ExportableList::iterator exportable_iterator;
190641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  exportable_iterator exportable_begin() {
191641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    return mExportables.begin();
192641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  }
193641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  exportable_iterator exportable_end() {
194641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    return mExportables.end();
195641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  }
1969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportVarList::const_iterator const_export_var_iterator;
1989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_var_iterator export_vars_begin() const {
1999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportVars.begin();
2009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_var_iterator export_vars_end() const {
2029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportVars.end();
2039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportVar() const {
2059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return !mExportVars.empty();
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportFuncList::const_iterator const_export_func_iterator;
2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_func_iterator export_funcs_begin() const {
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportFuncs.begin();
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_func_iterator export_funcs_end() const {
2139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportFuncs.end();
2149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportFunc() const { return !mExportFuncs.empty(); }
2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
217fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  typedef ExportForEachVector::const_iterator const_export_foreach_iterator;
218593a894650e81be54173106ec266f0311cebebd3Stephen Hines  const_export_foreach_iterator export_foreach_begin() const {
219593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return mExportForEach.begin();
220593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
221593a894650e81be54173106ec266f0311cebebd3Stephen Hines  const_export_foreach_iterator export_foreach_end() const {
222593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return mExportForEach.end();
223593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
224593a894650e81be54173106ec266f0311cebebd3Stephen Hines  inline bool hasExportForEach() const { return !mExportForEach.empty(); }
225fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  int getForEachSlotNumber(const clang::FunctionDecl* FD);
226593a894650e81be54173106ec266f0311cebebd3Stephen Hines
227c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  typedef ExportReduceList::const_iterator const_export_reduce_iterator;
228c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  const_export_reduce_iterator export_reduce_begin() const {
229c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala    return mExportReduce.begin();
230c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  }
231c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  const_export_reduce_iterator export_reduce_end() const {
232c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala    return mExportReduce.end();
233c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  }
234c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  inline bool hasExportReduce() const { return !mExportReduce.empty(); }
235c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala
23615e44e66adc350adb4fe0533a442092c64333ab5David Gross  typedef ExportReduceNewList::const_iterator const_export_reduce_new_iterator;
23715e44e66adc350adb4fe0533a442092c64333ab5David Gross  const_export_reduce_new_iterator export_reduce_new_begin() const {
23815e44e66adc350adb4fe0533a442092c64333ab5David Gross    return mExportReduceNew.begin();
23915e44e66adc350adb4fe0533a442092c64333ab5David Gross  }
24015e44e66adc350adb4fe0533a442092c64333ab5David Gross  const_export_reduce_new_iterator export_reduce_new_end() const {
24115e44e66adc350adb4fe0533a442092c64333ab5David Gross    return mExportReduceNew.end();
24215e44e66adc350adb4fe0533a442092c64333ab5David Gross  }
24315e44e66adc350adb4fe0533a442092c64333ab5David Gross  inline bool hasExportReduceNew() const { return !mExportReduceNew.empty(); }
24415e44e66adc350adb4fe0533a442092c64333ab5David Gross  void addExportReduceNew(RSExportReduceNew *ReduceNew) {
24515e44e66adc350adb4fe0533a442092c64333ab5David Gross    mExportReduceNew.push_back(ReduceNew);
24615e44e66adc350adb4fe0533a442092c64333ab5David Gross  }
24715e44e66adc350adb4fe0533a442092c64333ab5David Gross
2489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportTypeMap::iterator export_type_iterator;
2499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportTypeMap::const_iterator const_export_type_iterator;
2509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator export_types_begin() { return mExportTypes.begin(); }
2519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator export_types_end() { return mExportTypes.end(); }
2529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator export_types_begin() const {
2539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.begin();
2549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator export_types_end() const {
2569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.end();
2579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportType() const { return !mExportTypes.empty(); }
2599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator findExportType(const llvm::StringRef &TypeName) {
2609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.find(TypeName);
2619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator findExportType(const llvm::StringRef &TypeName)
2639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const {
2649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.find(TypeName);
2659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Insert the specified Typename/Type pair into the map. If the key already
2689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // exists in the map, return false and ignore the request, otherwise insert it
2699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // and return true.
2709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool insertExportType(const llvm::StringRef &TypeName, RSExportType *Type);
2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
27296ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  int getVersion() const { return version; }
27396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  void setVersion(int v) {
27496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines    version = v;
27596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  }
27696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines
27712fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet  bool isCompatLib() const {
27812fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet    // If we are not targeting the actual Android Renderscript classes,
27912fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet    // we should reflect code that works with the compatibility library.
28012fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet    return (mRSPackageName.compare("android.renderscript") != 0);
28112fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet  }
28282754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines
2833fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  void addPragma(const std::string &T, const std::string &V) {
2843fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines    mPragmas->push_back(make_pair(T, V));
2853fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  }
286109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  void setPrecision(const std::string &P) { mPrecision = P; }
287109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  std::string getPrecision() { return mPrecision; }
2883fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines
289d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  // Report an error or a warning to the user.
290ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
291d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder Report(clang::DiagnosticsEngine::Level Level,
292ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                             const char (&Message)[N]) {
293ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticsEngine *DiagEngine = getDiagnostics();
294ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  return DiagEngine->Report(DiagEngine->getCustomDiagID(Level, Message));
295ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray}
296ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
297ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
298d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder Report(clang::DiagnosticsEngine::Level Level,
299ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                             const clang::SourceLocation Loc,
300ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                             const char (&Message)[N]) {
301ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticsEngine *DiagEngine = getDiagnostics();
302ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  const clang::SourceManager *SM = getSourceManager();
303ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  return DiagEngine->Report(clang::FullSourceLoc(Loc, *SM),
304ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                            DiagEngine->getCustomDiagID(Level, Message));
305ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray}
306d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
307d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  // Utility functions to report errors and warnings to make the calling code
308d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  // easier to read.
309ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
310ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticBuilder ReportError(const char (&Message)[N]) {
311ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Error, Message);
312d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
313ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
314ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
315d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder ReportError(const clang::SourceLocation Loc,
316ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                       const char (&Message)[N]) {
317ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Error, Loc, Message);
318d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
319ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
320ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
321ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticBuilder ReportWarning(const char (&Message)[N]) {
322ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Warning, Message);
323d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
324ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
325ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
326d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder ReportWarning(const clang::SourceLocation Loc,
327ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                         const char (&Message)[N]) {
328ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Warning, Loc, Message);
329d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
330d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
3319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ~RSContext();
332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
336e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_  NOLINT
337