llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
linker.h
1 // This file if part of the llir-opt project.
2 // Licensing information can be found in the LICENSE file.
3 // (C) 2018 Nandor Licker. All rights reserved.
4 
5 #pragma once
6 
7 #include <set>
8 #include <unordered_map>
9 #include <string>
10 
11 #include <llvm/Support/WithColor.h>
12 #include <llvm/LTO/LTO.h>
13 
14 class Prog;
15 class Func;
16 class Data;
17 class Xtor;
18 class Global;
19 
20 
21 
25 class Linker {
26 public:
28  class Unit {
29  public:
31  enum class Kind {
33  LLIR,
35  BITCODE,
37  OBJECT,
39  DATA,
40  };
41 
43  Unit(std::unique_ptr<Prog> &&prog);
45  Unit(std::unique_ptr<llvm::lto::InputFile> &&bitcode);
46 
48  struct Object { llvm::StringRef Path; };
49  Unit(const Object &object);
50 
52  struct Data { llvm::StringRef Path; };
53  Unit(const Data &data);
54 
56  Unit(Unit &&);
58  ~Unit();
59 
61  Unit &operator=(Unit &&);
62 
63  private:
64  friend class Linker;
66  Kind kind_;
68  union S {
69  std::unique_ptr<Prog> P;
70  std::unique_ptr<llvm::lto::InputFile> B;
71  std::string D;
72  S() {}
73  ~S() {}
74  } s_;
75  };
76 
78  using Archive = std::list<Linker::Unit>;
79 
81  Linker(const llvm::Triple &triple, std::string_view output)
82  : triple_(triple)
83  , output_(output)
84  , lto_(false)
85  {
86  }
87 
89  llvm::Error LinkUndefined(const std::string &symbol);
91  llvm::Error LinkObject(Unit &&unit);
93  llvm::Error LinkGroup(std::list<Linker::Unit> &&units);
94 
96  using LinkResult = std::pair<std::unique_ptr<Prog>, std::vector<std::string>>;
97  llvm::Expected<LinkResult> Link();
98 
99 private:
101  llvm::Expected<std::vector<std::unique_ptr<Prog>>> Collect();
103  void Resolve(Prog &prog);
105  void Resolve(llvm::lto::InputFile &obj);
107  void Resolve(const std::string &name);
108 
110  bool Resolves(Prog &prog);
112  bool Resolves(llvm::lto::InputFile &prog);
113 
115  bool Merge(Prog &dest, Prog &source);
117  bool Merge(Prog &dest, Func &func);
119  bool Merge(Prog &dest, Data &data);
121  bool Merge(Prog &dest, Xtor &xtor);
122 
124  void InitialiseLTO();
125 
127  llvm::MCTargetOptions CreateMCTargetOptions();
129  llvm::TargetOptions CreateTargetOptions();
131  llvm::lto::Config CreateLTOConfig();
133  llvm::Expected<std::vector<std::unique_ptr<Prog>>> LTO(
134  std::vector<std::unique_ptr<llvm::lto::InputFile>> &&modules
135  );
136 
137 private:
139  llvm::Triple triple_;
141  std::string output_;
143  std::vector<Unit> units_;
145  std::vector<std::string> files_;
147  std::set<std::string> unresolved_;
149  std::set<std::string> resolved_;
151  std::set<llvm::StringRef> linked_;
153  bool lto_;
154 };
Linker::Unit::Kind
Kind
Enumeration of objects to be linked.
Definition: linker.h:31
Linker::Unit
A unit to link.
Definition: linker.h:28
Linker::LinkGroup
llvm::Error LinkGroup(std::list< Linker::Unit > &&units)
Link a group of units.
Definition: linker.cpp:152
Linker::Unit::Kind::OBJECT
@ OBJECT
Regular object file.
Linker
Definition: linker.h:25
Func
Definition: func.h:30
Linker::Unit::Kind::DATA
@ DATA
Arbitrary data.
Linker::Linker
Linker(const llvm::Triple &triple, std::string_view output)
Initialise the linker.
Definition: linker.h:81
Linker::Unit::Data
Create a unit for an arbitrary data file.
Definition: linker.h:52
Data
Definition: data.h:47
Linker::Unit::Unit
Unit(std::unique_ptr< Prog > &&prog)
Create a unit for an LLIR program.
Definition: linker.cpp:22
Linker::Archive
std::list< Linker::Unit > Archive
Representation for an entire archive.
Definition: linker.h:78
Linker::LinkResult
std::pair< std::unique_ptr< Prog >, std::vector< std::string > > LinkResult
Return the resulting program.
Definition: linker.h:96
Linker::Unit::~Unit
~Unit()
Destructor.
Definition: linker.cpp:72
Xtor
Constructor/Destructor information.
Definition: xtor.h:20
Linker::Unit::Object
Create a unit for an ELF object.
Definition: linker.h:48
Prog
Definition: prog.h:33
Linker::Unit::Kind::BITCODE
@ BITCODE
LLVM bitcode.
Linker::Unit::Kind::LLIR
@ LLIR
LLIR program.
Linker::LinkUndefined
llvm::Error LinkUndefined(const std::string &symbol)
Link an undefined symbol.
Definition: linker.cpp:101
Linker::Unit::operator=
Unit & operator=(Unit &&)
Move-assignment operator.
Definition: linker.cpp:95
Linker::LinkObject
llvm::Error LinkObject(Unit &&unit)
Link an object, unconditionally.
Definition: linker.cpp:108
Global
Definition: global.h:23