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