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;
59a41ce1d98094da84643995d40d71c529905123fcZonr Chang  class RSExportType;
60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSContext {
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportVarSet;
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportFuncSet;
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringSet<> NeedExportTypeSet;
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
67a41ce1d98094da84643995d40d71c529905123fcZonr Chang  typedef std::list<RSExportable*> ExportableList;
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<RSExportVar*> ExportVarList;
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<RSExportFunc*> ExportFuncList;
70fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  typedef std::vector<RSExportForEach*> ExportForEachVector;
71c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  typedef std::list<RSExportReduce*> ExportReduceList;
7265f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
7365f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  // WARNING: Sorted by pointer value, resulting in unpredictable order
748ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross  typedef std::unordered_set<RSExportType*> ExportReduceResultTypeSet;
7565f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef llvm::StringMap<RSExportType*> ExportTypeMap;
779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
799e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  clang::Preprocessor &mPP;
809e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  clang::ASTContext &mCtx;
813fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  PragmaList *mPragmas;
82109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  // Precision specified via pragma, either rs_fp_full or rs_fp_relaxed. If
83109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  // empty, rs_fp_full is assumed.
84109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  std::string mPrecision;
85c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes  unsigned int mTargetAPI;
86fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines  bool mVerbose;
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
88b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainar  const llvm::DataLayout &mDataLayout;
899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  llvm::LLVMContext &mLLVMContext;
909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
91a41ce1d98094da84643995d40d71c529905123fcZonr Chang  ExportableList mExportables;
92a41ce1d98094da84643995d40d71c529905123fcZonr Chang
939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  NeedExportTypeSet mNeedExportTypes;
949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string *mLicenseNote;
969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mReflectJavaPackageName;
979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mReflectJavaPathName;
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
990a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines  std::string mRSPackageName;
1000a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines
10196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  int version;
10282754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines
1032eb9a3f7c48fe54eb4e813d80e3363bc79553a1eStephen Hines  std::unique_ptr<clang::MangleContext> mMangleCtx;
10496ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines
1059ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  bool mIs64Bit;
1069ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines
1079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportVar(const clang::VarDecl *VD);
1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportFunc(const clang::FunctionDecl *FD);
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool processExportType(const llvm::StringRef &Name);
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
111fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  int getForEachSlotNumber(const clang::StringRef& funcName);
112fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  unsigned mNextSlot;
113c17e198ffcd37bfc57e3add1f6eee952ae2a2eabStephen Hines
114d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  // For diagnostic purposes, we record the order in which we parse
115d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  // foreach kernels -- which is not necessarily the same order in
116d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  // which they appear in mExportForEach.
117d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  unsigned mNextForEachOrdinal;
118d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportVarList mExportVars;
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportFuncList mExportFuncs;
121fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  std::map<llvm::StringRef, unsigned> mExportForEachMap;
122fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  ExportForEachVector mExportForEach;
12340bac5d72af8fe32ab3d0bb38aafb5c65d8d9dfaYang Ni  ExportForEachVector::iterator mFirstOldStyleKernel;
124c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  ExportReduceList mExportReduce;
1258ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross  ExportReduceResultTypeSet mExportReduceResultType;
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ExportTypeMap mExportTypes;
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
128fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  clang::QualType mAllocationType;
1292615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  clang::QualType mScriptCallType;
130fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni
1315e306b944425a952fe744f59d828538137a59375David Gross  std::set<const clang::FunctionDecl *> mUsedByReducePragmaFns;
1325e306b944425a952fe744f59d828538137a59375David Gross
1335e306b944425a952fe744f59d828538137a59375David Gross  // Populated by markUsedByReducePragma().
1345e306b944425a952fe744f59d828538137a59375David Gross  // Consumed by processReducePragmas().
1355e306b944425a952fe744f59d828538137a59375David Gross  std::vector<clang::VarDecl *> mUsedByReducePragmaDummyVars;
1365e306b944425a952fe744f59d828538137a59375David Gross
1379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
1389e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  RSContext(clang::Preprocessor &PP,
1399e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines            clang::ASTContext &Ctx,
1403fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines            const clang::TargetInfo &Target,
1414cc67fce91f43215d61b2695746eab102a3db516Stephen Hines            PragmaList *Pragmas,
142fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines            unsigned int TargetAPI,
143fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines            bool Verbose);
1449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1455e306b944425a952fe744f59d828538137a59375David Gross  enum CheckName { CheckNameNo, CheckNameYes };
1465e306b944425a952fe744f59d828538137a59375David Gross
1475e306b944425a952fe744f59d828538137a59375David Gross  static bool isSyntheticName(const llvm::StringRef Name) { return Name.startswith(".rs."); }
1485e306b944425a952fe744f59d828538137a59375David Gross
1499e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  inline clang::Preprocessor &getPreprocessor() const { return mPP; }
1509e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines  inline clang::ASTContext &getASTContext() const { return mCtx; }
151be27482cdeaf08576bc39b72a15d35d13014a636Logan  inline clang::MangleContext &getMangleContext() const {
152be27482cdeaf08576bc39b72a15d35d13014a636Logan    return *mMangleCtx;
153f2174cfd6a556b51aadf2b8765e50df080e8f18eStephen Hines  }
154b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainar  inline const llvm::DataLayout &getDataLayout() const { return mDataLayout; }
1559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; }
1569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const clang::SourceManager *getSourceManager() const {
1579e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines    return &mPP.getSourceManager();
1589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1599207a2e495c8363606861e4f034504ec5c153dabLogan Chien  inline clang::DiagnosticsEngine *getDiagnostics() const {
1602ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines    return &mPP.getDiagnostics();
1612ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines  }
162c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes  inline unsigned int getTargetAPI() const {
1634a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines    return mTargetAPI;
1644a4bf92a8add68629a7e6e59ef81c3c3fe603a75Stephen Hines  }
1659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
166fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines  inline bool getVerbose() const {
167fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines    return mVerbose;
168fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines  }
1699ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  inline bool is64Bit() const {
1709ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines    return mIs64Bit;
1719ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  }
172fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines
1739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setLicenseNote(const std::string &S) {
1749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mLicenseNote = new std::string(S);
1759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const std::string *getLicenseNote() const { return mLicenseNote; }
1779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void addExportType(const std::string &S) {
1799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mNeedExportTypes.insert(S);
1809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
1819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline void setReflectJavaPackageName(const std::string &S) {
1839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    mReflectJavaPackageName = S;
1849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
185dde98533fad4c6534af537ae583aa4db35a1c699Tim Murray  inline const std::string &getReflectJavaPackageName() const {
1864cc67fce91f43215d61b2695746eab102a3db516Stephen Hines    return mReflectJavaPackageName;
1874cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  }
1889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1890a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines  inline void setRSPackageName(const std::string &S) {
1900a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines    mRSPackageName = S;
1910a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines  }
19212fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet
19312fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet  inline const std::string &getRSPackageName() const { return mRSPackageName; }
1940a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines
19588f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni  void setAllocationType(const clang::TypeDecl* TD);
19688f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni  inline const clang::QualType& getAllocationType() const {
19788f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni    return mAllocationType;
19888f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni  }
19988f21e16250d2e52a75607b7f0c396e1c2a34201Yang Ni
2002615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  void setScriptCallType(const clang::TypeDecl* TD);
2012615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  inline const clang::QualType& getScriptCallType() const {
2022615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni    return mScriptCallType;
2032615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni  }
2042615f383dfc1542a05f19aee23b03a09bd018f4eYang Ni
205fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  bool addForEach(const clang::FunctionDecl* FD);
206d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross
207fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  bool processExports();
208a41ce1d98094da84643995d40d71c529905123fcZonr Chang  inline void newExportable(RSExportable *E) {
2095abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes    if (E != nullptr)
210a41ce1d98094da84643995d40d71c529905123fcZonr Chang      mExportables.push_back(E);
211a41ce1d98094da84643995d40d71c529905123fcZonr Chang  }
212641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  typedef ExportableList::iterator exportable_iterator;
213641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  exportable_iterator exportable_begin() {
214641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    return mExportables.begin();
215641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  }
216641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  exportable_iterator exportable_end() {
217641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    return mExportables.end();
218641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  }
2199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportVarList::const_iterator const_export_var_iterator;
2219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_var_iterator export_vars_begin() const {
2229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportVars.begin();
2239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_var_iterator export_vars_end() const {
2259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportVars.end();
2269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportVar() const {
2289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return !mExportVars.empty();
2299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
230d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  size_t export_vars_size() const {
231d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross    return mExportVars.size();
232d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  }
2339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
2349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportFuncList::const_iterator const_export_func_iterator;
2359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_func_iterator export_funcs_begin() const {
2369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportFuncs.begin();
2379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_func_iterator export_funcs_end() const {
2399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportFuncs.end();
2409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
2419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportFunc() const { return !mExportFuncs.empty(); }
242d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  size_t export_funcs_size() const {
243d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross    return mExportFuncs.size();
244d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  }
2459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
246fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  typedef ExportForEachVector::const_iterator const_export_foreach_iterator;
247593a894650e81be54173106ec266f0311cebebd3Stephen Hines  const_export_foreach_iterator export_foreach_begin() const {
248593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return mExportForEach.begin();
249593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
250593a894650e81be54173106ec266f0311cebebd3Stephen Hines  const_export_foreach_iterator export_foreach_end() const {
251593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return mExportForEach.end();
252593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
253593a894650e81be54173106ec266f0311cebebd3Stephen Hines  inline bool hasExportForEach() const { return !mExportForEach.empty(); }
254fb40ee2a90f37967bf4a40a18dec7f60e5c580d8Yang Ni  int getForEachSlotNumber(const clang::FunctionDecl* FD);
255593a894650e81be54173106ec266f0311cebebd3Stephen Hines
256d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  // count up from zero
257d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  unsigned getNextForEachOrdinal() { return mNextForEachOrdinal++; }
258d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  unsigned getNumAssignedForEachOrdinals() const { return mNextForEachOrdinal; }
259d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross
260c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  typedef ExportReduceList::const_iterator const_export_reduce_iterator;
261c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  const_export_reduce_iterator export_reduce_begin() const {
262c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala    return mExportReduce.begin();
263c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  }
264c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  const_export_reduce_iterator export_reduce_end() const {
265c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala    return mExportReduce.end();
266c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  }
267d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  size_t export_reduce_size() const {
268d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross    return mExportReduce.size();
269d80e58b259c2febc4907aed4aca9d88d43bdd1a1David Gross  }
270c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala  inline bool hasExportReduce() const { return !mExportReduce.empty(); }
2718ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross  void addExportReduce(RSExportReduce *Reduce) {
2728ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross    mExportReduce.push_back(Reduce);
27315e44e66adc350adb4fe0533a442092c64333ab5David Gross  }
2745e306b944425a952fe744f59d828538137a59375David Gross  bool processReducePragmas(Backend *BE);
2755e306b944425a952fe744f59d828538137a59375David Gross  void markUsedByReducePragma(clang::FunctionDecl *FD, CheckName Check);
27665f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
27765f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  // If the type has already been inserted, has no effect.
2788ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross  void insertExportReduceResultType(RSExportType *Type) { mExportReduceResultType.insert(Type); }
27965f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
280277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross  template <class FilterIn, class Compare>
2818ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross  std::vector<RSExportType *> getReduceResultTypes(FilterIn Filt, Compare Comp) const {
282277fd5e6545c8ba1272027ee6e6bc55a96316dc0David Gross    std::vector<RSExportType *> Return;
2838ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross    std::copy_if(mExportReduceResultType.begin(), mExportReduceResultType.end(), std::back_inserter(Return), Filt);
28465f23ed862e1a1e16477ba740f295ff4a83ac822David Gross    std::sort(Return.begin(), Return.end(), Comp);
285812dcd0b28c68363bba2f132ff2bdff6577ba9b7David Gross    auto ReturnNewEndIter = std::unique(Return.begin(), Return.end(),
286812dcd0b28c68363bba2f132ff2bdff6577ba9b7David Gross                                        [Comp](const RSExportType *a, const RSExportType *b) {
287812dcd0b28c68363bba2f132ff2bdff6577ba9b7David Gross                                          return !Comp(a, b) && !Comp(b, a);
288812dcd0b28c68363bba2f132ff2bdff6577ba9b7David Gross                                        });
289812dcd0b28c68363bba2f132ff2bdff6577ba9b7David Gross    Return.erase(ReturnNewEndIter, Return.end());
29065f23ed862e1a1e16477ba740f295ff4a83ac822David Gross    return Return;
29165f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  }
29215e44e66adc350adb4fe0533a442092c64333ab5David Gross
2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportTypeMap::iterator export_type_iterator;
2949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef ExportTypeMap::const_iterator const_export_type_iterator;
2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator export_types_begin() { return mExportTypes.begin(); }
2969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator export_types_end() { return mExportTypes.end(); }
2979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator export_types_begin() const {
2989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.begin();
2999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
3009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator export_types_end() const {
3019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.end();
3029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasExportType() const { return !mExportTypes.empty(); }
3049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  export_type_iterator findExportType(const llvm::StringRef &TypeName) {
3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.find(TypeName);
3069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
3079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const_export_type_iterator findExportType(const llvm::StringRef &TypeName)
3089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      const {
3099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mExportTypes.find(TypeName);
3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
3119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Insert the specified Typename/Type pair into the map. If the key already
3139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // exists in the map, return false and ignore the request, otherwise insert it
3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // and return true.
3159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  bool insertExportType(const llvm::StringRef &TypeName, RSExportType *Type);
3169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
31796ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  int getVersion() const { return version; }
31896ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  void setVersion(int v) {
31996ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines    version = v;
32096ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines  }
32196ab06cbe40b2d73c0eb614f814cd761d8962b6bStephen Hines
32212fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet  bool isCompatLib() const {
32312fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet    // If we are not targeting the actual Android Renderscript classes,
32412fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet    // we should reflect code that works with the compatibility library.
32512fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet    return (mRSPackageName.compare("android.renderscript") != 0);
32612fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet  }
32782754d87921c94e70562aa977cc92e28fc38b1d0Stephen Hines
3283fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  void addPragma(const std::string &T, const std::string &V) {
3293fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines    mPragmas->push_back(make_pair(T, V));
3303fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  }
331109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  void setPrecision(const std::string &P) { mPrecision = P; }
332109e90a854ac8d8f4df24ef27db636a641ba9913Jean-Luc Brouillet  std::string getPrecision() { return mPrecision; }
3333fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines
334d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  // Report an error or a warning to the user.
335ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
336d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder Report(clang::DiagnosticsEngine::Level Level,
3372ba142526058ce034115cab424837c2bab705e0aDavid Gross                                             const char (&Message)[N]) const {
338ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticsEngine *DiagEngine = getDiagnostics();
339ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  return DiagEngine->Report(DiagEngine->getCustomDiagID(Level, Message));
3405e306b944425a952fe744f59d828538137a59375David Gross  }
341ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
342ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
343d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder Report(clang::DiagnosticsEngine::Level Level,
344ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                                             const clang::SourceLocation Loc,
3452ba142526058ce034115cab424837c2bab705e0aDavid Gross                                             const char (&Message)[N]) const {
346ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DiagnosticsEngine *DiagEngine = getDiagnostics();
347ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  const clang::SourceManager *SM = getSourceManager();
348ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  return DiagEngine->Report(clang::FullSourceLoc(Loc, *SM),
349ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray                            DiagEngine->getCustomDiagID(Level, Message));
3505e306b944425a952fe744f59d828538137a59375David Gross  }
351d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
352d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  // Utility functions to report errors and warnings to make the calling code
353d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  // easier to read.
354ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
3552ba142526058ce034115cab424837c2bab705e0aDavid Gross  clang::DiagnosticBuilder ReportError(const char (&Message)[N]) const {
356ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Error, Message);
357d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
358ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
359ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
360d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder ReportError(const clang::SourceLocation Loc,
3612ba142526058ce034115cab424837c2bab705e0aDavid Gross                                       const char (&Message)[N]) const {
362ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Error, Loc, Message);
363d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
364ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
365ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
3662ba142526058ce034115cab424837c2bab705e0aDavid Gross  clang::DiagnosticBuilder ReportWarning(const char (&Message)[N]) const {
367ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Warning, Message);
368d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
369ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray
370ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  template <unsigned N>
371d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  clang::DiagnosticBuilder ReportWarning(const clang::SourceLocation Loc,
3722ba142526058ce034115cab424837c2bab705e0aDavid Gross                                         const char (&Message)[N]) const {
373ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray    return Report<N>(clang::DiagnosticsEngine::Warning, Loc, Message);
374d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet  }
375d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet
3769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ~RSContext();
377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao};
378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
380462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
381e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_CONTEXT_H_  NOLINT
382