slang_rs.h revision 4cc67fce91f43215d61b2695746eab102a3db516
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 31fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hinesnamespace clang { 32fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines class FunctionDecl; 33fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines} 34fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines 353a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changnamespace slang { 363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class RSContext; 37641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang class RSExportRecordType; 383a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclass SlangRS : public Slang { 403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang private: 413a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // Context for RenderScript 423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang RSContext *mRSContext; 433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang bool mAllowRSPrefix; 453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 46641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Custom diagnostic identifiers 47641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang unsigned mDiagErrorInvalidOutputDepParameter; 48641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang unsigned mDiagErrorODR; 49641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 504cc67fce91f43215d61b2695746eab102a3db516Stephen Hines // Collect generated filenames (without the .java) for dependency generation 514cc67fce91f43215d61b2695746eab102a3db516Stephen Hines std::vector<std::string> mGeneratedFileNames; 524cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 53641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // FIXME: Should be std::list<RSExportable *> here. But currently we only 54641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // check ODR on record type. 55641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // 56641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // ReflectedDefinitions maps record type name to a pair: 57641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // <its RSExportRecordType instance, 58641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // the first file contains this record type definition> 59641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang typedef std::pair<RSExportRecordType*, const char*> ReflectedDefinitionTy; 60641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang typedef llvm::StringMap<ReflectedDefinitionTy> ReflectedDefinitionListTy; 61641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang ReflectedDefinitionListTy ReflectedDefinitions; 62641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 63cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // The package name that's really applied will be filled in RealPackageName. 64cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool reflectToJava(const std::string &OutputPathBase, 65cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &OutputPackageName, 66cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang std::string *RealPackageName); 67cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 68cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool generateBitcodeAccessor(const std::string &OutputPathBase, 69cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &PackageName); 70cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 71e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang // CurInputFile is the pointer to a char array holding the input filename 72e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang // and is valid before compile() ends. 73e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang bool checkODR(const char *CurInputFile); 74641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 753a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang protected: 763a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual void initDiagnostic(); 773a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual void initPreprocessor(); 783a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual void initASTContext(); 793a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 803a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual clang::ASTConsumer 813a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang *createBackend(const clang::CodeGenOptions& CodeGenOpts, 823a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::raw_ostream *OS, 833a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Slang::OutputType OT); 843a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 853a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 863a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang public: 87592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang static bool IsRSHeaderFile(const char *File); 88fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines // FIXME: Determine whether a function is in RS header (i.e., one of the RS 89fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines // built-in APIs) should only need its names (we need a "list" of RS 90fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines // built-in APIs). 91fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines static bool IsFunctionInRSHeaderFile(const clang::FunctionDecl *FD, 92fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines const clang::SourceManager &SourceMgr); 93592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang 94641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang SlangRS(); 953a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 96cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // Compile bunch of RS files given in the llvm-rs-cc arguments. Return true if 97cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // all given input files are successfully compiled without errors. 98cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 99cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @IOFiles - List of pairs of <input file path, output file path>. 100cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 101cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @DepFiles - List of pairs of <output dep. file path, dependent bitcode 102cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // target>. If @OutputDep is true, this parameter must be given 103cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // with the same number of pairs given in @IOFiles. 104cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 105641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // @IncludePaths - User-defined include paths. 106cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 107cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @AdditionalDepTargets - User-defined files added to the dependencies. 108cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 109cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @OutputType - See Slang::OutputType. 110cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 111cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @BitcodeStorage - See BitCodeStorageType in slang_rs_reflect_util.cpp. 112cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 113cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @AllowRSPrefix - true to allow user-defined function prefixed with 'rs'. 114cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 115641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // @OutputDep - true if output dependecies file for each input file. 116cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 117cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @JavaReflectionPathBase - The path base for storing reflection files. 118cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 119cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @JavaReflectionPackageName - The package name given by user in command 120cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // line. This may override the package name 121cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // specified in the .rs using #pragma. 122cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 123cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool compile(const std::list<std::pair<const char*, const char*> > &IOFiles, 124cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::list<std::pair<const char*, const char*> > &DepFiles, 125cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::vector<std::string> &IncludePaths, 126cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::vector<std::string> &AdditionalDepTargets, 127cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang Slang::OutputType OutputType, BitCodeStorageType BitcodeStorage, 128cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool AllowRSPrefix, bool OutputDep, 129cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &JavaReflectionPathBase, 130cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &JavaReflectionPackageName); 1313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 132641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang virtual void reset(); 133641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1343a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual ~SlangRS(); 1353a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}; 1363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 1373a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 138e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_ NOLINT 139