LTOModule.h revision ef194ed74033eba099f4f391ffdfc176f9aa6f26
177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik//===-LTOModule.h - LLVM Link Time Optimizer ------------------------------===// 277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// The LLVM Compiler Infrastructure 477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// This file is distributed under the University of Illinois Open Source 677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// License. See LICENSE.TXT for details. 777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik//===----------------------------------------------------------------------===// 977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 1077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// This file declares the LTOModule class. 1177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 1277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik//===----------------------------------------------------------------------===// 1377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#ifndef LTO_MODULE_H 1577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#define LTO_MODULE_H 1677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#include "llvm/Module.h" 18ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik#include "llvm/ADT/OwningPtr.h" 1977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#include "llvm/Target/TargetMachine.h" 2077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#include "llvm/ADT/StringMap.h" 2177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#include "llvm-c/lto.h" 2377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#include <vector> 25ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik#include <string> 26ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik 27ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik 28ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik// forward references to llvm classes 29ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledziknamespace llvm { 30ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik class Mangler; 31ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik class MemoryBuffer; 32ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik class GlobalValue; 33ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik class Value; 34ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik class Function; 35ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik} 3677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 3777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 3877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 3977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// C++ class which implements the opaque lto_module_t 4077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 4177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzikclass LTOModule { 4277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzikpublic: 4377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 4477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik static bool isBitcodeFile(const void* mem, size_t length); 4577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik static bool isBitcodeFile(const char* path); 4677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 4777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik static bool isBitcodeFileForTarget(const void* mem, 4877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik size_t length, const char* triplePrefix); 4977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 5077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik static bool isBitcodeFileForTarget(const char* path, 5177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik const char* triplePrefix); 5277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 5377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik static LTOModule* makeLTOModule(const char* path, std::string& errMsg); 5477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik static LTOModule* makeLTOModule(const void* mem, size_t length, 5577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik std::string& errMsg); 5677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 5777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik const char* getTargetTriple(); 5877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik uint32_t getSymbolCount(); 5977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik lto_symbol_attributes getSymbolAttributes(uint32_t index); 6077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik const char* getSymbolName(uint32_t index); 6177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 62ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik llvm::Module * getLLVVMModule() { return _module.get(); } 6377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 6477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzikprivate: 6577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik LTOModule(llvm::Module* m, llvm::TargetMachine* t); 6677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 67ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik void lazyParseSymbols(); 6877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik void addDefinedSymbol(llvm::GlobalValue* def, 6977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik llvm::Mangler& mangler, 7077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik bool isFunction); 71ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik void addPotentialUndefinedSymbol(llvm::GlobalValue* decl, 72ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik llvm::Mangler &mangler); 7377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik void findExternalRefs(llvm::Value* value, 7477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik llvm::Mangler& mangler); 75ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik void addDefinedFunctionSymbol(llvm::Function* f, 76ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik llvm::Mangler &mangler); 77ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik void addDefinedDataSymbol(llvm::GlobalValue* v, 78ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik llvm::Mangler &mangler); 79ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik static bool isTargetMatch(llvm::MemoryBuffer* memBuffer, 80ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik const char* triplePrefix); 8177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 82ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik static LTOModule* makeLTOModule(llvm::MemoryBuffer* buffer, 83ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik std::string& errMsg); 84ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik 8577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik typedef llvm::StringMap<uint8_t> StringSet; 8677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 8777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik struct NameAndAttributes { 8877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik const char* name; 8977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik lto_symbol_attributes attributes; 9077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik }; 9177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 92ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik llvm::OwningPtr<llvm::Module> _module; 93ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik llvm::OwningPtr<llvm::TargetMachine> _target; 94ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik bool _symbolsParsed; 95ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik std::vector<NameAndAttributes> _symbols; 96ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik // _defines and _undefines only needed to disambiguate tentative definitions 97ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik StringSet _defines; 98ef194ed74033eba099f4f391ffdfc176f9aa6f26Nick Kledzik StringSet _undefines; 9977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik}; 10077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 10177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#endif // LTO_MODULE_H 10277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 103