1474cbd2fde362e63375f7a5099ca38b5c67835cfLogan/* 2474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * Copyright 2010, The Android Open Source Project 3474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * 4474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * Licensed under the Apache License, Version 2.0 (the "License"); 5474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * you may not use this file except in compliance with the License. 6474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * You may obtain a copy of the License at 7474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * 8474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * http://www.apache.org/licenses/LICENSE-2.0 9474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * 10474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * Unless required by applicable law or agreed to in writing, software 11474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * distributed under the License is distributed on an "AS IS" BASIS, 12474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * See the License for the specific language governing permissions and 14474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * limitations under the License. 15474cbd2fde362e63375f7a5099ca38b5c67835cfLogan */ 16474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 17474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#ifndef BCC_SOURCEINFO_H 18474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#define BCC_SOURCEINFO_H 19474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 20474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#include "Config.h" 21474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 22474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#include <llvm/ADT/OwningPtr.h> 23474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#include <llvm/Module.h> 24474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 25474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#include <stddef.h> 26474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 27474cbd2fde362e63375f7a5099ca38b5c67835cfLogannamespace bcc { 28474cbd2fde362e63375f7a5099ca38b5c67835cfLogan class ScriptCompiled; 29474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 30474cbd2fde362e63375f7a5099ca38b5c67835cfLogan namespace SourceKind { 31474cbd2fde362e63375f7a5099ca38b5c67835cfLogan enum SourceType { 32474cbd2fde362e63375f7a5099ca38b5c67835cfLogan File, 33474cbd2fde362e63375f7a5099ca38b5c67835cfLogan Buffer, 34474cbd2fde362e63375f7a5099ca38b5c67835cfLogan Module, 35474cbd2fde362e63375f7a5099ca38b5c67835cfLogan }; 36474cbd2fde362e63375f7a5099ca38b5c67835cfLogan } 37474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 38474cbd2fde362e63375f7a5099ca38b5c67835cfLogan class SourceInfo { 39474cbd2fde362e63375f7a5099ca38b5c67835cfLogan private: 40474cbd2fde362e63375f7a5099ca38b5c67835cfLogan SourceKind::SourceType type; 41474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 42474cbd2fde362e63375f7a5099ca38b5c67835cfLogan llvm::OwningPtr<llvm::Module> module; 43474cbd2fde362e63375f7a5099ca38b5c67835cfLogan // Note: module should not be a part of union. Since, we are going to 44474cbd2fde362e63375f7a5099ca38b5c67835cfLogan // use module to store the pointer to parsed bitcode. 45474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 46474cbd2fde362e63375f7a5099ca38b5c67835cfLogan union { 47474cbd2fde362e63375f7a5099ca38b5c67835cfLogan struct { 48474cbd2fde362e63375f7a5099ca38b5c67835cfLogan char const *resName; 49474cbd2fde362e63375f7a5099ca38b5c67835cfLogan char const *bitcode; 50474cbd2fde362e63375f7a5099ca38b5c67835cfLogan size_t bitcodeSize; 51474cbd2fde362e63375f7a5099ca38b5c67835cfLogan } buffer; 52474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 53474cbd2fde362e63375f7a5099ca38b5c67835cfLogan struct { 54474cbd2fde362e63375f7a5099ca38b5c67835cfLogan char const *path; 55474cbd2fde362e63375f7a5099ca38b5c67835cfLogan } file; 56474cbd2fde362e63375f7a5099ca38b5c67835cfLogan }; 57474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 58474cbd2fde362e63375f7a5099ca38b5c67835cfLogan unsigned long flags; 59474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 60474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#if USE_CACHE 61474cbd2fde362e63375f7a5099ca38b5c67835cfLogan unsigned char sha1[20]; 62474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#endif 63474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 64474cbd2fde362e63375f7a5099ca38b5c67835cfLogan private: 65474cbd2fde362e63375f7a5099ca38b5c67835cfLogan SourceInfo() { } 66474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 67474cbd2fde362e63375f7a5099ca38b5c67835cfLogan public: 68474cbd2fde362e63375f7a5099ca38b5c67835cfLogan static SourceInfo *createFromBuffer(char const *resName, 69474cbd2fde362e63375f7a5099ca38b5c67835cfLogan char const *bitcode, 70474cbd2fde362e63375f7a5099ca38b5c67835cfLogan size_t bitcodeSize, 71474cbd2fde362e63375f7a5099ca38b5c67835cfLogan unsigned long flags); 72474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 73474cbd2fde362e63375f7a5099ca38b5c67835cfLogan static SourceInfo *createFromFile(char const *path, 74474cbd2fde362e63375f7a5099ca38b5c67835cfLogan unsigned long flags); 75474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 76474cbd2fde362e63375f7a5099ca38b5c67835cfLogan static SourceInfo *createFromModule(llvm::Module *module, 77474cbd2fde362e63375f7a5099ca38b5c67835cfLogan unsigned long flags); 78474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 79474cbd2fde362e63375f7a5099ca38b5c67835cfLogan llvm::Module *takeModule() { 80474cbd2fde362e63375f7a5099ca38b5c67835cfLogan return module.take(); 81474cbd2fde362e63375f7a5099ca38b5c67835cfLogan } 82474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 83474cbd2fde362e63375f7a5099ca38b5c67835cfLogan llvm::Module *getModule() const { 84474cbd2fde362e63375f7a5099ca38b5c67835cfLogan return module.get(); 85474cbd2fde362e63375f7a5099ca38b5c67835cfLogan } 86474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 87474cbd2fde362e63375f7a5099ca38b5c67835cfLogan int prepareModule(ScriptCompiled *); 88474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 89474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#if USE_CACHE 90474cbd2fde362e63375f7a5099ca38b5c67835cfLogan template <typename T> void introDependency(T &checker); 91474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#endif 92474cbd2fde362e63375f7a5099ca38b5c67835cfLogan }; 93474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 94474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 95474cbd2fde362e63375f7a5099ca38b5c67835cfLogan} // namespace bcc 96474cbd2fde362e63375f7a5099ca38b5c67835cfLogan 97474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#endif // BCC_SOURCEINFO_H 98