slang_rs.h revision 2e35b136cc2434080fcd682d2f95e53a87675dd4
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, 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_H_ // NOLINT 18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_ 193a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 203a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang.h" 213a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 22cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang#include <list> 23cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang#include <string> 24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <utility> 25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <vector> 26cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 27641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang#include "llvm/ADT/StringMap.h" 28641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 29cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang#include "slang_rs_reflect_utils.h" 30cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 312e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines// Define minimum and maximum target API versions. These correspond to the same 322e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines// API levels used by the standard Android SDK. 332e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines// 342e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines// 12 - Honeycomb MR1 352e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines// 13 - Honeycomb MR2 362e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines// 14 - Ice Cream Sandwich 372e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines// ... 382e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines#define RS_MINIMUM_TARGET_API 12 392e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines#define RS_MAXIMUM_TARGET_API RS_VERSION 402e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines 41fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hinesnamespace clang { 42fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines class FunctionDecl; 43fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines} 44fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines 453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changnamespace slang { 463a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class RSContext; 47641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang class RSExportRecordType; 483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclass SlangRS : public Slang { 503a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang private: 513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // Context for RenderScript 523a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang RSContext *mRSContext; 533a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang bool mAllowRSPrefix; 553a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 562e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines unsigned int mTargetAPI; 572e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines 58641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Custom diagnostic identifiers 59641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang unsigned mDiagErrorInvalidOutputDepParameter; 60641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang unsigned mDiagErrorODR; 612e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines unsigned mDiagErrorTargetAPIRange; 62641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 634cc67fce91f43215d61b2695746eab102a3db516Stephen Hines // Collect generated filenames (without the .java) for dependency generation 644cc67fce91f43215d61b2695746eab102a3db516Stephen Hines std::vector<std::string> mGeneratedFileNames; 654cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 66641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // FIXME: Should be std::list<RSExportable *> here. But currently we only 67641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // check ODR on record type. 68641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // 69641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // ReflectedDefinitions maps record type name to a pair: 70641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // <its RSExportRecordType instance, 71641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // the first file contains this record type definition> 72641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang typedef std::pair<RSExportRecordType*, const char*> ReflectedDefinitionTy; 73641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang typedef llvm::StringMap<ReflectedDefinitionTy> ReflectedDefinitionListTy; 74641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang ReflectedDefinitionListTy ReflectedDefinitions; 75641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 76cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // The package name that's really applied will be filled in RealPackageName. 77cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool reflectToJava(const std::string &OutputPathBase, 78cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &OutputPackageName, 79cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang std::string *RealPackageName); 80cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 81cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool generateBitcodeAccessor(const std::string &OutputPathBase, 82cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &PackageName); 83cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 84e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang // CurInputFile is the pointer to a char array holding the input filename 85e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang // and is valid before compile() ends. 86e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang bool checkODR(const char *CurInputFile); 87641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 883a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang protected: 893a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual void initDiagnostic(); 903a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual void initPreprocessor(); 913a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual void initASTContext(); 923a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 933a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual clang::ASTConsumer 943a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang *createBackend(const clang::CodeGenOptions& CodeGenOpts, 953a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::raw_ostream *OS, 963a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Slang::OutputType OT); 973a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 983a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 993a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang public: 100592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang static bool IsRSHeaderFile(const char *File); 101fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines // FIXME: Determine whether a function is in RS header (i.e., one of the RS 102fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines // built-in APIs) should only need its names (we need a "list" of RS 103fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines // built-in APIs). 104fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines static bool IsFunctionInRSHeaderFile(const clang::FunctionDecl *FD, 105fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines const clang::SourceManager &SourceMgr); 106592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang 107641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang SlangRS(); 1083a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 109cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // Compile bunch of RS files given in the llvm-rs-cc arguments. Return true if 110cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // all given input files are successfully compiled without errors. 111cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 112cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @IOFiles - List of pairs of <input file path, output file path>. 113cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 114cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @DepFiles - List of pairs of <output dep. file path, dependent bitcode 115cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // target>. If @OutputDep is true, this parameter must be given 116cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // with the same number of pairs given in @IOFiles. 117cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 118641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // @IncludePaths - User-defined include paths. 119cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 120cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @AdditionalDepTargets - User-defined files added to the dependencies. 121cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 122cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @OutputType - See Slang::OutputType. 123cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 124cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @BitcodeStorage - See BitCodeStorageType in slang_rs_reflect_util.cpp. 125cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 126cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @AllowRSPrefix - true to allow user-defined function prefixed with 'rs'. 127cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 128641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // @OutputDep - true if output dependecies file for each input file. 129cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 130cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @JavaReflectionPathBase - The path base for storing reflection files. 131cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 132cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @JavaReflectionPackageName - The package name given by user in command 133cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // line. This may override the package name 134cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // specified in the .rs using #pragma. 135cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 136cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool compile(const std::list<std::pair<const char*, const char*> > &IOFiles, 137cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::list<std::pair<const char*, const char*> > &DepFiles, 138cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::vector<std::string> &IncludePaths, 139cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::vector<std::string> &AdditionalDepTargets, 140cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang Slang::OutputType OutputType, BitCodeStorageType BitcodeStorage, 141cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool AllowRSPrefix, bool OutputDep, 1422e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines unsigned int TargetAPI, 143cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &JavaReflectionPathBase, 144cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &JavaReflectionPackageName); 1453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 146641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang virtual void reset(); 147641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual ~SlangRS(); 1493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}; 1503a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 1513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 152e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_ NOLINT 153