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 BCC_SOURCE_H
18 #define BCC_SOURCE_H
19 
20 #include <string>
21 
22 namespace llvm {
23   class Module;
24 }
25 
26 namespace bcinfo {
27   class MetadataExtractor;
28 }
29 
30 namespace bcc {
31 
32 class BCCContext;
33 
34 class Source {
35 private:
36   const std::string mName; // A unique name
37   BCCContext &mContext;
38   llvm::Module *mModule;
39 
40   bcinfo::MetadataExtractor *mMetadata;
41 
42   // If true, destructor won't destroy the mModule.
43   bool mNoDelete;
44 
45   // Keep track of whether mModule is destroyed (possibly as a consequence of
46   // getting linked with a different llvm::Module).
47   bool mIsModuleDestroyed;
48 
49 private:
50   Source(const char* name, BCCContext &pContext, llvm::Module &pModule,
51          bool pNoDelete = false);
52 
53 public:
54   static Source *CreateFromBuffer(BCCContext &pContext,
55                                   const char *pName,
56                                   const char *pBitcode,
57                                   size_t pBitcodeSize);
58 
59   static Source *CreateFromFile(BCCContext &pContext,
60                                 const std::string &pPath);
61 
62   // Create a Source object from an existing module. If pNoDelete
63   // is true, destructor won't call delete on the given module.
64   static Source *CreateFromModule(BCCContext &pContext,
65                                   const char* name,
66                                   llvm::Module &pModule,
67                                   uint32_t compilerVersion,
68                                   uint32_t optimizationLevel,
69                                   bool pNoDelete = false);
70 
getName()71   const std::string& getName() const { return mName; }
72 
73   // Merge the current source with pSource. pSource
74   // will be destroyed after successfully merged. Return false on error.
75   bool merge(Source &pSource);
76 
77   unsigned getCompilerVersion() const;
78 
79   void getWrapperInformation(unsigned *compilerVersion,
80                              unsigned *optimizationLevel) const;
81 
getContext()82   inline BCCContext &getContext()
83   { return mContext; }
getContext()84   inline const BCCContext &getContext() const
85   { return mContext; }
86 
87   void setModule(llvm::Module *pModule);
88 
getModule()89   inline llvm::Module &getModule()
90   { return *mModule;  }
getModule()91   inline const llvm::Module &getModule() const
92   { return *mModule;  }
93 
94   // Get the "identifier" of the bitcode. This will return the value of pName
95   // when it's created using CreateFromBuffer and pPath if CreateFromFile().
96   const std::string &getIdentifier() const;
97 
98   void addBuildChecksumMetadata(const char *) const;
99 
100   // Get whether debugging has been enabled for this module by checking
101   // for presence of debug info in the module.
102   bool getDebugInfoEnabled() const;
103 
104   // Extract metadata from mModule using MetadataExtractor.
105   bool extractMetadata();
getMetadata()106   bcinfo::MetadataExtractor* getMetadata() const { return mMetadata; }
107 
108   // Mark mModule was destroyed in the process of linking with a different
109   // llvm::Module
markModuleDestroyed()110   void markModuleDestroyed() { mIsModuleDestroyed = true; }
111 
112   ~Source();
113 };
114 
115 } // namespace bcc
116 
117 #endif // BCC_SOURCE_H
118