1 //===-- llvm/CodeGen/MIRFormatter.h -----------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the declaration of the MIRFormatter class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CODEGEN_MIRFORMATTER_H
15 #define LLVM_CODEGEN_MIRFORMATTER_H
16 
17 #include "llvm/ADT/Optional.h"
18 #include "llvm/CodeGen/PseudoSourceValue.h"
19 #include "llvm/Support/raw_ostream.h"
20 #include <cstdint>
21 
22 namespace llvm {
23 
24 class MachineFunction;
25 class MachineInstr;
26 struct PerFunctionMIParsingState;
27 struct SlotMapping;
28 
29 /// MIRFormater - Interface to format MIR operand based on target
30 class MIRFormatter {
31 public:
32   typedef function_ref<bool(StringRef::iterator Loc, const Twine &)>
33       ErrorCallbackType;
34 
35   MIRFormatter() {}
36   virtual ~MIRFormatter() = default;
37 
38   /// Implement target specific printing for machine operand immediate value, so
39   /// that we can have more meaningful mnemonic than a 64-bit integer. Passing
40   /// None to OpIdx means the index is unknown.
41   virtual void printImm(raw_ostream &OS, const MachineInstr &MI,
42                         Optional<unsigned> OpIdx, int64_t Imm) const {
43     OS << Imm;
44   }
45 
46   /// Implement target specific parsing of immediate mnemonics. The mnemonic is
47   /// dot seperated strings.
48   virtual bool parseImmMnemonic(const unsigned OpCode, const unsigned OpIdx,
49                                 StringRef Src, int64_t &Imm,
50                                 ErrorCallbackType ErrorCallback) const {
51     llvm_unreachable("target did not implement parsing MIR immediate mnemonic");
52   }
53 
54   /// Implement target specific printing of target custom pseudo source value.
55   /// Default implementation is not necessarily the correct MIR serialization
56   /// format.
57   virtual void
58   printCustomPseudoSourceValue(raw_ostream &OS, ModuleSlotTracker &MST,
59                                const PseudoSourceValue &PSV) const {
60     PSV.printCustom(OS);
61   }
62 
63   /// Implement target specific parsing of target custom pseudo source value.
64   virtual bool parseCustomPseudoSourceValue(
65       StringRef Src, MachineFunction &MF, PerFunctionMIParsingState &PFS,
66       const PseudoSourceValue *&PSV, ErrorCallbackType ErrorCallback) const {
67     llvm_unreachable(
68         "target did not implement parsing MIR custom pseudo source value");
69   }
70 
71   /// Helper functions to print IR value as MIR serialization format which will
72   /// be useful for target specific printer, e.g. for printing IR value in
73   /// custom pseudo source value.
74   static void printIRValue(raw_ostream &OS, const Value &V,
75                            ModuleSlotTracker &MST);
76 
77   /// Helper functions to parse IR value from MIR serialization format which
78   /// will be useful for target specific parser, e.g. for parsing IR value for
79   /// custom pseudo source value.
80   static bool parseIRValue(StringRef Src, MachineFunction &MF,
81                            PerFunctionMIParsingState &PFS, const Value *&V,
82                            ErrorCallbackType ErrorCallback);
83 };
84 
85 } // end namespace llvm
86 
87 #endif
88