annotate llvm/tools/llvm-exegesis/lib/Assembler.h @ 201:a96fbbdf2d0f

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 04 Jun 2021 21:07:06 +0900
parents 0572611fdcc8
children 1f2b6ac9f198
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- Assembler.h ---------------------------------------------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 ///
anatofuz
parents:
diff changeset
9 /// \file
anatofuz
parents:
diff changeset
10 /// Defines classes to assemble functions composed of a single basic block of
anatofuz
parents:
diff changeset
11 /// MCInsts.
anatofuz
parents:
diff changeset
12 ///
anatofuz
parents:
diff changeset
13 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 #ifndef LLVM_TOOLS_LLVM_EXEGESIS_ASSEMBLER_H
anatofuz
parents:
diff changeset
16 #define LLVM_TOOLS_LLVM_EXEGESIS_ASSEMBLER_H
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 #include <memory>
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 #include "BenchmarkCode.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
21 #include "Error.h"
150
anatofuz
parents:
diff changeset
22 #include "llvm/ADT/ArrayRef.h"
anatofuz
parents:
diff changeset
23 #include "llvm/ADT/BitVector.h"
anatofuz
parents:
diff changeset
24 #include "llvm/CodeGen/MachineFunction.h"
anatofuz
parents:
diff changeset
25 #include "llvm/CodeGen/MachineModuleInfo.h"
anatofuz
parents:
diff changeset
26 #include "llvm/ExecutionEngine/ExecutionEngine.h"
anatofuz
parents:
diff changeset
27 #include "llvm/IR/LLVMContext.h"
anatofuz
parents:
diff changeset
28 #include "llvm/IR/Module.h"
anatofuz
parents:
diff changeset
29 #include "llvm/MC/MCInst.h"
anatofuz
parents:
diff changeset
30 #include "llvm/Object/Binary.h"
anatofuz
parents:
diff changeset
31 #include "llvm/Object/ObjectFile.h"
anatofuz
parents:
diff changeset
32 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
33 #include "llvm/Target/TargetMachine.h"
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 namespace llvm {
anatofuz
parents:
diff changeset
36 namespace exegesis {
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 class ExegesisTarget;
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 // Gather the set of reserved registers (depends on function's calling
anatofuz
parents:
diff changeset
41 // convention and target machine).
anatofuz
parents:
diff changeset
42 BitVector getFunctionReservedRegs(const TargetMachine &TM);
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 // Helper to fill in a basic block.
anatofuz
parents:
diff changeset
45 class BasicBlockFiller {
anatofuz
parents:
diff changeset
46 public:
anatofuz
parents:
diff changeset
47 BasicBlockFiller(MachineFunction &MF, MachineBasicBlock *MBB,
anatofuz
parents:
diff changeset
48 const MCInstrInfo *MCII);
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 void addInstruction(const MCInst &Inst, const DebugLoc &DL = DebugLoc());
anatofuz
parents:
diff changeset
51 void addInstructions(ArrayRef<MCInst> Insts, const DebugLoc &DL = DebugLoc());
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 void addReturn(const DebugLoc &DL = DebugLoc());
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 MachineFunction &MF;
anatofuz
parents:
diff changeset
56 MachineBasicBlock *const MBB;
anatofuz
parents:
diff changeset
57 const MCInstrInfo *const MCII;
anatofuz
parents:
diff changeset
58 };
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60 // Helper to fill in a function.
anatofuz
parents:
diff changeset
61 class FunctionFiller {
anatofuz
parents:
diff changeset
62 public:
anatofuz
parents:
diff changeset
63 FunctionFiller(MachineFunction &MF, std::vector<unsigned> RegistersSetUp);
anatofuz
parents:
diff changeset
64
anatofuz
parents:
diff changeset
65 // Adds a basic block to the function.
anatofuz
parents:
diff changeset
66 BasicBlockFiller addBasicBlock();
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 // Returns the function entry point.
anatofuz
parents:
diff changeset
69 BasicBlockFiller getEntry() { return Entry; }
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 MachineFunction &MF;
anatofuz
parents:
diff changeset
72 const MCInstrInfo *const MCII;
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 // Returns the set of registers in the snippet setup code.
anatofuz
parents:
diff changeset
75 ArrayRef<unsigned> getRegistersSetUp() const;
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 private:
anatofuz
parents:
diff changeset
78 BasicBlockFiller Entry;
anatofuz
parents:
diff changeset
79 // The set of registers that are set up in the basic block.
anatofuz
parents:
diff changeset
80 std::vector<unsigned> RegistersSetUp;
anatofuz
parents:
diff changeset
81 };
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 // A callback that fills a function.
anatofuz
parents:
diff changeset
84 using FillFunction = std::function<void(FunctionFiller &)>;
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 // Creates a temporary `void foo(char*)` function containing the provided
anatofuz
parents:
diff changeset
87 // Instructions. Runs a set of llvm Passes to provide correct prologue and
anatofuz
parents:
diff changeset
88 // epilogue. Once the MachineFunction is ready, it is assembled for TM to
anatofuz
parents:
diff changeset
89 // AsmStream, the temporary function is eventually discarded.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
90 Error assembleToStream(const ExegesisTarget &ET,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
91 std::unique_ptr<LLVMTargetMachine> TM,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
92 ArrayRef<unsigned> LiveIns,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
93 ArrayRef<RegisterValue> RegisterInitialValues,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
94 const FillFunction &Fill, raw_pwrite_stream &AsmStream);
150
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 // Creates an ObjectFile in the format understood by the host.
anatofuz
parents:
diff changeset
97 // Note: the resulting object keeps a copy of Buffer so it can be discarded once
anatofuz
parents:
diff changeset
98 // this function returns.
anatofuz
parents:
diff changeset
99 object::OwningBinary<object::ObjectFile> getObjectFromBuffer(StringRef Buffer);
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 // Loads the content of Filename as on ObjectFile and returns it.
anatofuz
parents:
diff changeset
102 object::OwningBinary<object::ObjectFile> getObjectFromFile(StringRef Filename);
anatofuz
parents:
diff changeset
103
anatofuz
parents:
diff changeset
104 // Consumes an ObjectFile containing a `void foo(char*)` function and make it
anatofuz
parents:
diff changeset
105 // executable.
anatofuz
parents:
diff changeset
106 struct ExecutableFunction {
anatofuz
parents:
diff changeset
107 explicit ExecutableFunction(
anatofuz
parents:
diff changeset
108 std::unique_ptr<LLVMTargetMachine> TM,
anatofuz
parents:
diff changeset
109 object::OwningBinary<object::ObjectFile> &&ObjectFileHolder);
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 // Retrieves the function as an array of bytes.
anatofuz
parents:
diff changeset
112 StringRef getFunctionBytes() const { return FunctionBytes; }
anatofuz
parents:
diff changeset
113
anatofuz
parents:
diff changeset
114 // Executes the function.
anatofuz
parents:
diff changeset
115 void operator()(char *Memory) const {
anatofuz
parents:
diff changeset
116 ((void (*)(char *))(intptr_t)FunctionBytes.data())(Memory);
anatofuz
parents:
diff changeset
117 }
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 std::unique_ptr<LLVMContext> Context;
anatofuz
parents:
diff changeset
120 std::unique_ptr<ExecutionEngine> ExecEngine;
anatofuz
parents:
diff changeset
121 StringRef FunctionBytes;
anatofuz
parents:
diff changeset
122 };
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 // Creates a void(int8*) MachineFunction.
anatofuz
parents:
diff changeset
125 MachineFunction &createVoidVoidPtrMachineFunction(StringRef FunctionID,
anatofuz
parents:
diff changeset
126 Module *Module,
anatofuz
parents:
diff changeset
127 MachineModuleInfo *MMI);
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 } // namespace exegesis
anatofuz
parents:
diff changeset
130 } // namespace llvm
anatofuz
parents:
diff changeset
131
anatofuz
parents:
diff changeset
132 #endif // LLVM_TOOLS_LLVM_EXEGESIS_ASSEMBLER_H