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
268e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainarnamespace bcinfo {
278e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  class MetadataExtractor;
288e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar}
298e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar
30d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaonamespace bcc {
31d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
32d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaoclass BCCContext;
33d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
34d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaoclass Source {
35d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaoprivate:
36a4ded1373d7ad3e503f186e65bccf94126a0f020Yang Ni  const std::string mName; // A unique name
37d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  BCCContext &mContext;
38d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  llvm::Module *mModule;
39d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
408e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  bcinfo::MetadataExtractor *mMetadata;
418e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar
42d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // If true, destructor won't destroy the mModule.
43d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  bool mNoDelete;
44d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
458e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  // Keep track of whether mModule is destroyed (possibly as a consequence of
468e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  // getting linked with a different llvm::Module).
478e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  bool mIsModuleDestroyed;
488e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar
49d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaoprivate:
50a4ded1373d7ad3e503f186e65bccf94126a0f020Yang Ni  Source(const char* name, BCCContext &pContext, llvm::Module &pModule,
51a4ded1373d7ad3e503f186e65bccf94126a0f020Yang Ni         bool pNoDelete = false);
52d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
53d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaopublic:
54d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  static Source *CreateFromBuffer(BCCContext &pContext,
55d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  const char *pName,
56d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  const char *pBitcode,
57d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  size_t pBitcodeSize);
58d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
59d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  static Source *CreateFromFile(BCCContext &pContext,
60d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                const std::string &pPath);
61d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
62d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // Create a Source object from an existing module. If pNoDelete
63d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // is true, destructor won't call delete on the given module.
64d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  static Source *CreateFromModule(BCCContext &pContext,
65a4ded1373d7ad3e503f186e65bccf94126a0f020Yang Ni                                  const char* name,
66d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  llvm::Module &pModule,
67d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao                                  bool pNoDelete = false);
68d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
69d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  static Source *CreateEmpty(BCCContext &pContext, const std::string &pName);
70d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
71a4ded1373d7ad3e503f186e65bccf94126a0f020Yang Ni  const std::string& getName() const { return mName; }
72a4ded1373d7ad3e503f186e65bccf94126a0f020Yang Ni
73a4ded1373d7ad3e503f186e65bccf94126a0f020Yang Ni  // Merge the current source with pSource. pSource
74a4ded1373d7ad3e503f186e65bccf94126a0f020Yang Ni  // will be destroyed after successfully merged. Return false on error.
75579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines  bool merge(Source &pSource);
76d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
77d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  inline BCCContext &getContext()
78d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  { return mContext; }
79d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  inline const BCCContext &getContext() const
80d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  { return mContext; }
81d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
8206731a6150ae8014d37258d5f32ef8bc14a3db63Stephen Hines  void setModule(llvm::Module *pModule);
8306731a6150ae8014d37258d5f32ef8bc14a3db63Stephen Hines
84d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  inline llvm::Module &getModule()
85d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  { return *mModule;  }
86d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  inline const llvm::Module &getModule() const
87d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  { return *mModule;  }
88d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
89d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // Get the "identifier" of the bitcode. This will return the value of pName
90d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  // when it's created using CreateFromBuffer and pPath if CreateFromFile().
91d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  const std::string &getIdentifier() const;
92d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
9351ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar  void addBuildChecksumMetadata(const char *) const;
9451ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar
9509c7a41f73602bec33e9d392cc959d78931f73c4Dean De Leo  // Get whether debugging has been enabled for this module by checking
9609c7a41f73602bec33e9d392cc959d78931f73c4Dean De Leo  // for presence of debug info in the module.
9709c7a41f73602bec33e9d392cc959d78931f73c4Dean De Leo  bool getDebugInfoEnabled() const;
9809c7a41f73602bec33e9d392cc959d78931f73c4Dean De Leo
998e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  // Extract metadata from mModule using MetadataExtractor.
1008e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  bool extractMetadata();
1018e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  bcinfo::MetadataExtractor* getMetadata() const { return mMetadata; }
1028e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar
1038e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  // Mark mModule was destroyed in the process of linking with a different
1048e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  // llvm::Module
1058e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar  void markModuleDestroyed() { mIsModuleDestroyed = true; }
1068e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar
107d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao  ~Source();
108d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao};
109d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
110d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao} // namespace bcc
111d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
112c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif // BCC_SOURCE_H
113