[WebAssembly] Introduce a WebAssemblyTargetStreamer class.
[oota-llvm.git] / lib / Target / WebAssembly / MCTargetDesc / WebAssemblyMCTargetDesc.h
1 //==- WebAssemblyMCTargetDesc.h - WebAssembly Target Descriptions -*- 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 /// \file
11 /// \brief This file provides WebAssembly-specific target descriptions.
12 ///
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
16 #define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
17
18 #include "llvm/MC/MCInstrDesc.h"
19 #include "llvm/Support/DataTypes.h"
20
21 namespace llvm {
22
23 class MCAsmBackend;
24 class MCCodeEmitter;
25 class MCContext;
26 class MCInstrInfo;
27 class MCObjectWriter;
28 class MCSubtargetInfo;
29 class Target;
30 class Triple;
31 class raw_pwrite_stream;
32
33 extern Target TheWebAssemblyTarget32;
34 extern Target TheWebAssemblyTarget64;
35
36 MCCodeEmitter *createWebAssemblyMCCodeEmitter(const MCInstrInfo &MCII,
37                                               MCContext &Ctx);
38
39 MCAsmBackend *createWebAssemblyAsmBackend(const Triple &TT);
40
41 MCObjectWriter *createWebAssemblyELFObjectWriter(raw_pwrite_stream &OS,
42                                                  bool Is64Bit, uint8_t OSABI);
43
44 namespace WebAssembly {
45 enum OperandType {
46   /// Basic block label in a branch construct.
47   OPERAND_BASIC_BLOCK = MCOI::OPERAND_FIRST_TARGET,
48   /// Floating-point immediate.
49   OPERAND_FPIMM
50 };
51
52 /// WebAssembly-specific directive identifiers.
53 enum Directive {
54   // FIXME: This is not the real binary encoding.
55   DotParam = UINT64_MAX - 0,   ///< .param
56   DotResult = UINT64_MAX - 1,  ///< .result
57   DotLocal = UINT64_MAX - 2,   ///< .local
58   DotEndFunc = UINT64_MAX - 3, ///< .endfunc
59 };
60
61 } // end namespace WebAssembly
62
63 namespace WebAssemblyII {
64 enum {
65   // For variadic instructions, this flag indicates whether an operand
66   // in the variable_ops range is an immediate value.
67   VariableOpIsImmediate = (1 << 0),
68   // For immediate values in the variable_ops range, this flag indicates
69   // whether the value represents a control-flow label.
70   VariableOpImmediateIsLabel = (1 << 1),
71 };
72 } // end namespace WebAssemblyII
73
74 } // end namespace llvm
75
76 // Defines symbolic names for WebAssembly registers. This defines a mapping from
77 // register name to register number.
78 //
79 #define GET_REGINFO_ENUM
80 #include "WebAssemblyGenRegisterInfo.inc"
81
82 // Defines symbolic names for the WebAssembly instructions.
83 //
84 #define GET_INSTRINFO_ENUM
85 #include "WebAssemblyGenInstrInfo.inc"
86
87 #define GET_SUBTARGETINFO_ENUM
88 #include "WebAssemblyGenSubtargetInfo.inc"
89
90 #endif