• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 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 BCC_RS_INFO_H
18 #define BCC_RS_INFO_H
19 
20 #include <stdint.h>
21 
22 #include <utility>
23 
24 #include "bcc/Renderscript/RSScript.h"
25 #include "bcc/Support/Log.h"
26 #include "bcc/Support/Sha1Util.h"
27 
28 #include <utils/String8.h>
29 #include <utils/Vector.h>
30 
31 namespace bcc {
32 
33 // Forward declarations
34 class FileBase;
35 class InputFile;
36 class OutputFile;
37 class Source;
38 
39 namespace rsinfo {
40 
41 /* RS info file magic */
42 #define RSINFO_MAGIC      "\0rsinfo\n"
43 
44 /* RS info file version, encoded in 4 bytes of ASCII */
45 #define RSINFO_VERSION    "004\0"
46 
47 struct __attribute__((packed)) ListHeader {
48   // The offset from the beginning of the file of data
49   uint32_t offset;
50   // Number of item in the list
51   uint32_t count;
52   // Size of each item
53   uint8_t itemSize;
54 };
55 
56 /* RS info file header */
57 struct __attribute__((packed)) Header {
58   // Magic versus version
59   uint8_t magic[8];
60   uint8_t version[4];
61 
62   uint8_t isThreadable;
63   uint8_t hasDebugInformation;
64 
65   uint16_t headerSize;
66 
67   uint32_t strPoolSize;
68 
69   struct ListHeader dependencyTable;
70   struct ListHeader pragmaList;
71   struct ListHeader objectSlotList;
72   struct ListHeader exportVarNameList;
73   struct ListHeader exportFuncNameList;
74   struct ListHeader exportForeachFuncList;
75 };
76 
77 typedef uint32_t StringIndexTy;
78 // Use value -1 as an invalid string index marker. No need to declare with
79 // 'static' modifier since 'const' variable has internal linkage by default.
80 const StringIndexTy gInvalidStringIndex = static_cast<StringIndexTy>(-1);
81 
82 struct __attribute__((packed)) DependencyTableItem {
83   StringIndexTy id;
84   // SHA-1 checksum is stored as a string in string pool (and has fixed-length
85   // SHA1_DIGEST_LENGTH (=20) bytes)
86   StringIndexTy sha1;
87 };
88 
89 struct __attribute__((packed)) PragmaItem {
90   // Pragma is a key-value pair.
91   StringIndexTy key;
92   StringIndexTy value;
93 };
94 
95 struct __attribute__((packed)) ObjectSlotItem {
96   uint32_t slot;
97 };
98 
99 struct __attribute__((packed)) ExportVarNameItem {
100   StringIndexTy name;
101 };
102 
103 struct __attribute__((packed)) ExportFuncNameItem {
104   StringIndexTy name;
105 };
106 
107 struct __attribute__((packed)) ExportForeachFuncItem {
108   StringIndexTy name;
109   uint32_t signature;
110 };
111 
112 // Return the human-readable name of the given rsinfo::*Item in the template
113 // parameter. This is for debugging and error message.
114 template<typename Item>
115 inline const char *GetItemTypeName();
116 
117 template<>
118 inline const char *GetItemTypeName<DependencyTableItem>()
119 { return "rs dependency info"; }
120 
121 template<>
122 inline const char *GetItemTypeName<PragmaItem>()
123 {  return "rs pragma"; }
124 
125 template<>
126 inline const char *GetItemTypeName<ObjectSlotItem>()
127 {  return "rs object slot"; }
128 
129 template<>
130 inline const char *GetItemTypeName<ExportVarNameItem>()
131 { return "rs export var"; }
132 
133 template<>
134 inline const char *GetItemTypeName<ExportFuncNameItem>()
135 {  return "rs export func"; }
136 
137 template<>
138 inline const char *GetItemTypeName<ExportForeachFuncItem>()
139 { return "rs export foreach"; }
140 
141 } // end namespace rsinfo
142 
143 class RSInfo {
144 public:
145   typedef android::Vector<std::pair<const char *,
146                                     const uint8_t *> > DependencyTableTy;
147   typedef android::Vector<std::pair<const char*, const char*> > PragmaListTy;
148   typedef android::Vector<uint32_t> ObjectSlotListTy;
149   typedef android::Vector<const char *> ExportVarNameListTy;
150   typedef android::Vector<const char *> ExportFuncNameListTy;
151   typedef android::Vector<std::pair<const char *,
152                                     uint32_t> > ExportForeachFuncListTy;
153 
154 public:
155   // Calculate or load the SHA-1 information of the built-in dependencies.
156   static bool LoadBuiltInSHA1Information();
157 
158   // Return the path of the RS info file corresponded to the given output
159   // executable file.
160   static android::String8 GetPath(const FileBase &pFile);
161 
162   static const char LibBCCPath[];
163   static const char LibCompilerRTPath[];
164   static const char LibRSPath[];
165   static const char LibCLCorePath[];
166   static const char LibCLCoreDebugPath[];
167 #if defined(ARCH_X86_HAVE_SSE2)
168   static const char LibCLCoreX86Path[];
169 #endif
170 #if defined(ARCH_ARM_HAVE_NEON)
171   static const char LibCLCoreNEONPath[];
172 #endif
173 
174 private:
175   // SHA-1 of the built-in dependencies. Will be initialized in
176   // LoadBuiltInSHA1Information().
177   static const uint8_t *LibBCCSHA1;
178   static const uint8_t *LibCompilerRTSHA1;
179   static const uint8_t *LibRSSHA1;
180   static const uint8_t *LibCLCoreSHA1;
181   static const uint8_t *LibCLCoreDebugSHA1;
182 #if defined(ARCH_ARM_HAVE_NEON)
183   static const uint8_t *LibCLCoreNEONSHA1;
184 #endif
185 
186   static bool CheckDependency(const RSInfo &pInfo,
187                               const char *pInputFilename,
188                               const DependencyTableTy &pDeps);
189   static bool AddBuiltInDependencies(RSInfo &pInfo);
190 
191   rsinfo::Header mHeader;
192 
193   char *mStringPool;
194 
195   // In most of the time, there're 4 source dependencies stored (libbcc.so,
196   // libRS.so, libclcore and the input bitcode itself.)
197   DependencyTableTy mDependencyTable;
198   PragmaListTy mPragmas;
199   ObjectSlotListTy mObjectSlots;
200   ExportVarNameListTy mExportVarNames;
201   ExportFuncNameListTy mExportFuncNames;
202   ExportForeachFuncListTy mExportForeachFuncs;
203 
204   // Initialize an empty RSInfo with its size of string pool is pStringPoolSize.
205   RSInfo(size_t pStringPoolSize);
206 
207   // layout() assigns value of offset in each ListHeader (i.e., it decides where
208   // data should go in the file.) It also updates fields other than offset to
209   // reflect the current RSInfo object states to mHeader.
210   bool layout(off_t initial_offset);
211 
212 public:
213   ~RSInfo();
214 
215   // Implemented in RSInfoExtractor.cpp.
216   static RSInfo *ExtractFromSource(const Source &pSource,
217                                    const DependencyTableTy &pDeps);
218 
219   // Implemented in RSInfoReader.cpp.
220   static RSInfo *ReadFromFile(InputFile &pInput,
221                               const DependencyTableTy &pDeps);
222 
223   // Implemneted in RSInfoWriter.cpp
224   bool write(OutputFile &pOutput);
225 
226   void dump() const;
227 
228   // const getter
isThreadable()229   inline bool isThreadable() const
230   { return mHeader.isThreadable; }
hasDebugInformation()231   inline bool hasDebugInformation() const
232   { return mHeader.hasDebugInformation; }
getDependencyTable()233   inline const DependencyTableTy &getDependencyTable() const
234   { return mDependencyTable; }
getPragmas()235   inline const PragmaListTy &getPragmas() const
236   { return mPragmas; }
getObjectSlots()237   inline const ObjectSlotListTy &getObjectSlots() const
238   { return mObjectSlots; }
getExportVarNames()239   inline const ExportVarNameListTy &getExportVarNames() const
240   { return mExportVarNames; }
getExportFuncNames()241   inline const ExportFuncNameListTy &getExportFuncNames() const
242   { return mExportFuncNames; }
getExportForeachFuncs()243   inline const ExportForeachFuncListTy &getExportForeachFuncs() const
244   { return mExportForeachFuncs; }
245 
246   const char *getStringFromPool(rsinfo::StringIndexTy pStrIdx) const;
247   rsinfo::StringIndexTy getStringIdxInPool(const char *pStr) const;
248 
249   // setter
250   inline void setThreadable(bool pThreadable = true)
251   { mHeader.isThreadable = pThreadable; }
252 
253 public:
254   enum FloatPrecision {
255     FP_Full,
256     FP_Relaxed,
257     FP_Imprecise,
258   };
259 
260   // Return the minimal floating point precision required for the associated
261   // script.
262   FloatPrecision getFloatPrecisionRequirement() const;
263 };
264 
265 } // end namespace bcc
266 
267 #endif  // BCC_RS_INFO_H
268