llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
coqemitter.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 <llvm/Support/raw_ostream.h>
8 
9 #include "core/block.h"
10 
11 class Prog;
12 class Func;
13 
14 
15 
19 class CoqEmitter final {
20 public:
22  CoqEmitter(llvm::raw_ostream &os);
23 
25  void Write(const Prog &prog);
26 
27 private:
29  void WriteDefinition(const Func &func);
31  void Write(Block::const_iterator it);
33  void Unary(Block::const_iterator it, const char *op);
35  void Binary(Block::const_iterator it, const char *op);
37  void Mov(Block::const_iterator it);
39  template<unsigned Bits>
40  void MovInt(Block::const_iterator it, const char *op, const APInt &val);
41 
43  void WriteInversion(const Func &func);
45  void WriteDefinedAtInversion(const Func &func);
47  void WriteUsedAtInversion(const Func &func);
49  void WriteBlocks(const Func &func);
51  void WriteDominators(const Func &func);
52 
54  void WriteUsesHaveDefs(const Func &func);
56  void WriteDefsAreUniqe(const Func &func);
58  void WriteWellTyped(const Func &func);
59 
61  void Write(Type ty);
62 
64  std::string Name(const Func &func);
65 
66 private:
68  struct AtomID {
69  unsigned Segment;
70  unsigned Object;
71  unsigned Offset;
72  };
74  std::unordered_map<const Atom *, AtomID> atoms_;
75 
77  std::unordered_map<const Func *, unsigned> funcs_;
79  std::unordered_map<const Block *, unsigned> blocks_;
81  std::unordered_map<ConstRef<Inst>, unsigned> insts_;
83  llvm::raw_ostream &os_;
85  bool admitted_;
86 };
Func
Definition: func.h:30
Object
Definition: object.h:43
CoqEmitter
Definition: coqemitter.h:19
CoqEmitter::CoqEmitter
CoqEmitter(llvm::raw_ostream &os)
Creates a coq emitter.
Definition: coqemitter.cpp:18
Prog
Definition: prog.h:33
CoqEmitter::Write
void Write(const Prog &prog)
Writes a program.
Definition: coqemitter.cpp:25