//===-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