• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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