llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
emitter.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 <fstream>
8 #include <string>
9 
10 #include <llvm/Analysis/TargetLibraryInfo.h>
11 #include <llvm/IR/LLVMContext.h>
12 #include <llvm/Support/raw_ostream.h>
13 
14 #include "core/target.h"
15 
16 class Prog;
17 class ISel;
18 class AnnotPrinter;
19 
20 
21 
25 class Emitter {
26 public:
28  Emitter(
29  const std::string &path,
30  llvm::raw_fd_ostream &os,
31  Target &target
32  );
33 
35  virtual ~Emitter();
36 
38  void EmitASM(const Prog &prog);
39 
41  void EmitOBJ(const Prog &prog);
42 
43 private:
45  void Emit(llvm::CodeGenFileType type, const Prog &prog);
46 
47 protected:
49  virtual llvm::LLVMTargetMachine &GetTargetMachine() = 0;
51  virtual ISel *CreateISelPass(
52  const Prog &prog,
53  llvm::CodeGenOpt::Level opt
54  ) = 0;
57  llvm::MCContext &mcCtx,
58  llvm::MCStreamer &mcStreamer,
59  const llvm::TargetLoweringObjectFile &objInfo,
60  ISel &isel
61  ) = 0;
63  virtual llvm::ModulePass *CreateRuntimePass(
64  const Prog &prog,
65  llvm::MCContext &mcCtx,
66  llvm::MCStreamer &mcStreamer,
67  const llvm::TargetLoweringObjectFile &objInfo
68  ) = 0;
69 
70 protected:
74  const std::string path_;
76  llvm::raw_fd_ostream &os_;
78  const std::string triple_;
80  bool shared_;
82  llvm::LLVMContext context_;
83 };
Emitter::~Emitter
virtual ~Emitter()
Destroys the emitter.
Definition: emitter.cpp:72
Target
Definition: target.h:24
Emitter::EmitOBJ
void EmitOBJ(const Prog &prog)
Emits an object file for a program.
Definition: emitter.cpp:84
Emitter::context_
llvm::LLVMContext context_
LLVM Context.
Definition: emitter.h:82
AnnotPrinter
Definition: annot_printer.h:47
Emitter::target_
Target & target_
Underlying target.
Definition: emitter.h:72
ISel
Definition: isel.h:26
Emitter::Emitter
Emitter(const std::string &path, llvm::raw_fd_ostream &os, Target &target)
Creates an emitter.
Definition: emitter.cpp:59
Emitter
Definition: emitter.h:25
Emitter::CreateISelPass
virtual ISel * CreateISelPass(const Prog &prog, llvm::CodeGenOpt::Level opt)=0
Creates the LLIR-to-SelectionDAG pass.
Emitter::CreateRuntimePass
virtual llvm::ModulePass * CreateRuntimePass(const Prog &prog, llvm::MCContext &mcCtx, llvm::MCStreamer &mcStreamer, const llvm::TargetLoweringObjectFile &objInfo)=0
Creates the runtime generation pass.
Emitter::path_
const std::string path_
Path to the output file.
Definition: emitter.h:74
Emitter::CreateAnnotPass
virtual AnnotPrinter * CreateAnnotPass(llvm::MCContext &mcCtx, llvm::MCStreamer &mcStreamer, const llvm::TargetLoweringObjectFile &objInfo, ISel &isel)=0
Creates the annotation generation pass.
Prog
Definition: prog.h:33
Emitter::shared_
bool shared_
Flag to indicate if the target is a shared library.
Definition: emitter.h:80
Emitter::GetTargetMachine
virtual llvm::LLVMTargetMachine & GetTargetMachine()=0
Returns the generic target machine.
Emitter::triple_
const std::string triple_
Target triple.
Definition: emitter.h:78
Emitter::EmitASM
void EmitASM(const Prog &prog)
Emits assembly for a program.
Definition: emitter.cpp:78
Emitter::os_
llvm::raw_fd_ostream & os_
Output stream.
Definition: emitter.h:76