Home | History | Annotate | Download | only in lto
      1 //===-LTOModule.h - LLVM Link Time Optimizer ------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file declares the LTOModule class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LTO_MODULE_H
     15 #define LTO_MODULE_H
     16 
     17 #include "llvm/Module.h"
     18 #include "llvm/ADT/OwningPtr.h"
     19 #include "llvm/Target/TargetMachine.h"
     20 #include "llvm/ADT/StringMap.h"
     21 
     22 #include "llvm-c/lto.h"
     23 
     24 #include <vector>
     25 #include <string>
     26 
     27 
     28 // forward references to llvm classes
     29 namespace llvm {
     30     class Mangler;
     31     class MemoryBuffer;
     32     class GlobalValue;
     33     class Value;
     34     class Function;
     35 }
     36 
     37 
     38 //
     39 // C++ class which implements the opaque lto_module_t
     40 //
     41 struct LTOModule {
     42 
     43     static bool              isBitcodeFile(const void* mem, size_t length);
     44     static bool              isBitcodeFile(const char* path);
     45 
     46     static bool              isBitcodeFileForTarget(const void* mem,
     47                                     size_t length, const char* triplePrefix);
     48 
     49     static bool              isBitcodeFileForTarget(const char* path,
     50                                                     const char* triplePrefix);
     51 
     52     static LTOModule*        makeLTOModule(const char* path,
     53                                           std::string& errMsg);
     54     static LTOModule*        makeLTOModule(int fd, const char *path,
     55                                            size_t size,
     56                                            std::string& errMsg);
     57     static LTOModule*        makeLTOModule(int fd, const char *path,
     58                                            size_t file_size,
     59                                            size_t map_size,
     60                                            off_t offset,
     61                                            std::string& errMsg);
     62     static LTOModule*        makeLTOModule(const void* mem, size_t length,
     63                                            std::string& errMsg);
     64 
     65     const char*              getTargetTriple();
     66     void                     setTargetTriple(const char*);
     67     uint32_t                 getSymbolCount();
     68     lto_symbol_attributes    getSymbolAttributes(uint32_t index);
     69     const char*              getSymbolName(uint32_t index);
     70 
     71     llvm::Module *           getLLVVMModule() { return _module.get(); }
     72     const std::vector<const char*> &getAsmUndefinedRefs() {
     73             return _asm_undefines;
     74     }
     75 
     76 private:
     77                             LTOModule(llvm::Module* m, llvm::TargetMachine* t);
     78 
     79     bool                    ParseSymbols(std::string &errMsg);
     80     void                    addDefinedSymbol(llvm::GlobalValue* def,
     81                                                     llvm::Mangler& mangler,
     82                                                     bool isFunction);
     83     void                    addPotentialUndefinedSymbol(llvm::GlobalValue* decl,
     84                                                         llvm::Mangler &mangler);
     85     void                    addDefinedFunctionSymbol(llvm::Function* f,
     86                                                         llvm::Mangler &mangler);
     87     void                    addDefinedDataSymbol(llvm::GlobalValue* v,
     88                                                         llvm::Mangler &mangler);
     89     bool                    addAsmGlobalSymbols(llvm::MCContext &Context,
     90                                                 std::string &errMsg);
     91     void                    addAsmGlobalSymbol(const char *,
     92                                                lto_symbol_attributes scope);
     93     void                    addAsmGlobalSymbolUndef(const char *);
     94     void                    addObjCClass(llvm::GlobalVariable* clgv);
     95     void                    addObjCCategory(llvm::GlobalVariable* clgv);
     96     void                    addObjCClassRef(llvm::GlobalVariable* clgv);
     97     bool                    objcClassNameFromExpression(llvm::Constant* c,
     98                                                     std::string& name);
     99 
    100     static bool             isTargetMatch(llvm::MemoryBuffer* memBuffer,
    101                                                     const char* triplePrefix);
    102 
    103     static LTOModule*       makeLTOModule(llvm::MemoryBuffer* buffer,
    104                                                         std::string& errMsg);
    105     static llvm::MemoryBuffer* makeBuffer(const void* mem, size_t length);
    106 
    107     typedef llvm::StringMap<uint8_t> StringSet;
    108 
    109     struct NameAndAttributes {
    110         const char*            name;
    111         lto_symbol_attributes  attributes;
    112     };
    113 
    114     llvm::OwningPtr<llvm::Module>           _module;
    115     llvm::OwningPtr<llvm::TargetMachine>    _target;
    116     std::vector<NameAndAttributes>          _symbols;
    117     // _defines and _undefines only needed to disambiguate tentative definitions
    118     StringSet                               _defines;
    119     llvm::StringMap<NameAndAttributes>      _undefines;
    120     std::vector<const char*>                _asm_undefines;
    121 };
    122 
    123 #endif // LTO_MODULE_H
    124 
    125