slang_rs.h revision 4cc499d6e5ec602309501873449c938af61170b2
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" 304cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include "slang_version.h" 312e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines 32fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hinesnamespace clang { 33fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines class FunctionDecl; 34fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines} 35fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines 363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changnamespace slang { 373a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class RSContext; 38641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang class RSExportRecordType; 393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclass SlangRS : public Slang { 413a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang private: 423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang // Context for RenderScript 433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang RSContext *mRSContext; 443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang bool mAllowRSPrefix; 463a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 472e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines unsigned int mTargetAPI; 482e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines 49641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Custom diagnostic identifiers 50641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang unsigned mDiagErrorInvalidOutputDepParameter; 51641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang unsigned mDiagErrorODR; 522e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines unsigned mDiagErrorTargetAPIRange; 53641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 544cc67fce91f43215d61b2695746eab102a3db516Stephen Hines // Collect generated filenames (without the .java) for dependency generation 554cc67fce91f43215d61b2695746eab102a3db516Stephen Hines std::vector<std::string> mGeneratedFileNames; 564cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 57641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // FIXME: Should be std::list<RSExportable *> here. But currently we only 58641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // check ODR on record type. 59641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // 60641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // ReflectedDefinitions maps record type name to a pair: 61641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // <its RSExportRecordType instance, 62641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // the first file contains this record type definition> 63641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang typedef std::pair<RSExportRecordType*, const char*> ReflectedDefinitionTy; 64641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang typedef llvm::StringMap<ReflectedDefinitionTy> ReflectedDefinitionListTy; 65641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang ReflectedDefinitionListTy ReflectedDefinitions; 66641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 67cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // The package name that's really applied will be filled in RealPackageName. 68cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool reflectToJava(const std::string &OutputPathBase, 69cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &OutputPackageName, 70cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang std::string *RealPackageName); 71cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 72cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool generateBitcodeAccessor(const std::string &OutputPathBase, 73cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &PackageName); 74cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 75e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang // CurInputFile is the pointer to a char array holding the input filename 76e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang // and is valid before compile() ends. 77e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang bool checkODR(const char *CurInputFile); 78641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 793a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang protected: 803a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual void initDiagnostic(); 813a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual void initPreprocessor(); 823a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual void initASTContext(); 833a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 843a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual clang::ASTConsumer 853a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang *createBackend(const clang::CodeGenOptions& CodeGenOpts, 863a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::raw_ostream *OS, 873a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Slang::OutputType OT); 883a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 893a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 903a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang public: 91592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang static bool IsRSHeaderFile(const char *File); 92fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines // FIXME: Determine whether a function is in RS header (i.e., one of the RS 93fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines // built-in APIs) should only need its names (we need a "list" of RS 94fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines // built-in APIs). 95fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines static bool IsFunctionInRSHeaderFile(const clang::FunctionDecl *FD, 96fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines const clang::SourceManager &SourceMgr); 97592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang 98641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang SlangRS(); 993a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 100cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // Compile bunch of RS files given in the llvm-rs-cc arguments. Return true if 101cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // all given input files are successfully compiled without errors. 102cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 103cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @IOFiles - List of pairs of <input file path, output file path>. 104cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 105cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @DepFiles - List of pairs of <output dep. file path, dependent bitcode 106cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // target>. If @OutputDep is true, this parameter must be given 107cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // with the same number of pairs given in @IOFiles. 108cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 109641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // @IncludePaths - User-defined include paths. 110cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 111cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @AdditionalDepTargets - User-defined files added to the dependencies. 112cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 113cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @OutputType - See Slang::OutputType. 114cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 115cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @BitcodeStorage - See BitCodeStorageType in slang_rs_reflect_util.cpp. 116cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 117cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @AllowRSPrefix - true to allow user-defined function prefixed with 'rs'. 118cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 119641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // @OutputDep - true if output dependecies file for each input file. 120cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 121cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @JavaReflectionPathBase - The path base for storing reflection files. 122cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 123cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // @JavaReflectionPackageName - The package name given by user in command 124cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // line. This may override the package name 125cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // specified in the .rs using #pragma. 126cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang // 127cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool compile(const std::list<std::pair<const char*, const char*> > &IOFiles, 128cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::list<std::pair<const char*, const char*> > &DepFiles, 129cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::vector<std::string> &IncludePaths, 130cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::vector<std::string> &AdditionalDepTargets, 131cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang Slang::OutputType OutputType, BitCodeStorageType BitcodeStorage, 132cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang bool AllowRSPrefix, bool OutputDep, 1332e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines unsigned int TargetAPI, 134cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &JavaReflectionPathBase, 135cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::string &JavaReflectionPackageName); 1363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 137641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang virtual void reset(); 138641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual ~SlangRS(); 1403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}; 1413a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 1423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 143e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_ NOLINT 144