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