1//===-LTOCodeGenerator.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 LTOCodeGenerator class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LTO_CODE_GENERATOR_H
15#define LTO_CODE_GENERATOR_H
16
17#include "llvm/Linker.h"
18#include "llvm/ADT/StringMap.h"
19#include "llvm/ADT/SmallPtrSet.h"
20#include "llvm-c/lto.h"
21#include <string>
22
23namespace llvm {
24  class LLVMContext;
25  class GlobalValue;
26  class Mangler;
27  class MemoryBuffer;
28  class TargetMachine;
29  class raw_ostream;
30}
31
32//===----------------------------------------------------------------------===//
33/// LTOCodeGenerator - C++ class which implements the opaque lto_code_gen_t
34/// type.
35///
36struct LTOCodeGenerator {
37  static const char *getVersionString();
38
39  LTOCodeGenerator();
40  ~LTOCodeGenerator();
41
42  bool addModule(struct LTOModule*, std::string &errMsg);
43  bool setDebugInfo(lto_debug_model, std::string &errMsg);
44  bool setCodePICModel(lto_codegen_model, std::string &errMsg);
45
46  void setCpu(const char* mCpu) { _mCpu = mCpu; }
47
48  void addMustPreserveSymbol(const char* sym) {
49    _mustPreserveSymbols[sym] = 1;
50  }
51
52  bool writeMergedModules(const char *path, std::string &errMsg);
53  bool compile_to_file(const char **name, std::string &errMsg);
54  const void *compile(size_t *length, std::string &errMsg);
55  void setCodeGenDebugOptions(const char *opts);
56
57private:
58  bool generateObjectFile(llvm::raw_ostream &out, std::string &errMsg);
59  void applyScopeRestrictions();
60  void applyRestriction(llvm::GlobalValue &GV,
61                        std::vector<const char*> &mustPreserveList,
62                        llvm::SmallPtrSet<llvm::GlobalValue*, 8> &asmUsed,
63                        llvm::Mangler &mangler);
64  bool determineTarget(std::string &errMsg);
65
66  typedef llvm::StringMap<uint8_t> StringSet;
67
68  llvm::LLVMContext&          _context;
69  llvm::Linker                _linker;
70  llvm::TargetMachine*        _target;
71  bool                        _emitDwarfDebugInfo;
72  bool                        _scopeRestrictionsDone;
73  lto_codegen_model           _codeModel;
74  StringSet                   _mustPreserveSymbols;
75  StringSet                   _asmUndefinedRefs;
76  llvm::MemoryBuffer*         _nativeObjectFile;
77  std::vector<char*>          _codegenOptions;
78  std::string                 _mCpu;
79  std::string                 _nativeObjectPath;
80};
81
82#endif // LTO_CODE_GENERATOR_H
83