llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
clone.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 <unordered_map>
8 
9 #include "core/cast.h"
10 #include "core/insts.h"
11 
12 class Inst;
13 class Block;
14 class Global;
15 class Prog;
16 
17 
18 
22 class CloneVisitor {
23 public:
25  virtual ~CloneVisitor();
26 
27 public:
29  virtual Block *Map(Block *block) { return block; }
31  virtual Func *Map(Func *func) { return func; }
33  virtual Extern *Map(Extern *ext) { return ext; }
35  virtual Atom *Map(Atom *atom) { return atom; }
37  virtual Constant *Map(Constant *constant) { return constant; }
39  virtual Global *Map(Global *global);
41  virtual Expr *Map(Expr *expr);
43  virtual AnnotSet Annot(const Inst *inst);
44 
45 public:
47  virtual Ref<Inst> Map(Ref<Inst> inst) { return inst; }
49  virtual Type Map(Type ty, Inst *inst, unsigned idx) { return ty; }
50 
51 public:
53  virtual Inst *Clone(Inst *inst);
55  void Fixup();
56 
57 public:
58  // Declaration of individual clone methods.
59  #define GET_INST(kind, type, name, sort) \
60  virtual Inst *Clone(type *i);
61  #include "instructions.def"
62 
63 protected:
65  Ref<Value> Map(Ref<Value> value);
66 
68  template<typename It, typename T = typename It::value_type>
69  std::vector<T> Map(llvm::iterator_range<It> range)
70  {
71  std::vector<T> args;
72  for (T arg : range) {
73  args.push_back(Map(arg));
74  }
75  return args;
76  }
77 
78 protected:
80  llvm::SmallVector<std::pair<PhiInst *, PhiInst *>, 10> fixups_;
81 };
82 
83 
87 std::pair<std::unique_ptr<Prog>, Inst *> Clone(Prog &oldProg, Inst *inst);
88 
89 
93 template<typename T>
94 std::pair<std::unique_ptr<Prog>, T *> CloneT(Prog &oldProg, T *inst)
95 {
96  auto &&[prog, newInst] = Clone(oldProg, inst);
97  return { std::move(prog), static_cast<T *>(newInst) };
98 }
99 
100 
104 std::unique_ptr<Prog> Clone(Prog &oldProg);
CloneVisitor::Fixup
void Fixup()
Fixes PHI nodes.
Definition: clone.cpp:22
Inst
Definition: inst.h:53
Func
Definition: func.h:30
Atom
Definition: atom.h:23
CloneVisitor::Map
virtual Atom * Map(Atom *atom)
Maps an atom to a new one.
Definition: clone.h:35
CloneVisitor::Map
virtual Constant * Map(Constant *constant)
Maps a constant to a new one.
Definition: clone.h:37
CloneVisitor::Annot
virtual AnnotSet Annot(const Inst *inst)
Clones an annotation.
Definition: clone.cpp:86
CloneVisitor::fixups_
llvm::SmallVector< std::pair< PhiInst *, PhiInst * >, 10 > fixups_
PHI instruction delayed fixups.
Definition: clone.h:80
CloneVisitor::Map
virtual Extern * Map(Extern *ext)
Maps a block to a new one.
Definition: clone.h:33
CloneVisitor::~CloneVisitor
virtual ~CloneVisitor()
Destroys the visitor.
Definition: clone.cpp:17
Constant
Definition: constant.h:21
Expr
Definition: expr.h:19
CloneVisitor::Map
std::vector< T > Map(llvm::iterator_range< It > range)
Map a vector of values.
Definition: clone.h:69
CloneVisitor::Map
virtual Type Map(Type ty, Inst *inst, unsigned idx)
Maps a type to a new one.
Definition: clone.h:49
AnnotSet
Definition: annot.h:69
CloneVisitor
Definition: clone.h:22
CloneVisitor::Map
virtual Func * Map(Func *func)
Maps a block to a new one.
Definition: clone.h:31
Prog
Definition: prog.h:33
Ref
Definition: ref.h:63
Block
Definition: block.h:29
Extern
Definition: extern.h:20
CloneVisitor::Clone
virtual Inst * Clone(Inst *inst)
Clones an instruction.
Definition: clone.cpp:75
CloneVisitor::Map
virtual Block * Map(Block *block)
Maps a block to a new one.
Definition: clone.h:29
CloneVisitor::Map
virtual Ref< Inst > Map(Ref< Inst > inst)
Maps an instruction reference to a new one.
Definition: clone.h:47
Global
Definition: global.h:23