Home | History | Annotate | Download | only in slang
      1 /*
      2  * Copyright 2010-2012, The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_  // NOLINT
     18 #define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_
     19 
     20 #include "slang.h"
     21 
     22 #include <list>
     23 #include <string>
     24 #include <utility>
     25 #include <vector>
     26 
     27 #include "llvm/ADT/StringMap.h"
     28 
     29 #include "slang_rs_reflect_utils.h"
     30 #include "slang_version.h"
     31 
     32 namespace slang {
     33   class RSContext;
     34   class RSExportRecordType;
     35 
     36 class SlangRS : public Slang {
     37  private:
     38   // Context for Renderscript
     39   RSContext *mRSContext;
     40 
     41   bool mAllowRSPrefix;
     42 
     43   unsigned int mTargetAPI;
     44 
     45   bool mIsFilterscript;
     46 
     47   // Custom diagnostic identifiers
     48   unsigned mDiagErrorInvalidOutputDepParameter;
     49   unsigned mDiagErrorODR;
     50   unsigned mDiagErrorTargetAPIRange;
     51 
     52   // Collect generated filenames (without the .java) for dependency generation
     53   std::vector<std::string> mGeneratedFileNames;
     54 
     55   // FIXME: Should be std::list<RSExportable *> here. But currently we only
     56   //        check ODR on record type.
     57   //
     58   // ReflectedDefinitions maps record type name to a pair:
     59   //  <its RSExportRecordType instance,
     60   //   the first file contains this record type definition>
     61   typedef std::pair<RSExportRecordType*, const char*> ReflectedDefinitionTy;
     62   typedef llvm::StringMap<ReflectedDefinitionTy> ReflectedDefinitionListTy;
     63   ReflectedDefinitionListTy ReflectedDefinitions;
     64 
     65   bool reflectToJava(const std::string &OutputPathBase,
     66                      const std::string &RSPackageName);
     67 
     68   bool generateBitcodeAccessor(const std::string &OutputPathBase,
     69                                const std::string &PackageName);
     70 
     71   // CurInputFile is the pointer to a char array holding the input filename
     72   // and is valid before compile() ends.
     73   bool checkODR(const char *CurInputFile);
     74 
     75   // Returns true if this is a Filterscript file.
     76   static bool isFilterscript(const char *Filename);
     77 
     78  protected:
     79   virtual void initDiagnostic();
     80   virtual void initPreprocessor();
     81   virtual void initASTContext();
     82 
     83   virtual clang::ASTConsumer
     84   *createBackend(const clang::CodeGenOptions& CodeGenOpts,
     85                  llvm::raw_ostream *OS,
     86                  Slang::OutputType OT);
     87 
     88 
     89  public:
     90   static bool IsRSHeaderFile(const char *File);
     91   // FIXME: Determine whether a location is in RS header (i.e., one of the RS
     92   //        built-in APIs) should only need its names (we need a "list" of RS
     93   //        built-in APIs).
     94   static bool IsLocInRSHeaderFile(const clang::SourceLocation &Loc,
     95                                   const clang::SourceManager &SourceMgr);
     96 
     97   SlangRS();
     98 
     99   // Compile bunch of RS files given in the llvm-rs-cc arguments. Return true if
    100   // all given input files are successfully compiled without errors.
    101   //
    102   // @IOFiles - List of pairs of <input file path, output file path>.
    103   //
    104   // @DepFiles - List of pairs of <output dep. file path, dependent bitcode
    105   //             target>. If @OutputDep is true, this parameter must be given
    106   //             with the same number of pairs given in @IOFiles.
    107   //
    108   // @IncludePaths - User-defined include paths.
    109   //
    110   // @AdditionalDepTargets - User-defined files added to the dependencies.
    111   //
    112   // @OutputType - See Slang::OutputType.
    113   //
    114   // @BitcodeStorage - See BitCodeStorageType in slang_rs_reflect_util.cpp.
    115   //
    116   // @AllowRSPrefix - true to allow user-defined function prefixed with 'rs'.
    117   //
    118   // @OutputDep - true if output dependecies file for each input file.
    119   //
    120   // @JavaReflectionPathBase - The path base for storing reflection files.
    121   //
    122   // @EmitDebug - true to allow debug metadata emission
    123   //
    124   // @OptimizationLevel - code generation optimization level: None is recommended for
    125   //                      interactive debugging. The default is Aggresive.
    126   //
    127   // @JavaReflectionPackageName - The package name given by user in command
    128   //                              line. This may override the package name
    129   //                              specified in the .rs using #pragma.
    130   //
    131   // @RSPackageName - The RS package name supplied by the command line. This
    132   //                  can override the default value of
    133   //                  "android.renderscript" used by the normal APIs.
    134   //
    135   bool compile(const std::list<std::pair<const char*, const char*> > &IOFiles,
    136                const std::list<std::pair<const char*, const char*> > &DepFiles,
    137                const std::vector<std::string> &IncludePaths,
    138                const std::vector<std::string> &AdditionalDepTargets,
    139                Slang::OutputType OutputType, BitCodeStorageType BitcodeStorage,
    140                bool AllowRSPrefix, bool OutputDep,
    141                unsigned int TargetAPI, bool EmitDebug,
    142                llvm::CodeGenOpt::Level OptimizationLevel,
    143                const std::string &JavaReflectionPathBase,
    144                const std::string &JavaReflectionPackageName,
    145                const std::string &RSPackageName);
    146 
    147   virtual void reset();
    148 
    149   virtual ~SlangRS();
    150 
    151   virtual void makeModuleVisible(clang::Module *Mod,
    152                                  clang::Module::NameVisibilityKind Visibility,
    153                                  clang::SourceLocation ImportLoc,
    154                                  bool Complain = false) { }
    155 };
    156 }  // namespace slang
    157 
    158 #endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_  NOLINT
    159