• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010, 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_SOURCEINFO_H
18 #define BCC_SOURCEINFO_H
19 
20 #include "Config.h"
21 
22 #include <llvm/Module.h>
23 
24 #include <stddef.h>
25 
26 namespace llvm {
27   class LLVMContext;
28 }
29 
30 namespace bcc {
31   namespace SourceKind {
32     enum SourceType {
33       File,
34       Buffer,
35       Module,
36     };
37   }
38 
39   class SourceInfo {
40   private:
41     SourceKind::SourceType type;
42 
43     // Note: module should not be a part of union.  Since, we are going to
44     // use module to store the pointer to parsed bitcode.
45     llvm::Module *module;
46     // If true, the LLVM context behind the module is shared with others.
47     // Therefore, don't try to destroy the context it when destroy the module.
48     bool shared_context;
49 
50     union {
51       struct {
52         char const *resName;
53         char const *bitcode;
54         size_t bitcodeSize;
55       } buffer;
56 
57       struct {
58         char const *path;
59       } file;
60     };
61 
62     unsigned long flags;
63 
64     unsigned char sha1[20];
65 
66   private:
SourceInfo()67     SourceInfo() : module(NULL), shared_context(false) { }
68 
69   public:
70     static SourceInfo *createFromBuffer(char const *resName,
71                                         char const *bitcode,
72                                         size_t bitcodeSize,
73                                         unsigned long flags);
74 
75     static SourceInfo *createFromFile(char const *path,
76                                       unsigned long flags);
77 
78     static SourceInfo *createFromModule(llvm::Module *module,
79                                         unsigned long flags);
80 
getModule()81     inline llvm::Module *getModule() const {
82       return module;
83     }
84 
getContext()85     inline llvm::LLVMContext *getContext() const {
86       return (module) ? &module->getContext() : NULL;
87     }
88 
89     // Share with the given context if it's provided.
90     int prepareModule(llvm::LLVMContext *context = NULL);
91 
92     template <typename T> void introDependency(T &checker);
93 
94     ~SourceInfo();
95   };
96 
97 
98 } // namespace bcc
99 
100 #endif // BCC_SOURCEINFO_H
101