slang_rs_context.h revision 5e306b944425a952fe744f59d828538137a59375
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>
235e306b944425a952fe744f59d828538137a59375David Gross#include <set>
24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
2565f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#include <unordered_set>
26fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni#include <vector>
27e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
28e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Lex/Preprocessor.h"
29be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "clang/AST/Mangle.h"
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringSet.h"
329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "llvm/ADT/StringMap.h"
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3434e6205f1d5ceb90a73192cee8b215fa0b7ab306David Gross#include "slang_pragma_list.h"
353fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines
36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace llvm {
376315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class LLVMContext;
3823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  class DataLayout;
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace llvm
40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class VarDecl;
436315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class ASTContext;
446315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class TargetInfo;
456315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class FunctionDecl;
46fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  class QualType;
476315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class SourceManager;
48fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  class TypeDecl;
4965f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  class FunctionDecl;
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
535e306b944425a952fe744f59d828538137a59375David Gross  class Backend;
54a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportable;
55a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportVar;
56a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportFunc;
57593a894650e81be54173106ec266f0311cebebd3Stephen Hines  class RSExportForEach;
58c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  class RSExportReduce;
5915e44e66adc350adb4fe0533a442092c64333ab5David Gross  class RSExportReduceNew;
60a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportType;
61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext {
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportVarSet;
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportFuncSet;
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportTypeSet;
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
68a41ce1d98094da84643995d40d71c529905123fcZonr Chang  typedef std::list<RSExportable*> ExportableList;
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<RSExportVar*> ExportVarList;
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<RSExportFunc*> ExportFuncList;
71fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  typedef std::vector<RSExportForEach*> ExportForEachVector;
72c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  typedef std::list<RSExportReduce*> ExportReduceList;
7315e44e66adc350adb4fe0533a442092c64333ab5David Gross  typedef std::list<RSExportReduceNew*> ExportReduceNewList;
7465f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
7565f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  // WARNING: Sorted by pointer value, resulting in unpredictable order
7665f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  typedef std::unordered_set<RSExportType*> ExportReduceNewResultTypeSet;
7765f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringMap<RSExportType*> ExportTypeMap;
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
819e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  clang::Preprocessor &mPP;
829e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  clang::ASTContext &mCtx;
833fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  PragmaList *mPragmas;
84109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  // Precision specified via pragma, either rs_fp_full or rs_fp_relaxed. If
85109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  // empty, rs_fp_full is assumed.
86109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  std::string mPrecision;
87c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes  unsigned int mTargetAPI;
88fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines  bool mVerbose;
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
9023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  llvm::DataLayout *mDataLayout;
919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  llvm::LLVMContext &mLLVMContext;
929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
93a41ce1d98094da84643995d40d71c529905123fcZonr Chang  ExportableList mExportables;
94a41ce1d98094da84643995d40d71c529905123fcZonr Chang
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  NeedExportTypeSet mNeedExportTypes;
969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string *mLicenseNote;
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mReflectJavaPackageName;
999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mReflectJavaPathName;
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1010a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines  std::string mRSPackageName;
1020a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines
10396ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  int version;
10482754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines
1052eb9a3f7c48fe54eb4e813d80e3363bc79553a1eStephen Hines  std::unique_ptr<clang::MangleContext> mMangleCtx;
10696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines
1079ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  bool mIs64Bit;
1089ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportVar(const clang::VarDecl *VD);
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportFunc(const clang::FunctionDecl *FD);
1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportType(const llvm::StringRef &Name);
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
113fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  int getForEachSlotNumber(const clang::StringRef& funcName);
114fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  unsigned mNextSlot;
115c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportVarList mExportVars;
1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportFuncList mExportFuncs;
118fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  std::map<llvm::StringRef, unsigned> mExportForEachMap;
119fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  ExportForEachVector mExportForEach;
120c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  ExportReduceList mExportReduce;
12115e44e66adc350adb4fe0533a442092c64333ab5David Gross  ExportReduceNewList mExportReduceNew;
12265f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  ExportReduceNewResultTypeSet mExportReduceNewResultType;
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportTypeMap mExportTypes;
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
125fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  clang::QualType mAllocationType;
1262615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  clang::QualType mScriptCallType;
127fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
1285e306b944425a952fe744f59d828538137a59375David Gross  std::set<const clang::FunctionDecl *> mUsedByReducePragmaFns;
1295e306b944425a952fe744f59d828538137a59375David Gross
1305e306b944425a952fe744f59d828538137a59375David Gross  // Populated by markUsedByReducePragma().
1315e306b944425a952fe744f59d828538137a59375David Gross  // Consumed by processReducePragmas().
1325e306b944425a952fe744f59d828538137a59375David Gross  std::vector<clang::VarDecl *> mUsedByReducePragmaDummyVars;
1335e306b944425a952fe744f59d828538137a59375David Gross
1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
1359e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  RSContext(clang::Preprocessor &PP,
1369e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines            clang::ASTContext &Ctx,
1373fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines            const clang::TargetInfo &Target,
1384cc67fce91f43215d61b2695746eab102a3db516Stephen Hines            PragmaList *Pragmas,
139fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines            unsigned int TargetAPI,
140fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines            bool Verbose);
1419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1425e306b944425a952fe744f59d828538137a59375David Gross  enum CheckName { CheckNameNo, CheckNameYes };
1435e306b944425a952fe744f59d828538137a59375David Gross
1445e306b944425a952fe744f59d828538137a59375David Gross  static bool isSyntheticName(const llvm::StringRef Name) { return Name.startswith(".rs."); }
1455e306b944425a952fe744f59d828538137a59375David Gross
1469e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  inline clang::Preprocessor &getPreprocessor() const { return mPP; }
1479e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  inline clang::ASTContext &getASTContext() const { return mCtx; }
148be27482cdeaf08576bc39b72a15d35d13014a636Logan  inline clang::MangleContext &getMangleContext() const {
149be27482cdeaf08576bc39b72a15d35d13014a636Logan    return *mMangleCtx;
150f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines  }
15123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  inline const llvm::DataLayout *getDataLayout() const { return mDataLayout; }
1529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; }
1539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const clang::SourceManager *getSourceManager() const {
1549e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines    return &mPP.getSourceManager();
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1569207a2e495c8363606861e4f034504ec5c153dabLogan Chien  inline clang::DiagnosticsEngine *getDiagnostics() const {
1572ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines    return &mPP.getDiagnostics();
1582ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines  }
159c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes  inline unsigned int getTargetAPI() const {
1604a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines    return mTargetAPI;
1614a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines  }
1629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
163fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines  inline bool getVerbose() const {
164fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines    return mVerbose;
165fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines  }
1669ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  inline bool is64Bit() const {
1679ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines    return mIs64Bit;
1689ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  }
169fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines
1709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setLicenseNote(const std::string &S) {
1719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mLicenseNote = new std::string(S);
1729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const std::string *getLicenseNote() const { return mLicenseNote; }
1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void addExportType(const std::string &S) {
1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mNeedExportTypes.insert(S);
1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setReflectJavaPackageName(const std::string &S) {
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mReflectJavaPackageName = S;
1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
182dde98533fad4c6534af537ae583aa4db35a1c699Tim Murray  inline const std::string &getReflectJavaPackageName() const {
1834cc67fce91f43215d61b2695746eab102a3db516Stephen Hines    return mReflectJavaPackageName;
1844cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  }
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1860a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines  inline void setRSPackageName(const std::string &S) {
1870a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines    mRSPackageName = S;
1880a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines  }
18912fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet
19012fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet  inline const std::string &getRSPackageName() const { return mRSPackageName; }
1910a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines
19288f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni  void setAllocationType(const clang::TypeDecl* TD);
19388f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni  inline const clang::QualType& getAllocationType() const {
19488f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni    return mAllocationType;
19588f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni  }
19688f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni
1972615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  void setScriptCallType(const clang::TypeDecl* TD);
1982615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  inline const clang::QualType& getScriptCallType() const {
1992615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni    return mScriptCallType;
2002615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  }
2012615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni
202fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  bool addForEach(const clang::FunctionDecl* FD);
203fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  bool processExports();
204a41ce1d98094da84643995d40d71c529905123fcZonr Chang  inline void newExportable(RSExportable *E) {
2055abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes    if (E != nullptr)
206a41ce1d98094da84643995d40d71c529905123fcZonr Chang      mExportables.push_back(E);
207a41ce1d98094da84643995d40d71c529905123fcZonr Chang  }
208641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  typedef ExportableList::iterator exportable_iterator;
209641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  exportable_iterator exportable_begin() {
210641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    return mExportables.begin();
211641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  }
212641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  exportable_iterator exportable_end() {
213641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    return mExportables.end();
214641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  }
2159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportVarList::const_iterator const_export_var_iterator;
2179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_var_iterator export_vars_begin() const {
2189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportVars.begin();
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_var_iterator export_vars_end() const {
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportVars.end();
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportVar() const {
2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return !mExportVars.empty();
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportFuncList::const_iterator const_export_func_iterator;
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_func_iterator export_funcs_begin() const {
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportFuncs.begin();
2309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_func_iterator export_funcs_end() const {
2329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportFuncs.end();
2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportFunc() const { return !mExportFuncs.empty(); }
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
236fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  typedef ExportForEachVector::const_iterator const_export_foreach_iterator;
237593a894650e81be54173106ec266f0311cebebd3Stephen Hines  const_export_foreach_iterator export_foreach_begin() const {
238593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return mExportForEach.begin();
239593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
240593a894650e81be54173106ec266f0311cebebd3Stephen Hines  const_export_foreach_iterator export_foreach_end() const {
241593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return mExportForEach.end();
242593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
243593a894650e81be54173106ec266f0311cebebd3Stephen Hines  inline bool hasExportForEach() const { return !mExportForEach.empty(); }
244fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  int getForEachSlotNumber(const clang::FunctionDecl* FD);
245593a894650e81be54173106ec266f0311cebebd3Stephen Hines
246c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  typedef ExportReduceList::const_iterator const_export_reduce_iterator;
247c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  const_export_reduce_iterator export_reduce_begin() const {
248c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala    return mExportReduce.begin();
249c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  }
250c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  const_export_reduce_iterator export_reduce_end() const {
251c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala    return mExportReduce.end();
252c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  }
253c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  inline bool hasExportReduce() const { return !mExportReduce.empty(); }
254c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala
25515e44e66adc350adb4fe0533a442092c64333ab5David Gross  typedef ExportReduceNewList::const_iterator const_export_reduce_new_iterator;
25615e44e66adc350adb4fe0533a442092c64333ab5David Gross  const_export_reduce_new_iterator export_reduce_new_begin() const {
25715e44e66adc350adb4fe0533a442092c64333ab5David Gross    return mExportReduceNew.begin();
25815e44e66adc350adb4fe0533a442092c64333ab5David Gross  }
25915e44e66adc350adb4fe0533a442092c64333ab5David Gross  const_export_reduce_new_iterator export_reduce_new_end() const {
26015e44e66adc350adb4fe0533a442092c64333ab5David Gross    return mExportReduceNew.end();
26115e44e66adc350adb4fe0533a442092c64333ab5David Gross  }
26215e44e66adc350adb4fe0533a442092c64333ab5David Gross  inline bool hasExportReduceNew() const { return !mExportReduceNew.empty(); }
26315e44e66adc350adb4fe0533a442092c64333ab5David Gross  void addExportReduceNew(RSExportReduceNew *ReduceNew) {
26415e44e66adc350adb4fe0533a442092c64333ab5David Gross    mExportReduceNew.push_back(ReduceNew);
26515e44e66adc350adb4fe0533a442092c64333ab5David Gross  }
2665e306b944425a952fe744f59d828538137a59375David Gross  bool processReducePragmas(Backend *BE);
2675e306b944425a952fe744f59d828538137a59375David Gross  void markUsedByReducePragma(clang::FunctionDecl *FD, CheckName Check);
26865f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
26965f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  // If the type has already been inserted, has no effect.
27065f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  void insertExportReduceNewResultType(RSExportType *Type) { mExportReduceNewResultType.insert(Type); }
27165f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
272277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross  template <class FilterIn, class Compare>
273277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross  std::vector<RSExportType *> getReduceNewResultTypes(FilterIn Filt, Compare Comp) const {
274277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross    std::vector<RSExportType *> Return;
275277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross    std::copy_if(mExportReduceNewResultType.begin(), mExportReduceNewResultType.end(), std::back_inserter(Return), Filt);
27665f23ed862e1a1e16477ba740f295ff4a83ac822David Gross    std::sort(Return.begin(), Return.end(), Comp);
27765f23ed862e1a1e16477ba740f295ff4a83ac822David Gross    return Return;
27865f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  }
27915e44e66adc350adb4fe0533a442092c64333ab5David Gross
2809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportTypeMap::iterator export_type_iterator;
2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportTypeMap::const_iterator const_export_type_iterator;
2829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator export_types_begin() { return mExportTypes.begin(); }
2839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator export_types_end() { return mExportTypes.end(); }
2849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator export_types_begin() const {
2859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.begin();
2869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator export_types_end() const {
2889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.end();
2899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportType() const { return !mExportTypes.empty(); }
2919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator findExportType(const llvm::StringRef &TypeName) {
2929ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.find(TypeName);
2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator findExportType(const llvm::StringRef &TypeName)
2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const {
2969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.find(TypeName);
2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Insert the specified Typename/Type pair into the map. If the key already
3009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // exists in the map, return false and ignore the request, otherwise insert it
3019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // and return true.
3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool insertExportType(const llvm::StringRef &TypeName, RSExportType *Type);
3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
30496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  int getVersion() const { return version; }
30596ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  void setVersion(int v) {
30696ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines    version = v;
30796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  }
30896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines
30912fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet  bool isCompatLib() const {
31012fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet    // If we are not targeting the actual Android Renderscript classes,
31112fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet    // we should reflect code that works with the compatibility library.
31212fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet    return (mRSPackageName.compare("android.renderscript") != 0);
31312fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet  }
31482754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines
3153fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  void addPragma(const std::string &T, const std::string &V) {
3163fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines    mPragmas->push_back(make_pair(T, V));
3173fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  }
318109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  void setPrecision(const std::string &P) { mPrecision = P; }
319109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  std::string getPrecision() { return mPrecision; }
3203fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines
321d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  // Report an error or a warning to the user.
322ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
323d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder Report(clang::DiagnosticsEngine::Level Level,
324ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                             const char (&Message)[N]) {
325ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticsEngine *DiagEngine = getDiagnostics();
326ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  return DiagEngine->Report(DiagEngine->getCustomDiagID(Level, Message));
3275e306b944425a952fe744f59d828538137a59375David Gross  }
328ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
329ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
330d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder Report(clang::DiagnosticsEngine::Level Level,
331ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                             const clang::SourceLocation Loc,
332ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                             const char (&Message)[N]) {
333ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticsEngine *DiagEngine = getDiagnostics();
334ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  const clang::SourceManager *SM = getSourceManager();
335ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  return DiagEngine->Report(clang::FullSourceLoc(Loc, *SM),
336ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                            DiagEngine->getCustomDiagID(Level, Message));
3375e306b944425a952fe744f59d828538137a59375David Gross  }
338d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
339d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  // Utility functions to report errors and warnings to make the calling code
340d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  // easier to read.
341ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
342ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticBuilder ReportError(const char (&Message)[N]) {
343ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Error, Message);
344d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
345ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
346ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
347d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder ReportError(const clang::SourceLocation Loc,
348ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                       const char (&Message)[N]) {
349ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Error, Loc, Message);
350d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
351ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
352ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
353ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticBuilder ReportWarning(const char (&Message)[N]) {
354ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Warning, Message);
355d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
356ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
357ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
358d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder ReportWarning(const clang::SourceLocation Loc,
359ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                         const char (&Message)[N]) {
360ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Warning, Loc, Message);
361d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
362d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
3639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ~RSContext();
364462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
365462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
368e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_  NOLINT
369