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_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 323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changnamespace slang { 337f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines class RSCCOptions; 343a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang class RSContext; 35641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang class RSExportRecordType; 363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 373a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclass SlangRS : public Slang { 383a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang private: 39b7d1269f983f28d9fe625a96439fa88b39dc96f6Stephen Hines // Context for Renderscript 403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang RSContext *mRSContext; 413a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang bool mAllowRSPrefix; 433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 44c9454afec1649846512993d0ef65a9f868976bb4Chris Wailes unsigned int mTargetAPI; 452e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines 46fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines bool mVerbose; 47fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines 4811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines bool mIsFilterscript; 4911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 50641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Custom diagnostic identifiers 51641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang unsigned mDiagErrorInvalidOutputDepParameter; 52641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang unsigned mDiagErrorODR; 532e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines unsigned mDiagErrorTargetAPIRange; 54641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 554cc67fce91f43215d61b2695746eab102a3db516Stephen Hines // Collect generated filenames (without the .java) for dependency generation 564cc67fce91f43215d61b2695746eab102a3db516Stephen Hines std::vector<std::string> mGeneratedFileNames; 574cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 58641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // FIXME: Should be std::list<RSExportable *> here. But currently we only 59641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // check ODR on record type. 60641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // 61641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // ReflectedDefinitions maps record type name to a pair: 62641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // <its RSExportRecordType instance, 63641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // the first file contains this record type definition> 64641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang typedef std::pair<RSExportRecordType*, const char*> ReflectedDefinitionTy; 65641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang typedef llvm::StringMap<ReflectedDefinitionTy> ReflectedDefinitionListTy; 66641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang ReflectedDefinitionListTy ReflectedDefinitions; 67641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 68129fd8228cd04592a20c3d5009805a23585f2479Jean-Luc Brouillet bool generateJavaBitcodeAccessor(const std::string &OutputPathBase, 69129fd8228cd04592a20c3d5009805a23585f2479Jean-Luc Brouillet const std::string &PackageName, 70129fd8228cd04592a20c3d5009805a23585f2479Jean-Luc Brouillet const std::string *LicenseNote); 71cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 72e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang // CurInputFile is the pointer to a char array holding the input filename 73e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang // and is valid before compile() ends. 74e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang bool checkODR(const char *CurInputFile); 75641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 7611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines // Returns true if this is a Filterscript file. 7711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines static bool isFilterscript(const char *Filename); 7811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 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); 9211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines // FIXME: Determine whether a location 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). 9511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines static bool IsLocInRSHeaderFile(const clang::SourceLocation &Loc, 9611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen 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 // 1097f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines // @Opts - Selection of options defined from invoking llvm-rs-cc 1109ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines bool compile(const std::list<std::pair<const char*, const char*> > &IOFiles64, 1119ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines const std::list<std::pair<const char*, const char*> > &IOFiles32, 112cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::list<std::pair<const char*, const char*> > &DepFiles, 1137f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines const RSCCOptions &Opts); 1143a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 1152d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines virtual void reset(bool SuppressWarnings = false); 116641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1173a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang virtual ~SlangRS(); 1180da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines 1190da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines virtual void makeModuleVisible(clang::Module *Mod, 1200da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines clang::Module::NameVisibilityKind Visibility, 1214b3f3bada7155de983e7d92fa8b20091629b3bb3Stephen Hines clang::SourceLocation ImportLoc, 1224b3f3bada7155de983e7d92fa8b20091629b3bb3Stephen Hines bool Complain = false) { } 12375d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines 12475d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines virtual clang::GlobalModuleIndex *loadGlobalModuleIndex( 12575d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines clang::SourceLocation TriggerLoc) { } 12675d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines 12775d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines virtual bool lookupMissingImports(llvm::StringRef Name, 12875d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines clang::SourceLocation TriggerLoc) { } 1293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}; 130e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines} // namespace slang 1313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 132e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_ NOLINT 133