| //===-LTOModule.h - LLVM Link Time Optimizer ------------------------------===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | //  | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file declares the LTOModule class.  | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LTO_MODULE_H | 
 | #define LTO_MODULE_H | 
 |  | 
 | #include "llvm/Module.h" | 
 | #include "llvm/ADT/OwningPtr.h" | 
 | #include "llvm/Target/TargetMachine.h" | 
 | #include "llvm/ADT/StringMap.h" | 
 |  | 
 | #include "llvm-c/lto.h" | 
 |  | 
 | #include <vector> | 
 | #include <string> | 
 |  | 
 |  | 
 | // forward references to llvm classes | 
 | namespace llvm { | 
 |     class Mangler; | 
 |     class MemoryBuffer; | 
 |     class GlobalValue; | 
 |     class Value; | 
 |     class Function; | 
 | } | 
 |  | 
 |  | 
 | // | 
 | // C++ class which implements the opaque lto_module_t | 
 | // | 
 | struct LTOModule { | 
 |  | 
 |     static bool              isBitcodeFile(const void* mem, size_t length); | 
 |     static bool              isBitcodeFile(const char* path); | 
 |  | 
 |     static bool              isBitcodeFileForTarget(const void* mem,  | 
 |                                     size_t length, const char* triplePrefix); | 
 |  | 
 |     static bool              isBitcodeFileForTarget(const char* path,  | 
 |                                                     const char* triplePrefix); | 
 |  | 
 |     static LTOModule*        makeLTOModule(const char* path, | 
 |                                           std::string& errMsg); | 
 |     static LTOModule*        makeLTOModule(int fd, const char *path, | 
 |                                            size_t size, | 
 |                                            std::string& errMsg); | 
 |     static LTOModule*        makeLTOModule(int fd, const char *path, | 
 |                                            size_t file_size, | 
 |                                            size_t map_size, | 
 |                                            off_t offset, | 
 |                                            std::string& errMsg); | 
 |     static LTOModule*        makeLTOModule(const void* mem, size_t length, | 
 |                                            std::string& errMsg); | 
 |  | 
 |     const char*              getTargetTriple(); | 
 |     void                     setTargetTriple(const char*); | 
 |     uint32_t                 getSymbolCount(); | 
 |     lto_symbol_attributes    getSymbolAttributes(uint32_t index); | 
 |     const char*              getSymbolName(uint32_t index); | 
 |      | 
 |     llvm::Module *           getLLVVMModule() { return _module.get(); } | 
 |     const std::vector<const char*> &getAsmUndefinedRefs() { | 
 |             return _asm_undefines; | 
 |     } | 
 |  | 
 | private: | 
 |                             LTOModule(llvm::Module* m, llvm::TargetMachine* t); | 
 |  | 
 |     bool                    ParseSymbols(std::string &errMsg); | 
 |     void                    addDefinedSymbol(llvm::GlobalValue* def,  | 
 |                                                     llvm::Mangler& mangler,  | 
 |                                                     bool isFunction); | 
 |     void                    addPotentialUndefinedSymbol(llvm::GlobalValue* decl,  | 
 |                                                         llvm::Mangler &mangler); | 
 |     void                    addDefinedFunctionSymbol(llvm::Function* f,  | 
 |                                                         llvm::Mangler &mangler); | 
 |     void                    addDefinedDataSymbol(llvm::GlobalValue* v,  | 
 |                                                         llvm::Mangler &mangler); | 
 |     bool                    addAsmGlobalSymbols(llvm::MCContext &Context, | 
 |                                                 std::string &errMsg); | 
 |     void                    addAsmGlobalSymbol(const char *, | 
 |                                                lto_symbol_attributes scope); | 
 |     void                    addAsmGlobalSymbolUndef(const char *); | 
 |     void                    addObjCClass(llvm::GlobalVariable* clgv); | 
 |     void                    addObjCCategory(llvm::GlobalVariable* clgv); | 
 |     void                    addObjCClassRef(llvm::GlobalVariable* clgv); | 
 |     bool                    objcClassNameFromExpression(llvm::Constant* c,  | 
 |                                                     std::string& name); | 
 |  | 
 |     static bool             isTargetMatch(llvm::MemoryBuffer* memBuffer, | 
 |                                                     const char* triplePrefix); | 
 |  | 
 |     static LTOModule*       makeLTOModule(llvm::MemoryBuffer* buffer, | 
 |                                                         std::string& errMsg); | 
 |     static llvm::MemoryBuffer* makeBuffer(const void* mem, size_t length); | 
 |  | 
 |     typedef llvm::StringMap<uint8_t> StringSet; | 
 |      | 
 |     struct NameAndAttributes {  | 
 |         const char*            name;  | 
 |         lto_symbol_attributes  attributes;  | 
 |     }; | 
 |  | 
 |     llvm::OwningPtr<llvm::Module>           _module; | 
 |     llvm::OwningPtr<llvm::TargetMachine>    _target; | 
 |     std::vector<NameAndAttributes>          _symbols; | 
 |     // _defines and _undefines only needed to disambiguate tentative definitions | 
 |     StringSet                               _defines;     | 
 |     llvm::StringMap<NameAndAttributes>      _undefines; | 
 |     std::vector<const char*>                _asm_undefines; | 
 | }; | 
 |  | 
 | #endif // LTO_MODULE_H | 
 |  |