• 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_SCRIPT_H
18 #define BCC_RS_SCRIPT_H
19 
20 #include "bcc/Script.h"
21 #include "bcc/Support/Sha1Util.h"
22 
23 namespace llvm {
24   class Module;
25 }
26 
27 namespace bcc {
28 
29 class RSScript;
30 class Source;
31 class CompilerConfig;
32 
33 typedef llvm::Module* (*RSLinkRuntimeCallback) (bcc::RSScript *, llvm::Module *, llvm::Module *);
34 
35 
36 class RSScript : public Script {
37 public:
38   // This is one-one mapping with the llvm::CodeGenOpt::Level in
39   // llvm/Support/CodeGen.h. Therefore, value of this type can safely cast
40   // to llvm::CodeGenOpt::Level. This makes RSScript LLVM-free.
41   enum OptimizationLevel {
42     kOptLvl0, // -O0
43     kOptLvl1, // -O1
44     kOptLvl2, // -O2, -Os
45     kOptLvl3  // -O3
46   };
47 
48 private:
49   unsigned mCompilerVersion;
50 
51   OptimizationLevel mOptimizationLevel;
52 
53   RSLinkRuntimeCallback mLinkRuntimeCallback;
54 
55   bool mEmbedInfo;
56 
57   // Specifies whether we should embed global variable information in the
58   // code via special RS variables that can be examined later by the driver.
59   bool mEmbedGlobalInfo;
60 
61   // Specifies whether we should skip constant (immutable) global variables
62   // when potentially embedding information about globals.
63   bool mEmbedGlobalInfoSkipConstant;
64 
65 private:
66   // This will be invoked when the containing source has been reset.
67   virtual bool doReset();
68 
69 public:
70   static bool LinkRuntime(RSScript &pScript, const char *rt_path = nullptr);
71 
72   RSScript(Source &pSource);
73 
74   // Passing in the CompilerConfig allows the optimization level to
75   // be derived rather than defaulted to aggressive (-O3)
76   RSScript(Source &pSource, const CompilerConfig * pCompilerConfig);
77 
~RSScript()78   virtual ~RSScript() { }
79 
setCompilerVersion(unsigned pCompilerVersion)80   void setCompilerVersion(unsigned pCompilerVersion) {
81     mCompilerVersion = pCompilerVersion;
82   }
83 
getCompilerVersion()84   unsigned getCompilerVersion() const {
85     return mCompilerVersion;
86   }
87 
setOptimizationLevel(OptimizationLevel pOptimizationLevel)88   void setOptimizationLevel(OptimizationLevel pOptimizationLevel) {
89     mOptimizationLevel = pOptimizationLevel;
90   }
91 
getOptimizationLevel()92   OptimizationLevel getOptimizationLevel() const {
93     return mOptimizationLevel;
94   }
95 
setLinkRuntimeCallback(RSLinkRuntimeCallback fn)96   void setLinkRuntimeCallback(RSLinkRuntimeCallback fn){
97     mLinkRuntimeCallback = fn;
98   }
99 
setEmbedInfo(bool pEnable)100   void setEmbedInfo(bool pEnable) {
101     mEmbedInfo = pEnable;
102   }
103 
getEmbedInfo()104   bool getEmbedInfo() const {
105     return mEmbedInfo;
106   }
107 
108   // Set to true if we should embed global variable information in the code.
setEmbedGlobalInfo(bool pEnable)109   void setEmbedGlobalInfo(bool pEnable) {
110     mEmbedGlobalInfo = pEnable;
111   }
112 
113   // Returns true if we should embed global variable information in the code.
getEmbedGlobalInfo()114   bool getEmbedGlobalInfo() const {
115     return mEmbedGlobalInfo;
116   }
117 
118   // Set to true if we should skip constant (immutable) global variables when
119   // potentially embedding information about globals.
setEmbedGlobalInfoSkipConstant(bool pEnable)120   void setEmbedGlobalInfoSkipConstant(bool pEnable) {
121     mEmbedGlobalInfoSkipConstant = pEnable;
122   }
123 
124   // Returns true if we should skip constant (immutable) global variables when
125   // potentially embedding information about globals.
getEmbedGlobalInfoSkipConstant()126   bool getEmbedGlobalInfoSkipConstant() const {
127     return mEmbedGlobalInfoSkipConstant;
128   }
129 };
130 
131 } // end namespace bcc
132 
133 #endif // BCC_RS_SCRIPT_H
134