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