llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
aarch64call.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 <vector>
8 
9 #include <llvm/ADT/ArrayRef.h>
10 #include <llvm/ADT/iterator_range.h>
11 #include <llvm/MC/MCRegister.h>
12 
13 #include "core/inst.h"
14 #include "emitter/call_lowering.h"
15 
16 class CallInst;
17 class InvokeInst;
18 class ReturnInst;
19 class RaiseInst;
20 class Func;
21 
22 
23 
27 class AArch64Call final : public CallLowering {
28 public:
30  AArch64Call(const Func *func)
31  : CallLowering(func)
32  {
33  AnalyseFunc(func);
34  }
35 
37  AArch64Call(const CallSite *inst)
38  : CallLowering(inst)
39  {
40  AnalyseCall(inst);
41  }
42 
44  AArch64Call(const ReturnInst *inst)
45  : CallLowering(inst)
46  {
47  AnalyseReturn(inst);
48  }
49 
51  AArch64Call(const LandingPadInst *inst)
52  : CallLowering(inst)
53  {
54  AnalysePad(inst);
55  }
56 
58  AArch64Call(const RaiseInst *inst)
59  : CallLowering(inst)
60  {
61  AnalyseRaise(inst);
62  }
63 
65  llvm::ArrayRef<llvm::MCPhysReg> GetUnusedGPRs() const;
67  llvm::ArrayRef<llvm::MCPhysReg> GetUsedGPRs() const;
69  llvm::ArrayRef<llvm::MCPhysReg> GetUnusedFPRs() const;
71  llvm::ArrayRef<llvm::MCPhysReg> GetUsedFPRs() const;
72 
74  unsigned GetFrameSize() const override { return stack_; }
75 
76 private:
78  void AssignArgC(unsigned i, FlaggedType type) override;
80  void AssignArgOCaml(unsigned i, FlaggedType type) override;
82  void AssignArgOCamlAlloc(unsigned i, FlaggedType type) override;
84  void AssignArgOCamlGc(unsigned i, FlaggedType type) override;
86  void AssignArgXen(unsigned i, FlaggedType type) override;
88  void AssignArgWin64(unsigned i, FlaggedType type) override;
89 
91  void AssignRetC(unsigned i, FlaggedType type) override;
93  void AssignRetOCaml(unsigned i, FlaggedType type) override;
95  void AssignRetOCamlAlloc(unsigned i, FlaggedType type) override;
97  void AssignRetOCamlGc(unsigned i, FlaggedType type) override;
99  void AssignRetXen(unsigned i, FlaggedType type) override;
101  void AssignRetWin64(unsigned i, FlaggedType type) override;
102 
104  void AssignArgReg(ArgLoc &loc, llvm::MVT vt, llvm::Register reg);
106  void AssignArgStack(ArgLoc &loc, llvm::MVT type, unsigned size);
108  void AssignRetReg(RetLoc &loc, llvm::MVT vt, llvm::Register reg);
109 
111  llvm::ArrayRef<llvm::MCPhysReg> GetGPRs() const;
113  llvm::ArrayRef<llvm::MCPhysReg> GetFPRs() const;
114 
115 private:
117  unsigned argX_ = 0;
119  unsigned argD_ = 0;
121  unsigned retX_ = 0;
123  unsigned retD_ = 0;
125  unsigned stack_ = 0;
126 };
AArch64Call::GetFrameSize
unsigned GetFrameSize() const override
Returns the number of bytes allocated on the stack.
Definition: aarch64call.h:74
Func
Definition: func.h:30
CallLowering::AnalyseFunc
void AnalyseFunc(const Func *func)
Analyse a function.
Definition: call_lowering.cpp:64
CallLowering::AnalyseReturn
void AnalyseReturn(const ReturnInst *inst)
Analyse a return instruction.
Definition: call_lowering.cpp:73
AArch64Call
Definition: aarch64call.h:27
AArch64Call::AArch64Call
AArch64Call(const LandingPadInst *inst)
Analyses a return site.
Definition: aarch64call.h:51
CallLowering
Definition: call_lowering.h:21
CallLowering::AnalyseRaise
void AnalyseRaise(const RaiseInst *inst)
Analyse a raise instruction.
Definition: call_lowering.cpp:82
FlaggedType
Definition: type.h:77
AArch64Call::GetUsedFPRs
llvm::ArrayRef< llvm::MCPhysReg > GetUsedFPRs() const
Returns the used FPRs.
Definition: aarch64call.cpp:91
AArch64Call::AArch64Call
AArch64Call(const Func *func)
Analyses a function for arguments.
Definition: aarch64call.h:30
AArch64Call::AArch64Call
AArch64Call(const RaiseInst *inst)
Analyses a raise site.
Definition: aarch64call.h:58
CallLowering::AnalyseCall
void AnalyseCall(const CallSite *call)
Analyse a call.
Definition: call_lowering.cpp:48
AArch64Call::AArch64Call
AArch64Call(const CallSite *inst)
Analyses a call site.
Definition: aarch64call.h:37
AArch64Call::GetUnusedGPRs
llvm::ArrayRef< llvm::MCPhysReg > GetUnusedGPRs() const
Returns unused GPRs.
Definition: aarch64call.cpp:70
CallLowering::AnalysePad
void AnalysePad(const LandingPadInst *inst)
Analyse a landing pad instruction.
Definition: call_lowering.cpp:91
AArch64Call::GetUsedGPRs
llvm::ArrayRef< llvm::MCPhysReg > GetUsedGPRs() const
Returns the used GPRs.
Definition: aarch64call.cpp:77
AArch64Call::AArch64Call
AArch64Call(const ReturnInst *inst)
Analyses a return site.
Definition: aarch64call.h:44
AArch64Call::GetUnusedFPRs
llvm::ArrayRef< llvm::MCPhysReg > GetUnusedFPRs() const
Returns unused FPRs.
Definition: aarch64call.cpp:84