1d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao/*
2d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao * Copyright 2010-2012, The Android Open Source Project
3d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao *
4d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
5d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao * you may not use this file except in compliance with the License.
6d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao * You may obtain a copy of the License at
7d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao *
8d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao *     http://www.apache.org/licenses/LICENSE-2.0
9d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao *
10d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao * Unless required by applicable law or agreed to in writing, software
11d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
12d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao * See the License for the specific language governing permissions and
14d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao * limitations under the License.
15d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao */
16d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#ifndef BCC_SOURCE_H
18c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#define BCC_SOURCE_H
19d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
20d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao#include <string>
21d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
22d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaonamespace llvm {
23d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  class Module;
24d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao}
25d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
26d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaonamespace bcc {
27d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
28d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaoclass BCCContext;
29d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
30d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaoclass Source {
31d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaoprivate:
32d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  BCCContext &mContext;
33d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  llvm::Module *mModule;
34d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
35d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // If true, destructor won't destroy the mModule.
36d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  bool mNoDelete;
37d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
38d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaoprivate:
39d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  Source(BCCContext &pContext, llvm::Module &pModule, bool pNoDelete = false);
40d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
41d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaopublic:
42d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  static Source *CreateFromBuffer(BCCContext &pContext,
43d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  const char *pName,
44d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  const char *pBitcode,
45d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  size_t pBitcodeSize);
46d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
47d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  static Source *CreateFromFile(BCCContext &pContext,
48d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                const std::string &pPath);
49d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
50d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // Create a Source object from an existing module. If pNoDelete
51d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // is true, destructor won't call delete on the given module.
52d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  static Source *CreateFromModule(BCCContext &pContext,
53d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  llvm::Module &pModule,
54d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  bool pNoDelete = false);
55d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
56d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  static Source *CreateEmpty(BCCContext &pContext, const std::string &pName);
57d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
58d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // Merge the current source with pSource. If pPreserveSource is false, pSource
59d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // will be destroyed after successfully merged. Return false on error.
60d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  bool merge(Source &pSource, bool pPreserveSource = false);
61d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
62d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  inline BCCContext &getContext()
63d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  { return mContext; }
64d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  inline const BCCContext &getContext() const
65d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  { return mContext; }
66d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
6706731a6150ae8014d37258d5f32ef8bc14a3db63Stephen Hines  void setModule(llvm::Module *pModule);
6806731a6150ae8014d37258d5f32ef8bc14a3db63Stephen Hines
69d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  inline llvm::Module &getModule()
70d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  { return *mModule;  }
71d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  inline const llvm::Module &getModule() const
72d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  { return *mModule;  }
73d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
74d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // Get the "identifier" of the bitcode. This will return the value of pName
75d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // when it's created using CreateFromBuffer and pPath if CreateFromFile().
76d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  const std::string &getIdentifier() const;
77d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
78d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  ~Source();
79d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao};
80d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
81d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao} // namespace bcc
82d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
83c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_SOURCE_H
84