LLVM  14.0.0git
Wasm.h
Go to the documentation of this file.
1 //===- Wasm.h - Wasm object file format -------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines manifest constants for the wasm object file format.
10 // See: https://github.com/WebAssembly/design/blob/main/BinaryEncoding.md
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_BINARYFORMAT_WASM_H
15 #define LLVM_BINARYFORMAT_WASM_H
16 
17 #include "llvm/ADT/ArrayRef.h"
18 #include "llvm/ADT/Optional.h"
19 #include "llvm/ADT/SmallVector.h"
20 #include "llvm/ADT/StringRef.h"
21 
22 namespace llvm {
23 namespace wasm {
24 
25 // Object file magic string.
26 const char WasmMagic[] = {'\0', 'a', 's', 'm'};
27 // Wasm binary format version
28 const uint32_t WasmVersion = 0x1;
29 // Wasm linking metadata version
31 // Wasm uses a 64k page size
32 const uint32_t WasmPageSize = 65536;
33 
37 };
38 
43 };
44 
48 };
49 
51  uint32_t MemorySize; // Memory size in bytes
52  uint32_t MemoryAlignment; // P2 alignment of memory
53  uint32_t TableSize; // Table size in elements
54  uint32_t TableAlignment; // P2 alignment of table
55  std::vector<StringRef> Needed; // Shared library dependencies
56  std::vector<WasmDylinkImportInfo> ImportInfo;
57  std::vector<WasmDylinkExportInfo> ExportInfo;
58 };
59 
61  std::vector<std::pair<std::string, std::string>> Languages;
62  std::vector<std::pair<std::string, std::string>> Tools;
63  std::vector<std::pair<std::string, std::string>> SDKs;
64 };
65 
67  uint8_t Prefix;
68  std::string Name;
69 };
70 
71 struct WasmExport {
73  uint8_t Kind;
75 };
76 
77 struct WasmLimits {
78  uint8_t Flags;
81 };
82 
83 struct WasmTableType {
84  uint8_t ElemType;
86 };
87 
88 struct WasmTable {
91  StringRef SymbolName; // from the "linking" section
92 };
93 
94 struct WasmInitExpr {
95  uint8_t Opcode;
96  union {
97  int32_t Int32;
98  int64_t Int64;
102  } Value;
103 };
104 
106  uint8_t Type;
107  bool Mutable;
108 };
109 
110 struct WasmGlobal {
114  StringRef SymbolName; // from the "linking" section
115 };
116 
117 struct WasmTag {
120  StringRef SymbolName; // from the "linking" section
121 };
122 
123 struct WasmImport {
126  uint8_t Kind;
127  union {
132  };
133 };
134 
136  uint8_t Type;
138 };
139 
140 struct WasmFunction {
143  std::vector<WasmLocalDecl> Locals;
147  uint32_t CodeOffset; // start of Locals and Body
148  Optional<StringRef> ExportName; // from the "export" section
149  StringRef SymbolName; // from the "linking" section
150  StringRef DebugName; // from the "name" section
151  uint32_t Comdat; // from the "comdat info" section
152 };
153 
156  // Present if InitFlags & WASM_DATA_SEGMENT_HAS_MEMINDEX.
158  // Present if InitFlags & WASM_DATA_SEGMENT_IS_PASSIVE == 0.
160 
162  StringRef Name; // from the "segment info" section
165  uint32_t Comdat; // from the "comdat info" section
166 };
167 
171  uint8_t ElemKind;
173  std::vector<uint32_t> Functions;
174 };
175 
176 // Represents the location of a Wasm data symbol within a WasmDataSegment, as
177 // the index of the segment, and the offset and size within the segment.
182 };
183 
185  uint8_t Type; // The type of the relocation.
186  uint32_t Index; // Index into either symbol or type index space.
187  uint64_t Offset; // Offset from the start of the section.
188  int64_t Addend; // A value to add to the symbol.
189 };
190 
191 struct WasmInitFunc {
194 };
195 
198  uint8_t Kind;
200  // For undefined symbols the module of the import
202  // For undefined symbols the name of the import
204  // For symbols to be exported from the final module
206  union {
207  // For function, table, or global symbols, the index in function, table, or
208  // global index space.
210  // For a data symbols, the address of the data relative to segment.
212  };
213 };
214 
215 enum class NameType {
216  FUNCTION,
217  GLOBAL,
218  DATA_SEGMENT,
219 };
220 
225 };
226 
229  std::vector<WasmInitFunc> InitFunctions;
230  std::vector<StringRef> Comdats;
231  std::vector<WasmSymbolInfo> SymbolTable;
232 };
233 
234 enum : unsigned {
235  WASM_SEC_CUSTOM = 0, // Custom / User-defined section
236  WASM_SEC_TYPE = 1, // Function signature declarations
237  WASM_SEC_IMPORT = 2, // Import declarations
238  WASM_SEC_FUNCTION = 3, // Function declarations
239  WASM_SEC_TABLE = 4, // Indirect function table and other tables
240  WASM_SEC_MEMORY = 5, // Memory attributes
241  WASM_SEC_GLOBAL = 6, // Global declarations
242  WASM_SEC_EXPORT = 7, // Exports
243  WASM_SEC_START = 8, // Start function declaration
244  WASM_SEC_ELEM = 9, // Elements section
245  WASM_SEC_CODE = 10, // Function bodies (code)
246  WASM_SEC_DATA = 11, // Data segments
247  WASM_SEC_DATACOUNT = 12, // Data segment count
248  WASM_SEC_TAG = 13 // Tag declarations
249 };
250 
251 // Type immediate encodings used in various contexts.
252 enum : unsigned {
261  WASM_TYPE_NORESULT = 0x40, // for blocks with no result values
262 };
263 
264 // Kinds of externals (for imports and exports).
265 enum : unsigned {
271 };
272 
273 // Opcodes used in initializer expressions.
274 enum : unsigned {
290 };
291 
292 // Opcodes used in synthetic functions.
293 enum : unsigned {
308 };
309 
310 enum : unsigned {
315 };
316 
317 enum : unsigned {
320 };
321 
322 enum : unsigned {
326 };
328 
329 // Feature policy prefixes used in the custom "target_features" section
330 enum : uint8_t {
334 };
335 
336 // Kind codes used in the custom "name" section
337 enum : unsigned {
342 };
343 
344 // Kind codes used in the custom "linking" section
345 enum : unsigned {
350 };
351 
352 // Kind codes used in the custom "dylink" section
353 enum : unsigned {
358 };
359 
360 // Kind codes used in the custom "linking" section in the WASM_COMDAT_INFO
361 enum : unsigned {
364  // GLOBAL, TAG, and TABLE are in here but LLVM doesn't use them yet.
366 };
367 
368 // Kind codes used in the custom "linking" section in the WASM_SYMBOL_TABLE
369 enum WasmSymbolType : unsigned {
376 };
377 
378 enum WasmSegmentFlag : unsigned {
381 };
382 
383 // Kinds of tag attributes.
384 enum WasmTagAttribute : uint8_t {
386 };
387 
388 const unsigned WASM_SYMBOL_BINDING_MASK = 0x3;
389 const unsigned WASM_SYMBOL_VISIBILITY_MASK = 0xc;
390 
391 const unsigned WASM_SYMBOL_BINDING_GLOBAL = 0x0;
392 const unsigned WASM_SYMBOL_BINDING_WEAK = 0x1;
393 const unsigned WASM_SYMBOL_BINDING_LOCAL = 0x2;
394 const unsigned WASM_SYMBOL_VISIBILITY_DEFAULT = 0x0;
395 const unsigned WASM_SYMBOL_VISIBILITY_HIDDEN = 0x4;
396 const unsigned WASM_SYMBOL_UNDEFINED = 0x10;
397 const unsigned WASM_SYMBOL_EXPORTED = 0x20;
398 const unsigned WASM_SYMBOL_EXPLICIT_NAME = 0x40;
399 const unsigned WASM_SYMBOL_NO_STRIP = 0x80;
400 const unsigned WASM_SYMBOL_TLS = 0x100;
401 
402 #define WASM_RELOC(name, value) name = value,
403 
404 enum : unsigned {
405 #include "WasmRelocs.def"
406 };
407 
408 #undef WASM_RELOC
409 
410 // Subset of types that a value can have
411 enum class ValType {
412  I32 = WASM_TYPE_I32,
413  I64 = WASM_TYPE_I64,
414  F32 = WASM_TYPE_F32,
415  F64 = WASM_TYPE_F64,
419 };
420 
424  // Support empty and tombstone instances, needed by DenseMap.
426 
428  SmallVector<ValType, 4> &&InParams)
429  : Returns(InReturns), Params(InParams) {}
430  WasmSignature() = default;
431 };
432 
433 // Useful comparison operators
434 inline bool operator==(const WasmSignature &LHS, const WasmSignature &RHS) {
435  return LHS.State == RHS.State && LHS.Returns == RHS.Returns &&
436  LHS.Params == RHS.Params;
437 }
438 
439 inline bool operator!=(const WasmSignature &LHS, const WasmSignature &RHS) {
440  return !(LHS == RHS);
441 }
442 
443 inline bool operator==(const WasmGlobalType &LHS, const WasmGlobalType &RHS) {
444  return LHS.Type == RHS.Type && LHS.Mutable == RHS.Mutable;
445 }
446 
447 inline bool operator!=(const WasmGlobalType &LHS, const WasmGlobalType &RHS) {
448  return !(LHS == RHS);
449 }
450 
451 inline bool operator==(const WasmLimits &LHS, const WasmLimits &RHS) {
452  return LHS.Flags == RHS.Flags && LHS.Minimum == RHS.Minimum &&
453  (LHS.Flags & WASM_LIMITS_FLAG_HAS_MAX ? LHS.Maximum == RHS.Maximum
454  : true);
455 }
456 
457 inline bool operator==(const WasmTableType &LHS, const WasmTableType &RHS) {
458  return LHS.ElemType == RHS.ElemType && LHS.Limits == RHS.Limits;
459 }
460 
461 std::string toString(WasmSymbolType type);
462 std::string relocTypetoString(uint32_t type);
464 
465 } // end namespace wasm
466 } // end namespace llvm
467 
468 #endif
llvm::wasm::WasmImport::Memory
WasmLimits Memory
Definition: Wasm.h:131
llvm::wasm::WASM_SYMBOL_TYPE_SECTION
@ WASM_SYMBOL_TYPE_SECTION
Definition: Wasm.h:373
llvm::wasm::WASM_SYMBOL_EXPORTED
const unsigned WASM_SYMBOL_EXPORTED
Definition: Wasm.h:397
llvm::wasm::WASM_TYPE_I32
@ WASM_TYPE_I32
Definition: Wasm.h:253
llvm::wasm::WasmTag
Definition: Wasm.h:117
llvm::wasm::WasmDylinkExportInfo::Flags
uint32_t Flags
Definition: Wasm.h:47
llvm::wasm::WasmDataSegment::Offset
WasmInitExpr Offset
Definition: Wasm.h:159
llvm::wasm::WasmDataSegment::Content
ArrayRef< uint8_t > Content
Definition: Wasm.h:161
llvm::wasm::WASM_LIMITS_FLAG_IS_SHARED
@ WASM_LIMITS_FLAG_IS_SHARED
Definition: Wasm.h:313
llvm::wasm::WasmSegmentFlag
WasmSegmentFlag
Definition: Wasm.h:378
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AllocatorList.h:23
llvm::wasm::WasmDataSegment::Comdat
uint32_t Comdat
Definition: Wasm.h:165
llvm::wasm::ValType::I32
@ I32
llvm::wasm::WasmElemSegment::Offset
WasmInitExpr Offset
Definition: Wasm.h:172
llvm::wasm::WasmFunction::SymbolName
StringRef SymbolName
Definition: Wasm.h:149
llvm::wasm::WASM_SYMBOL_TABLE
@ WASM_SYMBOL_TABLE
Definition: Wasm.h:349
llvm::wasm::WASM_OPCODE_I32_CONST
@ WASM_OPCODE_I32_CONST
Definition: Wasm.h:283
Optional.h
llvm::wasm::WasmFunction::CodeOffset
uint32_t CodeOffset
Definition: Wasm.h:147
llvm::wasm::WASM_ELEM_SEGMENT_MASK_HAS_ELEM_KIND
const unsigned WASM_ELEM_SEGMENT_MASK_HAS_ELEM_KIND
Definition: Wasm.h:327
llvm::wasm::WASM_SEC_GLOBAL
@ WASM_SEC_GLOBAL
Definition: Wasm.h:241
llvm::wasm::WasmFunction::Body
ArrayRef< uint8_t > Body
Definition: Wasm.h:144
llvm::wasm::WasmFunction::SigIndex
uint32_t SigIndex
Definition: Wasm.h:142
llvm::wasm::WasmLimits::Minimum
uint64_t Minimum
Definition: Wasm.h:79
StringRef.h
llvm::wasm::WasmDebugName::Index
uint32_t Index
Definition: Wasm.h:223
llvm::wasm::WasmVersion
const uint32_t WasmVersion
Definition: Wasm.h:28
llvm::wasm::WASM_OPCODE_LOCAL_GET
@ WASM_OPCODE_LOCAL_GET
Definition: Wasm.h:277
llvm::wasm::WasmFeatureEntry
Definition: Wasm.h:66
llvm::SmallVector< ValType, 1 >
llvm::wasm::WasmObjectHeader::Version
uint32_t Version
Definition: Wasm.h:36
llvm::wasm::WasmLinkingData::SymbolTable
std::vector< WasmSymbolInfo > SymbolTable
Definition: Wasm.h:231
llvm::wasm::WASM_SYMBOL_NO_STRIP
const unsigned WASM_SYMBOL_NO_STRIP
Definition: Wasm.h:399
llvm::wasm::WasmDataSegment::InitFlags
uint32_t InitFlags
Definition: Wasm.h:155
llvm::wasm::WASM_EXTERNAL_MEMORY
@ WASM_EXTERNAL_MEMORY
Definition: Wasm.h:268
llvm::wasm::WasmFunction::Comdat
uint32_t Comdat
Definition: Wasm.h:151
llvm::wasm::WASM_SYMBOL_BINDING_LOCAL
const unsigned WASM_SYMBOL_BINDING_LOCAL
Definition: Wasm.h:393
llvm::wasm::WASM_SYMBOL_TYPE_TABLE
@ WASM_SYMBOL_TYPE_TABLE
Definition: Wasm.h:375
llvm::wasm::WASM_SYMBOL_TYPE_GLOBAL
@ WASM_SYMBOL_TYPE_GLOBAL
Definition: Wasm.h:372
llvm::wasm::WasmRelocation
Definition: Wasm.h:184
llvm::wasm::WasmImport::Table
WasmTableType Table
Definition: Wasm.h:130
llvm::wasm::WASM_OPCODE_F64_CONST
@ WASM_OPCODE_F64_CONST
Definition: Wasm.h:286
llvm::wasm::WasmDylinkInfo::ImportInfo
std::vector< WasmDylinkImportInfo > ImportInfo
Definition: Wasm.h:56
llvm::wasm::WasmImport::SigIndex
uint32_t SigIndex
Definition: Wasm.h:128
llvm::wasm::WASM_OPCODE_ATOMICS_PREFIX
@ WASM_OPCODE_ATOMICS_PREFIX
Definition: Wasm.h:303
llvm::wasm::WasmElemSegment::ElemKind
uint8_t ElemKind
Definition: Wasm.h:171
llvm::Optional
Definition: APInt.h:33
llvm::wasm::WASM_SYMBOL_UNDEFINED
const unsigned WASM_SYMBOL_UNDEFINED
Definition: Wasm.h:396
llvm::wasm::WasmFunction::Locals
std::vector< WasmLocalDecl > Locals
Definition: Wasm.h:143
llvm::wasm::WASM_SEC_MEMORY
@ WASM_SEC_MEMORY
Definition: Wasm.h:240
llvm::wasm::WASM_EXTERNAL_TAG
@ WASM_EXTERNAL_TAG
Definition: Wasm.h:270
llvm::wasm::WASM_SEC_START
@ WASM_SEC_START
Definition: Wasm.h:243
llvm::wasm::WasmSymbolInfo::Kind
uint8_t Kind
Definition: Wasm.h:198
llvm::wasm::WASM_SEC_FUNCTION
@ WASM_SEC_FUNCTION
Definition: Wasm.h:238
llvm::wasm::WasmDebugName::Name
StringRef Name
Definition: Wasm.h:224
llvm::wasm::WasmFunction
Definition: Wasm.h:140
RHS
Value * RHS
Definition: X86PartialReduction.cpp:74
llvm::wasm::WasmSignature::WasmSignature
WasmSignature(SmallVector< ValType, 1 > &&InReturns, SmallVector< ValType, 4 > &&InParams)
Definition: Wasm.h:427
llvm::wasm::WasmExport::Kind
uint8_t Kind
Definition: Wasm.h:73
llvm::wasm::WASM_OPCODE_GLOBAL_SET
@ WASM_OPCODE_GLOBAL_SET
Definition: Wasm.h:280
llvm::wasm::WasmDataReference::Offset
uint64_t Offset
Definition: Wasm.h:180
llvm::wasm::WASM_OPCODE_MEMORY_INIT
@ WASM_OPCODE_MEMORY_INIT
Definition: Wasm.h:300
llvm::wasm::WASM_SEC_ELEM
@ WASM_SEC_ELEM
Definition: Wasm.h:244
llvm::wasm::WASM_DYLINK_MEM_INFO
@ WASM_DYLINK_MEM_INFO
Definition: Wasm.h:354
llvm::wasm::WASM_TYPE_FUNCREF
@ WASM_TYPE_FUNCREF
Definition: Wasm.h:258
llvm::wasm::WasmDataReference
Definition: Wasm.h:178
llvm::wasm::WasmGlobal::Type
WasmGlobalType Type
Definition: Wasm.h:112
llvm::wasm::WasmExport::Index
uint32_t Index
Definition: Wasm.h:74
llvm::wasm::WasmProducerInfo
Definition: Wasm.h:60
llvm::wasm::WasmRelocation::Offset
uint64_t Offset
Definition: Wasm.h:187
llvm::wasm::WASM_SEC_TAG
@ WASM_SEC_TAG
Definition: Wasm.h:248
llvm::wasm::WASM_NAMES_LOCAL
@ WASM_NAMES_LOCAL
Definition: Wasm.h:339
llvm::wasm::WASM_OPCODE_MEMORY_FILL
@ WASM_OPCODE_MEMORY_FILL
Definition: Wasm.h:301
llvm::wasm::WASM_COMDAT_INFO
@ WASM_COMDAT_INFO
Definition: Wasm.h:348
llvm::wasm::WasmElemSegment::TableNumber
uint32_t TableNumber
Definition: Wasm.h:170
LHS
Value * LHS
Definition: X86PartialReduction.cpp:73
llvm::wasm::WASM_OPCODE_I32_ATOMIC_STORE
@ WASM_OPCODE_I32_ATOMIC_STORE
Definition: Wasm.h:306
llvm::wasm::WASM_SYMBOL_BINDING_WEAK
const unsigned WASM_SYMBOL_BINDING_WEAK
Definition: Wasm.h:392
llvm::wasm::WasmInitFunc::Priority
uint32_t Priority
Definition: Wasm.h:192
llvm::wasm::WasmInitExpr::Value
union llvm::wasm::WasmInitExpr::@166 Value
llvm::wasm::WasmFunction::DebugName
StringRef DebugName
Definition: Wasm.h:150
llvm::wasm::WASM_FEATURE_PREFIX_DISALLOWED
@ WASM_FEATURE_PREFIX_DISALLOWED
Definition: Wasm.h:333
llvm::wasm::WASM_COMDAT_FUNCTION
@ WASM_COMDAT_FUNCTION
Definition: Wasm.h:363
llvm::wasm::WasmInitExpr::Global
uint32_t Global
Definition: Wasm.h:101
llvm::wasm::WasmSignature::Tombstone
@ Tombstone
Definition: Wasm.h:425
llvm::wasm::WASM_TYPE_F32
@ WASM_TYPE_F32
Definition: Wasm.h:255
llvm::wasm::WasmSymbolInfo::ExportName
Optional< StringRef > ExportName
Definition: Wasm.h:205
llvm::wasm::ValType::F64
@ F64
llvm::wasm::WasmGlobalType::Mutable
bool Mutable
Definition: Wasm.h:107
llvm::wasm::WasmLimits
Definition: Wasm.h:77
llvm::wasm::WasmRelocation::Addend
int64_t Addend
Definition: Wasm.h:188
llvm::wasm::WasmInitExpr::Float64
uint64_t Float64
Definition: Wasm.h:100
llvm::wasm::WASM_SYMBOL_VISIBILITY_MASK
const unsigned WASM_SYMBOL_VISIBILITY_MASK
Definition: Wasm.h:389
llvm::wasm::WasmTableType::ElemType
uint8_t ElemType
Definition: Wasm.h:84
llvm::wasm::WASM_SYMBOL_VISIBILITY_HIDDEN
const unsigned WASM_SYMBOL_VISIBILITY_HIDDEN
Definition: Wasm.h:395
llvm::wasm::WASM_SEC_IMPORT
@ WASM_SEC_IMPORT
Definition: Wasm.h:237
llvm::wasm::WASM_OPCODE_I64_CONST
@ WASM_OPCODE_I64_CONST
Definition: Wasm.h:284
llvm::wasm::WasmFeatureEntry::Prefix
uint8_t Prefix
Definition: Wasm.h:67
llvm::wasm::WASM_TYPE_V128
@ WASM_TYPE_V128
Definition: Wasm.h:257
llvm::wasm::WASM_SYMBOL_TLS
const unsigned WASM_SYMBOL_TLS
Definition: Wasm.h:400
llvm::wasm::WasmInitExpr::Int64
int64_t Int64
Definition: Wasm.h:98
llvm::wasm::ValType::F32
@ F32
llvm::wasm::WASM_OPCODE_BR_TABLE
@ WASM_OPCODE_BR_TABLE
Definition: Wasm.h:296
llvm::wasm::WasmGlobalType
Definition: Wasm.h:105
llvm::wasm::WASM_DYLINK_NEEDED
@ WASM_DYLINK_NEEDED
Definition: Wasm.h:355
llvm::wasm::WASM_NAMES_DATA_SEGMENT
@ WASM_NAMES_DATA_SEGMENT
Definition: Wasm.h:341
llvm::wasm::WasmFunction::CodeSectionOffset
uint32_t CodeSectionOffset
Definition: Wasm.h:145
llvm::wasm::WasmSignature::WasmSignature
WasmSignature()=default
llvm::wasm::WasmProducerInfo::Languages
std::vector< std::pair< std::string, std::string > > Languages
Definition: Wasm.h:61
llvm::wasm::WASM_OPCODE_LOCAL_SET
@ WASM_OPCODE_LOCAL_SET
Definition: Wasm.h:278
llvm::wasm::WasmGlobal::SymbolName
StringRef SymbolName
Definition: Wasm.h:114
llvm::wasm::WASM_OPCODE_ATOMIC_NOTIFY
@ WASM_OPCODE_ATOMIC_NOTIFY
Definition: Wasm.h:304
llvm::wasm::WasmTable::SymbolName
StringRef SymbolName
Definition: Wasm.h:91
llvm::wasm::WASM_DYLINK_EXPORT_INFO
@ WASM_DYLINK_EXPORT_INFO
Definition: Wasm.h:356
llvm::wasm::WasmDylinkInfo::MemoryAlignment
uint32_t MemoryAlignment
Definition: Wasm.h:52
llvm::wasm::WasmDataReference::Size
uint64_t Size
Definition: Wasm.h:181
llvm::wasm::WasmInitFunc::Symbol
uint32_t Symbol
Definition: Wasm.h:193
llvm::wasm::WasmTagAttribute
WasmTagAttribute
Definition: Wasm.h:384
llvm::wasm::WASM_NAMES_GLOBAL
@ WASM_NAMES_GLOBAL
Definition: Wasm.h:340
llvm::wasm::WASM_SYMBOL_TYPE_FUNCTION
@ WASM_SYMBOL_TYPE_FUNCTION
Definition: Wasm.h:370
llvm::wasm::WasmMetadataVersion
const uint32_t WasmMetadataVersion
Definition: Wasm.h:30
llvm::wasm::NameType::FUNCTION
@ FUNCTION
llvm::wasm::ValType
ValType
Definition: Wasm.h:411
NameType
Definition: ItaniumDemangle.h:505
llvm::wasm::WasmLocalDecl::Type
uint8_t Type
Definition: Wasm.h:136
llvm::wasm::WasmTable::Index
uint32_t Index
Definition: Wasm.h:89
llvm::wasm::WasmTable::Type
WasmTableType Type
Definition: Wasm.h:90
llvm::wasm::WASM_OPCODE_CALL
@ WASM_OPCODE_CALL
Definition: Wasm.h:276
llvm::wasm::WasmSymbolInfo::Name
StringRef Name
Definition: Wasm.h:197
llvm::wasm::WasmImport::Field
StringRef Field
Definition: Wasm.h:125
llvm::wasm::WasmSymbolInfo::ElementIndex
uint32_t ElementIndex
Definition: Wasm.h:209
llvm::wasm::WASM_OPCODE_END
@ WASM_OPCODE_END
Definition: Wasm.h:275
llvm::wasm::WasmInitExpr::Float32
uint32_t Float32
Definition: Wasm.h:99
llvm::wasm::WasmObjectHeader::Magic
StringRef Magic
Definition: Wasm.h:35
llvm::wasm::WASM_OPCODE_I32_STORE
@ WASM_OPCODE_I32_STORE
Definition: Wasm.h:281
llvm::wasm::WASM_SEG_FLAG_TLS
@ WASM_SEG_FLAG_TLS
Definition: Wasm.h:380
llvm::wasm::WasmSymbolInfo::ImportModule
Optional< StringRef > ImportModule
Definition: Wasm.h:201
llvm::wasm::NameType::GLOBAL
@ GLOBAL
llvm::wasm::WasmDylinkInfo
Definition: Wasm.h:50
llvm::wasm::WASM_SEC_CODE
@ WASM_SEC_CODE
Definition: Wasm.h:245
llvm::wasm::operator!=
bool operator!=(const WasmSignature &LHS, const WasmSignature &RHS)
Definition: Wasm.h:439
llvm::wasm::WasmLinkingData::Comdats
std::vector< StringRef > Comdats
Definition: Wasm.h:230
llvm::wasm::WasmLimits::Flags
uint8_t Flags
Definition: Wasm.h:78
llvm::wasm::WASM_TAG_ATTRIBUTE_EXCEPTION
@ WASM_TAG_ATTRIBUTE_EXCEPTION
Definition: Wasm.h:385
llvm::wasm::WasmRelocation::Type
uint8_t Type
Definition: Wasm.h:185
llvm::wasm::WASM_SYMBOL_VISIBILITY_DEFAULT
const unsigned WASM_SYMBOL_VISIBILITY_DEFAULT
Definition: Wasm.h:394
llvm::wasm::WasmDataSegment::LinkingFlags
uint32_t LinkingFlags
Definition: Wasm.h:164
llvm::wasm::WASM_OPCODE_GLOBAL_GET
@ WASM_OPCODE_GLOBAL_GET
Definition: Wasm.h:279
llvm::wasm::WasmFunction::Size
uint32_t Size
Definition: Wasm.h:146
llvm::wasm::WASM_DYLINK_IMPORT_INFO
@ WASM_DYLINK_IMPORT_INFO
Definition: Wasm.h:357
llvm::wasm::WASM_FEATURE_PREFIX_REQUIRED
@ WASM_FEATURE_PREFIX_REQUIRED
Definition: Wasm.h:332
llvm::wasm::WASM_ELEM_SEGMENT_IS_PASSIVE
@ WASM_ELEM_SEGMENT_IS_PASSIVE
Definition: Wasm.h:323
type
AMD64 Optimization Manual has some nice information about optimizing integer multiplication by a constant How much of it applies to Intel s X86 implementation There are definite trade offs to xmm0 cvttss2siq rdx jb L3 subss xmm0 rax cvttss2siq rdx xorq rdx rax ret instead of xmm1 cvttss2siq rcx movaps xmm2 subss xmm2 cvttss2siq rax rdx xorq rax ucomiss xmm0 cmovb rax ret Seems like the jb branch has high likelihood of being taken It would have saved a few instructions It s not possible to reference and DH registers in an instruction requiring REX prefix divb and mulb both produce results in AH If isel emits a CopyFromReg which gets turned into a movb and that can be allocated a r8b r15b To get around isel emits a CopyFromReg from AX and then right shift it down by and truncate it It s not pretty but it works We need some register allocation magic to make the hack go which would often require a callee saved register Callees usually need to keep this value live for most of their body so it doesn t add a significant burden on them We currently implement this in however this is suboptimal because it means that it would be quite awkward to implement the optimization for callers A better implementation would be to relax the LLVM IR rules for sret arguments to allow a function with an sret argument to have a non void return type
Definition: README-X86-64.txt:70
uint64_t
llvm::wasm::WasmSignature::Empty
@ Empty
Definition: Wasm.h:425
llvm::wasm::WasmElemSegment::Functions
std::vector< uint32_t > Functions
Definition: Wasm.h:173
llvm::wasm::WASM_OPCODE_DATA_DROP
@ WASM_OPCODE_DATA_DROP
Definition: Wasm.h:302
llvm::wasm::ValType::EXTERNREF
@ EXTERNREF
llvm::wasm::WasmExport::Name
StringRef Name
Definition: Wasm.h:72
llvm::wasm::WASM_SYMBOL_EXPLICIT_NAME
const unsigned WASM_SYMBOL_EXPLICIT_NAME
Definition: Wasm.h:398
llvm::wasm::WasmSignature::Plain
@ Plain
Definition: Wasm.h:425
llvm::wasm::ValType::I64
@ I64
llvm::wasm::WasmLocalDecl
Definition: Wasm.h:135
llvm::wasm::ValType::FUNCREF
@ FUNCREF
llvm::wasm::WasmProducerInfo::Tools
std::vector< std::pair< std::string, std::string > > Tools
Definition: Wasm.h:62
llvm::wasm::WasmDylinkImportInfo::Field
StringRef Field
Definition: Wasm.h:41
llvm::wasm::WasmGlobal::InitExpr
WasmInitExpr InitExpr
Definition: Wasm.h:113
llvm::wasm::WasmGlobal::Index
uint32_t Index
Definition: Wasm.h:111
llvm::wasm::WasmSignature::State
enum llvm::wasm::WasmSignature::@171 State
llvm::wasm::WasmDebugName::Type
NameType Type
Definition: Wasm.h:222
llvm::wasm::WasmSignature::Returns
SmallVector< ValType, 1 > Returns
Definition: Wasm.h:422
llvm::wasm::WasmDylinkInfo::TableSize
uint32_t TableSize
Definition: Wasm.h:53
llvm::wasm::WASM_EXTERNAL_TABLE
@ WASM_EXTERNAL_TABLE
Definition: Wasm.h:267
llvm::wasm::WasmImport
Definition: Wasm.h:123
ArrayRef.h
llvm::wasm::WASM_SYMBOL_TYPE_TAG
@ WASM_SYMBOL_TYPE_TAG
Definition: Wasm.h:374
llvm::wasm::WASM_TYPE_F64
@ WASM_TYPE_F64
Definition: Wasm.h:256
llvm::wasm::relocTypetoString
std::string relocTypetoString(uint32_t type)
Definition: Wasm.cpp:29
llvm::wasm::WasmDylinkImportInfo::Module
StringRef Module
Definition: Wasm.h:40
llvm::wasm::WASM_OPCODE_I32_ATOMIC_WAIT
@ WASM_OPCODE_I32_ATOMIC_WAIT
Definition: Wasm.h:305
llvm::wasm::WasmFunction::Index
uint32_t Index
Definition: Wasm.h:141
llvm::wasm::WasmDebugName
Definition: Wasm.h:221
llvm::wasm::WASM_LIMITS_FLAG_IS_64
@ WASM_LIMITS_FLAG_IS_64
Definition: Wasm.h:314
llvm::wasm::relocTypeHasAddend
bool relocTypeHasAddend(uint32_t type)
Definition: Wasm.cpp:41
llvm::wasm::WASM_COMDAT_DATA
@ WASM_COMDAT_DATA
Definition: Wasm.h:362
llvm::wasm::WasmDylinkImportInfo::Flags
uint32_t Flags
Definition: Wasm.h:42
llvm::wasm::WASM_OPCODE_F32_CONST
@ WASM_OPCODE_F32_CONST
Definition: Wasm.h:285
llvm::wasm::WASM_SEC_CUSTOM
@ WASM_SEC_CUSTOM
Definition: Wasm.h:235
llvm::wasm::WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER
@ WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER
Definition: Wasm.h:324
llvm::wasm::WASM_DATA_SEGMENT_HAS_MEMINDEX
@ WASM_DATA_SEGMENT_HAS_MEMINDEX
Definition: Wasm.h:319
llvm::wasm::WASM_SEC_EXPORT
@ WASM_SEC_EXPORT
Definition: Wasm.h:242
llvm::wasm::WasmElemSegment::Flags
uint32_t Flags
Definition: Wasm.h:169
llvm::wasm::WasmInitExpr::Int32
int32_t Int32
Definition: Wasm.h:97
llvm::ArrayRef< uint8_t >
llvm::wasm::toString
std::string toString(WasmSymbolType type)
Definition: Wasm.cpp:11
llvm::wasm::WASM_SEC_TABLE
@ WASM_SEC_TABLE
Definition: Wasm.h:239
llvm::wasm::WASM_FEATURE_PREFIX_USED
@ WASM_FEATURE_PREFIX_USED
Definition: Wasm.h:331
llvm::wasm::WasmDylinkInfo::ExportInfo
std::vector< WasmDylinkExportInfo > ExportInfo
Definition: Wasm.h:57
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:57
llvm::wasm::WasmLimits::Maximum
uint64_t Maximum
Definition: Wasm.h:80
llvm::wasm::WasmObjectHeader
Definition: Wasm.h:34
llvm::wasm::WasmGlobal
Definition: Wasm.h:110
llvm::wasm::WASM_OPCODE_DROP
@ WASM_OPCODE_DROP
Definition: Wasm.h:298
uint32_t
llvm::wasm::WASM_SYMBOL_BINDING_MASK
const unsigned WASM_SYMBOL_BINDING_MASK
Definition: Wasm.h:388
llvm::wasm::WasmSymbolType
WasmSymbolType
Definition: Wasm.h:369
llvm::wasm::WASM_OPCODE_I64_STORE
@ WASM_OPCODE_I64_STORE
Definition: Wasm.h:282
llvm::wasm::WasmTableType::Limits
WasmLimits Limits
Definition: Wasm.h:85
llvm::wasm::WasmSymbolInfo
Definition: Wasm.h:196
llvm::wasm::WasmDylinkExportInfo
Definition: Wasm.h:45
llvm::wasm::WasmDylinkInfo::Needed
std::vector< StringRef > Needed
Definition: Wasm.h:55
llvm::wasm::WASM_EXTERNAL_GLOBAL
@ WASM_EXTERNAL_GLOBAL
Definition: Wasm.h:269
llvm::wasm::WasmImport::Global
WasmGlobalType Global
Definition: Wasm.h:129
llvm::wasm::WasmGlobalType::Type
uint8_t Type
Definition: Wasm.h:106
llvm::wasm::WasmSymbolInfo::DataRef
WasmDataReference DataRef
Definition: Wasm.h:211
llvm::wasm::WasmDylinkImportInfo
Definition: Wasm.h:39
llvm::wasm::operator==
bool operator==(const WasmSignature &LHS, const WasmSignature &RHS)
Definition: Wasm.h:434
llvm::wasm::WasmProducerInfo::SDKs
std::vector< std::pair< std::string, std::string > > SDKs
Definition: Wasm.h:63
llvm::wasm::WASM_TYPE_EXTERNREF
@ WASM_TYPE_EXTERNREF
Definition: Wasm.h:259
llvm::wasm::WasmDataReference::Segment
uint32_t Segment
Definition: Wasm.h:179
llvm::wasm::WASM_OPCODE_REF_NULL
@ WASM_OPCODE_REF_NULL
Definition: Wasm.h:289
llvm::wasm::WasmDataSegment::MemoryIndex
uint32_t MemoryIndex
Definition: Wasm.h:157
llvm::wasm::WASM_OPCODE_MISC_PREFIX
@ WASM_OPCODE_MISC_PREFIX
Definition: Wasm.h:299
llvm::wasm::WASM_EXTERNAL_FUNCTION
@ WASM_EXTERNAL_FUNCTION
Definition: Wasm.h:266
llvm::wasm::WASM_OPCODE_BLOCK
@ WASM_OPCODE_BLOCK
Definition: Wasm.h:294
llvm::wasm::WasmMagic
const char WasmMagic[]
Definition: Wasm.h:26
llvm::wasm::WASM_TYPE_FUNC
@ WASM_TYPE_FUNC
Definition: Wasm.h:260
llvm::wasm::WasmLinkingData::InitFunctions
std::vector< WasmInitFunc > InitFunctions
Definition: Wasm.h:229
llvm::wasm::WASM_SYMBOL_BINDING_GLOBAL
const unsigned WASM_SYMBOL_BINDING_GLOBAL
Definition: Wasm.h:391
llvm::wasm::WASM_SEC_DATA
@ WASM_SEC_DATA
Definition: Wasm.h:246
llvm::wasm::WASM_OPCODE_BR
@ WASM_OPCODE_BR
Definition: Wasm.h:295
llvm::wasm::WASM_DATA_SEGMENT_IS_PASSIVE
@ WASM_DATA_SEGMENT_IS_PASSIVE
Definition: Wasm.h:318
llvm::wasm::WASM_SEGMENT_INFO
@ WASM_SEGMENT_INFO
Definition: Wasm.h:346
llvm::wasm::WasmDylinkInfo::MemorySize
uint32_t MemorySize
Definition: Wasm.h:51
llvm::wasm::WasmInitFunc
Definition: Wasm.h:191
llvm::wasm::WasmSymbolInfo::Flags
uint32_t Flags
Definition: Wasm.h:199
llvm::wasm::WASM_LIMITS_FLAG_HAS_MAX
@ WASM_LIMITS_FLAG_HAS_MAX
Definition: Wasm.h:312
llvm::wasm::WasmLocalDecl::Count
uint32_t Count
Definition: Wasm.h:137
llvm::wasm::WasmSymbolInfo::ImportName
Optional< StringRef > ImportName
Definition: Wasm.h:203
llvm::wasm::WasmDataSegment
Definition: Wasm.h:154
llvm::wasm::WasmInitExpr
Definition: Wasm.h:94
llvm::wasm::WasmFunction::ExportName
Optional< StringRef > ExportName
Definition: Wasm.h:148
llvm::wasm::WasmLinkingData::Version
uint32_t Version
Definition: Wasm.h:228
llvm::wasm::WASM_ELEM_SEGMENT_HAS_INIT_EXPRS
@ WASM_ELEM_SEGMENT_HAS_INIT_EXPRS
Definition: Wasm.h:325
llvm::wasm::WasmTable
Definition: Wasm.h:88
llvm::wasm::WASM_OPCODE_I32_RMW_CMPXCHG
@ WASM_OPCODE_I32_RMW_CMPXCHG
Definition: Wasm.h:307
llvm::wasm::NameType::DATA_SEGMENT
@ DATA_SEGMENT
llvm::wasm::WasmDylinkExportInfo::Name
StringRef Name
Definition: Wasm.h:46
llvm::wasm::ValType::V128
@ V128
llvm::wasm::WASM_OPCODE_RETURN
@ WASM_OPCODE_RETURN
Definition: Wasm.h:297
llvm::wasm::WasmRelocation::Index
uint32_t Index
Definition: Wasm.h:186
llvm::wasm::WasmImport::Module
StringRef Module
Definition: Wasm.h:124
SmallVector.h
llvm::wasm::WasmElemSegment
Definition: Wasm.h:168
llvm::wasm::WasmFeatureEntry::Name
std::string Name
Definition: Wasm.h:68
llvm::wasm::WASM_LIMITS_FLAG_NONE
@ WASM_LIMITS_FLAG_NONE
Definition: Wasm.h:311
llvm::wasm::WasmInitExpr::Opcode
uint8_t Opcode
Definition: Wasm.h:95
llvm::wasm::WasmLinkingData
Definition: Wasm.h:227
llvm::wasm::WasmTag::SymbolName
StringRef SymbolName
Definition: Wasm.h:120
llvm::wasm::WasmImport::Kind
uint8_t Kind
Definition: Wasm.h:126
llvm::wasm::WASM_INIT_FUNCS
@ WASM_INIT_FUNCS
Definition: Wasm.h:347
llvm::wasm::WASM_SEC_TYPE
@ WASM_SEC_TYPE
Definition: Wasm.h:236
llvm::wasm::WASM_OPCODE_I32_ADD
@ WASM_OPCODE_I32_ADD
Definition: Wasm.h:287
llvm::wasm::WasmTableType
Definition: Wasm.h:83
llvm::wasm::WASM_SEC_DATACOUNT
@ WASM_SEC_DATACOUNT
Definition: Wasm.h:247
llvm::wasm::WASM_NAMES_FUNCTION
@ WASM_NAMES_FUNCTION
Definition: Wasm.h:338
llvm::wasm::WasmDylinkInfo::TableAlignment
uint32_t TableAlignment
Definition: Wasm.h:54
llvm::wasm::WASM_TYPE_NORESULT
@ WASM_TYPE_NORESULT
Definition: Wasm.h:261
llvm::wasm::WASM_SEG_FLAG_STRINGS
@ WASM_SEG_FLAG_STRINGS
Definition: Wasm.h:379
llvm::wasm::WasmSignature::Params
SmallVector< ValType, 4 > Params
Definition: Wasm.h:423
llvm::wasm::WasmExport
Definition: Wasm.h:71
llvm::wasm::WASM_SYMBOL_TYPE_DATA
@ WASM_SYMBOL_TYPE_DATA
Definition: Wasm.h:371
llvm::wasm::WasmSignature
Definition: Wasm.h:421
llvm::wasm::WasmDataSegment::Alignment
uint32_t Alignment
Definition: Wasm.h:163
llvm::wasm::WASM_COMDAT_SECTION
@ WASM_COMDAT_SECTION
Definition: Wasm.h:365
llvm::wasm::WasmTag::Index
uint32_t Index
Definition: Wasm.h:118
llvm::wasm::WASM_TYPE_I64
@ WASM_TYPE_I64
Definition: Wasm.h:254
llvm::wasm::WasmDataSegment::Name
StringRef Name
Definition: Wasm.h:162
llvm::wasm::WasmTag::SigIndex
uint32_t SigIndex
Definition: Wasm.h:119
llvm::wasm::WASM_OPCODE_I64_ADD
@ WASM_OPCODE_I64_ADD
Definition: Wasm.h:288
llvm::wasm::WasmPageSize
const uint32_t WasmPageSize
Definition: Wasm.h:32