LLVM  14.0.0git
MCSymbolWasm.h
Go to the documentation of this file.
1 //===- MCSymbolWasm.h - ----------------------------------------*- 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 #ifndef LLVM_MC_MCSYMBOLWASM_H
9 #define LLVM_MC_MCSYMBOLWASM_H
10 
11 #include "llvm/BinaryFormat/Wasm.h"
12 #include "llvm/MC/MCSymbol.h"
13 
14 namespace llvm {
15 
16 class MCSymbolWasm : public MCSymbol {
18  bool IsWeak = false;
19  bool IsHidden = false;
20  bool IsComdat = false;
21  bool OmitFromLinkingSection = false;
22  mutable bool IsUsedInInitArray = false;
23  mutable bool IsUsedInGOT = false;
24  Optional<StringRef> ImportModule;
25  Optional<StringRef> ImportName;
26  Optional<StringRef> ExportName;
27  wasm::WasmSignature *Signature = nullptr;
30 
31  /// An expression describing how to calculate the size of a symbol. If a
32  /// symbol has no size this field will be NULL.
33  const MCExpr *SymbolSize = nullptr;
34 
35 public:
38  static bool classof(const MCSymbol *S) { return S->isWasm(); }
39 
40  const MCExpr *getSize() const { return SymbolSize; }
41  void setSize(const MCExpr *SS) { SymbolSize = SS; }
42 
43  bool isFunction() const { return Type == wasm::WASM_SYMBOL_TYPE_FUNCTION; }
44  // Data is the default value if not set.
45  bool isData() const { return !Type || Type == wasm::WASM_SYMBOL_TYPE_DATA; }
46  bool isGlobal() const { return Type == wasm::WASM_SYMBOL_TYPE_GLOBAL; }
47  bool isTable() const { return Type == wasm::WASM_SYMBOL_TYPE_TABLE; }
48  bool isSection() const { return Type == wasm::WASM_SYMBOL_TYPE_SECTION; }
49  bool isTag() const { return Type == wasm::WASM_SYMBOL_TYPE_TAG; }
50 
52 
54 
55  bool isExported() const {
57  }
58  void setExported() const {
60  }
61 
62  bool isNoStrip() const {
64  }
65  void setNoStrip() const {
67  }
68 
69  bool isTLS() const { return getFlags() & wasm::WASM_SYMBOL_TLS; }
70  void setTLS() const {
72  }
73 
74  bool isWeak() const { return IsWeak; }
75  void setWeak(bool isWeak) { IsWeak = isWeak; }
76 
77  bool isHidden() const { return IsHidden; }
78  void setHidden(bool isHidden) { IsHidden = isHidden; }
79 
80  bool isComdat() const { return IsComdat; }
81  void setComdat(bool isComdat) { IsComdat = isComdat; }
82 
83  // wasm-ld understands a finite set of symbol types. This flag allows the
84  // compiler to avoid emitting symbol table entries that would confuse the
85  // linker, unless the user specifically requests the feature.
86  bool omitFromLinkingSection() const { return OmitFromLinkingSection; }
87  void setOmitFromLinkingSection() { OmitFromLinkingSection = true; }
88 
89  bool hasImportModule() const { return ImportModule.hasValue(); }
91  if (ImportModule.hasValue())
92  return ImportModule.getValue();
93  // Use a default module name of "env" for now, for compatibility with
94  // existing tools.
95  // TODO(sbc): Find a way to specify a default value in the object format
96  // without picking a hardcoded value like this.
97  return "env";
98  }
99  void setImportModule(StringRef Name) { ImportModule = Name; }
100 
101  bool hasImportName() const { return ImportName.hasValue(); }
103  if (ImportName.hasValue())
104  return ImportName.getValue();
105  return getName();
106  }
107  void setImportName(StringRef Name) { ImportName = Name; }
108 
109  bool hasExportName() const { return ExportName.hasValue(); }
110  StringRef getExportName() const { return ExportName.getValue(); }
111  void setExportName(StringRef Name) { ExportName = Name; }
112 
113  bool isFunctionTable() const {
114  return isTable() && hasTableType() &&
116  }
120  }
121 
122  void setUsedInGOT() const { IsUsedInGOT = true; }
123  bool isUsedInGOT() const { return IsUsedInGOT; }
124 
125  void setUsedInInitArray() const { IsUsedInInitArray = true; }
126  bool isUsedInInitArray() const { return IsUsedInInitArray; }
127 
128  const wasm::WasmSignature *getSignature() const { return Signature; }
129  void setSignature(wasm::WasmSignature *Sig) { Signature = Sig; }
130 
132  assert(GlobalType.hasValue());
133  return GlobalType.getValue();
134  }
135  void setGlobalType(wasm::WasmGlobalType GT) { GlobalType = GT; }
136 
137  bool hasTableType() const { return TableType.hasValue(); }
139  assert(hasTableType());
140  return TableType.getValue();
141  }
142  void setTableType(wasm::WasmTableType TT) { TableType = TT; }
144  // Declare a table with element type VT and no limits (min size 0, no max
145  // size).
147  setTableType({uint8_t(VT), Limits});
148  }
149 };
150 
151 } // end namespace llvm
152 
153 #endif // LLVM_MC_MCSYMBOLWASM_H
llvm::wasm::WASM_SYMBOL_TYPE_SECTION
@ WASM_SYMBOL_TYPE_SECTION
Definition: Wasm.h:372
llvm::wasm::WASM_SYMBOL_EXPORTED
const unsigned WASM_SYMBOL_EXPORTED
Definition: Wasm.h:396
llvm::MCSymbolWasm::isSection
bool isSection() const
Definition: MCSymbolWasm.h:48
llvm
This file implements support for optimizing divisions by a constant.
Definition: AllocatorList.h:23
llvm::MCSymbolWasm::isComdat
bool isComdat() const
Definition: MCSymbolWasm.h:80
llvm::MCSymbol
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
llvm::StringMapEntry
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
Definition: StringMapEntry.h:98
llvm::MCSymbolWasm::isNoStrip
bool isNoStrip() const
Definition: MCSymbolWasm.h:62
llvm::MCSymbolWasm::getType
Optional< wasm::WasmSymbolType > getType() const
Definition: MCSymbolWasm.h:51
llvm::MCSymbol::isTemporary
bool isTemporary() const
isTemporary - Check if this is an assembler temporary symbol.
Definition: MCSymbol.h:215
llvm::MCSymbolWasm::setOmitFromLinkingSection
void setOmitFromLinkingSection()
Definition: MCSymbolWasm.h:87
llvm::wasm::WASM_SYMBOL_NO_STRIP
const unsigned WASM_SYMBOL_NO_STRIP
Definition: Wasm.h:398
llvm::MCSymbolWasm::isHidden
bool isHidden() const
Definition: MCSymbolWasm.h:77
llvm::MCSymbolWasm::getTableType
const wasm::WasmTableType & getTableType() const
Definition: MCSymbolWasm.h:138
llvm::wasm::WASM_SYMBOL_TYPE_TABLE
@ WASM_SYMBOL_TYPE_TABLE
Definition: Wasm.h:374
llvm::wasm::WASM_SYMBOL_TYPE_GLOBAL
@ WASM_SYMBOL_TYPE_GLOBAL
Definition: Wasm.h:371
llvm::MCSymbolWasm::isGlobal
bool isGlobal() const
Definition: MCSymbolWasm.h:46
llvm::Type
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
llvm::MCSymbolWasm::setSize
void setSize(const MCExpr *SS)
Definition: MCSymbolWasm.h:41
llvm::Optional< wasm::WasmSymbolType >
llvm::MCSymbolWasm::setHidden
void setHidden(bool isHidden)
Definition: MCSymbolWasm.h:78
llvm::MCSymbolWasm::setSignature
void setSignature(wasm::WasmSignature *Sig)
Definition: MCSymbolWasm.h:129
llvm::MCSymbolWasm::hasTableType
bool hasTableType() const
Definition: MCSymbolWasm.h:137
llvm::Optional::hasValue
constexpr bool hasValue() const
Definition: Optional.h:288
llvm::wasm::WasmLimits
Definition: Wasm.h:77
llvm::MCSymbolWasm::setImportName
void setImportName(StringRef Name)
Definition: MCSymbolWasm.h:107
llvm::wasm::WasmTableType::ElemType
uint8_t ElemType
Definition: Wasm.h:84
llvm::MCSymbolWasm::isUsedInGOT
bool isUsedInGOT() const
Definition: MCSymbolWasm.h:123
MCSymbol.h
llvm::MCSymbolWasm::getExportName
StringRef getExportName() const
Definition: MCSymbolWasm.h:110
llvm::wasm::WASM_SYMBOL_TLS
const unsigned WASM_SYMBOL_TLS
Definition: Wasm.h:399
llvm::MCSymbolWasm::setComdat
void setComdat(bool isComdat)
Definition: MCSymbolWasm.h:81
llvm::wasm::WasmGlobalType
Definition: Wasm.h:105
llvm::MCSymbolWasm::setType
void setType(wasm::WasmSymbolType type)
Definition: MCSymbolWasm.h:53
llvm::MCSymbolWasm::isExported
bool isExported() const
Definition: MCSymbolWasm.h:55
llvm::MCSymbolWasm::getImportName
StringRef getImportName() const
Definition: MCSymbolWasm.h:102
llvm::MCSymbolWasm::isTLS
bool isTLS() const
Definition: MCSymbolWasm.h:69
llvm::wasm::WASM_SYMBOL_TYPE_FUNCTION
@ WASM_SYMBOL_TYPE_FUNCTION
Definition: Wasm.h:369
llvm::MCSymbolWasm::classof
static bool classof(const MCSymbol *S)
Definition: MCSymbolWasm.h:38
llvm::wasm::ValType
ValType
Definition: Wasm.h:410
llvm::MCSymbolWasm::isData
bool isData() const
Definition: MCSymbolWasm.h:45
llvm::MCSymbol::getName
StringRef getName() const
getName - Get the symbol name.
Definition: MCSymbol.h:198
llvm::MCSymbolWasm::getGlobalType
const wasm::WasmGlobalType & getGlobalType() const
Definition: MCSymbolWasm.h:131
llvm::MCSymbolWasm::setImportModule
void setImportModule(StringRef Name)
Definition: MCSymbolWasm.h:99
llvm::MCSymbolWasm::getImportModule
StringRef getImportModule() const
Definition: MCSymbolWasm.h:90
llvm::MCSymbolWasm::MCSymbolWasm
MCSymbolWasm(const StringMapEntry< bool > *Name, bool isTemporary)
Definition: MCSymbolWasm.h:36
llvm::MCSymbolWasm::hasImportModule
bool hasImportModule() const
Definition: MCSymbolWasm.h:89
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
llvm::MCSymbolWasm::setTableType
void setTableType(wasm::WasmTableType TT)
Definition: MCSymbolWasm.h:142
llvm::MCSymbol::SymbolKindWasm
@ SymbolKindWasm
Definition: MCSymbol.h:51
llvm::MCSymbolWasm
Definition: MCSymbolWasm.h:16
llvm::wasm::ValType::FUNCREF
@ FUNCREF
llvm::MCSymbol::modifyFlags
void modifyFlags(uint32_t Value, uint32_t Mask) const
Modify the flags via a mask.
Definition: MCSymbol.h:424
llvm::MCSymbolWasm::setWeak
void setWeak(bool isWeak)
Definition: MCSymbolWasm.h:75
llvm::MCSymbolWasm::isUsedInInitArray
bool isUsedInInitArray() const
Definition: MCSymbolWasm.h:126
llvm::MCSymbol::getFlags
uint32_t getFlags() const
Get the (implementation defined) symbol flags.
Definition: MCSymbol.h:415
llvm::wasm::WASM_SYMBOL_TYPE_TAG
@ WASM_SYMBOL_TYPE_TAG
Definition: Wasm.h:373
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::MCSymbolWasm::isTag
bool isTag() const
Definition: MCSymbolWasm.h:49
llvm::MCSymbolWasm::omitFromLinkingSection
bool omitFromLinkingSection() const
Definition: MCSymbolWasm.h:86
llvm::MCSymbolWasm::isWeak
bool isWeak() const
Definition: MCSymbolWasm.h:74
llvm::MCSymbolWasm::hasExportName
bool hasExportName() const
Definition: MCSymbolWasm.h:109
llvm::MCSymbolWasm::setNoStrip
void setNoStrip() const
Definition: MCSymbolWasm.h:65
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:58
llvm::MCSymbolWasm::setUsedInGOT
void setUsedInGOT() const
Definition: MCSymbolWasm.h:122
llvm::wasm::WASM_LIMITS_FLAG_NONE
@ WASM_LIMITS_FLAG_NONE
Definition: Wasm.h:310
llvm::wasm::WasmSymbolType
WasmSymbolType
Definition: Wasm.h:368
S
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
Definition: README.txt:210
llvm::MCSymbolWasm::setExported
void setExported() const
Definition: MCSymbolWasm.h:58
llvm::MCSymbolWasm::getSize
const MCExpr * getSize() const
Definition: MCSymbolWasm.h:40
llvm::MCSymbolWasm::setUsedInInitArray
void setUsedInInitArray() const
Definition: MCSymbolWasm.h:125
llvm::GraphProgram::Name
Name
Definition: GraphWriter.h:52
llvm::MCSymbolWasm::isFunctionTable
bool isFunctionTable() const
Definition: MCSymbolWasm.h:113
llvm::MCSymbolWasm::getSignature
const wasm::WasmSignature * getSignature() const
Definition: MCSymbolWasm.h:128
llvm::MCSymbolWasm::hasImportName
bool hasImportName() const
Definition: MCSymbolWasm.h:101
llvm::MCSymbolWasm::setFunctionTable
void setFunctionTable()
Definition: MCSymbolWasm.h:117
Wasm.h
llvm::AArch64CC::GT
@ GT
Definition: AArch64BaseInfo.h:267
llvm::X86AS::SS
@ SS
Definition: X86.h:189
llvm::MCSymbolWasm::isFunction
bool isFunction() const
Definition: MCSymbolWasm.h:43
llvm::MCSymbolWasm::setExportName
void setExportName(StringRef Name)
Definition: MCSymbolWasm.h:111
llvm::MCSymbolWasm::setGlobalType
void setGlobalType(wasm::WasmGlobalType GT)
Definition: MCSymbolWasm.h:135
llvm::MCSymbolWasm::isTable
bool isTable() const
Definition: MCSymbolWasm.h:47
llvm::wasm::WASM_TYPE_FUNCREF
@ WASM_TYPE_FUNCREF
Definition: Wasm.h:258
llvm::MCSymbolWasm::setTableType
void setTableType(wasm::ValType VT)
Definition: MCSymbolWasm.h:143
llvm::wasm::WasmTableType
Definition: Wasm.h:83
llvm::MCExpr
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
llvm::wasm::WASM_SYMBOL_TYPE_DATA
@ WASM_SYMBOL_TYPE_DATA
Definition: Wasm.h:370
llvm::wasm::WasmSignature
Definition: Wasm.h:420
llvm::Optional::getValue
constexpr const T & getValue() const LLVM_LVALUE_FUNCTION
Definition: Optional.h:282
llvm::MCSymbolWasm::setTLS
void setTLS() const
Definition: MCSymbolWasm.h:70