LLVM: lib/Target/WebAssembly/WebAssemblyUtilities.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

20using namespace llvm;

21

22

27 "_Unwind_Wasm_CallPersonality";

28

29

32 if (MI.getNumOperands() == 0)

33 return false;

36 return false;

39}

40

42 switch (MI.getOpcode()) {

43 case WebAssembly::THROW:

44 case WebAssembly::THROW_S:

45 case WebAssembly::THROW_REF:

46 case WebAssembly::THROW_REF_S:

47 case WebAssembly::RETHROW:

48 case WebAssembly::RETHROW_S:

49 return true;

50 }

52 return true;

53 if (MI.isCall())

54 return false;

55

58

60

61

62

63

64

66 if (strcmp(Name, "memcpy") == 0 || strcmp(Name, "memmove") == 0 ||

67 strcmp(Name, "memset") == 0)

68 return false;

69 return true;

70 }

71

72 const auto *F = dyn_cast(MO.getGlobal());

73 if (F)

74 return true;

75 if (F->doesNotThrow())

76 return false;

77

80 return false;

81

82

83

84 return true;

85}

86

88 switch (MI.getOpcode()) {

89 case WebAssembly::CALL:

90 case WebAssembly::CALL_S:

91 case WebAssembly::RET_CALL:

92 case WebAssembly::RET_CALL_S:

93 return MI.getOperand(MI.getNumExplicitDefs());

94 case WebAssembly::CALL_INDIRECT:

95 case WebAssembly::CALL_INDIRECT_S:

96 case WebAssembly::RET_CALL_INDIRECT:

97 case WebAssembly::RET_CALL_INDIRECT_S:

98 return MI.getOperand(MI.getNumExplicitOperands() - 1);

99 default:

101 }

102}

103

108 if (Sym) {

109 if (Sym->isFunctionTable())

110 Ctx.reportError(SMLoc(), "symbol is not a wasm funcref table");

111 } else {

114 Sym->setFunctionTable(is64);

115

116 Sym->setUndefined();

117 }

118

120 Sym->setOmitFromLinkingSection();

121 return Sym;

122}

123

128 if (Sym) {

129 if (Sym->isFunctionTable())

130 Ctx.reportError(SMLoc(), "symbol is not a wasm funcref table");

131 } else {

133

134

135

136 Sym->setWeak(true);

137

141 Sym->setTableType(TableType);

142 }

143

145 Sym->setOmitFromLinkingSection();

146 return Sym;

147}

148

149

152 auto Pos = EHPad->begin();

153

154

155 while (Pos != EHPad->end() &&

156 (Pos->isLabel() || Pos->isDebugInstr() || isMarker(Pos->getOpcode())))

157 Pos++;

159 return &*Pos;

160 return nullptr;

161}

162

164 assert(RC != nullptr);

165 switch (RC->getID()) {

166 case WebAssembly::I32RegClassID:

167 return WebAssembly::COPY_I32;

168 case WebAssembly::I64RegClassID:

169 return WebAssembly::COPY_I64;

170 case WebAssembly::F32RegClassID:

171 return WebAssembly::COPY_F32;

172 case WebAssembly::F64RegClassID:

173 return WebAssembly::COPY_F64;

174 case WebAssembly::V128RegClassID:

175 return WebAssembly::COPY_V128;

176 case WebAssembly::FUNCREFRegClassID:

177 return WebAssembly::COPY_FUNCREF;

178 case WebAssembly::EXTERNREFRegClassID:

179 return WebAssembly::COPY_EXTERNREF;

180 case WebAssembly::EXNREFRegClassID:

181 return WebAssembly::COPY_EXNREF;

182 default:

184 }

185}

186

191 return Subtarget->hasMultivalue() && TM.usesMultivalueABI();

192}

193

197}

assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())

This file declares WebAssembly-specific per-machine-function information.

This file declares the WebAssembly-specific subclass of TargetMachine.

This file contains the declaration of the WebAssembly-specific utility functions.

Context object for machine code objects.

MCSymbol * lookupSymbol(const Twine &Name) const

Get the symbol for Name, or null.

void reportError(SMLoc L, const Twine &Msg)

MCSymbol * getOrCreateSymbol(const Twine &Name)

Lookup the symbol inside with the specified Name.

bool isEHPad() const

Returns true if the block is a landing pad.

Representation of each machine instruction.

MachineOperand class - Representation of each machine instruction operand.

const GlobalValue * getGlobal() const

bool isReg() const

isReg - Tests if this is a MO_Register operand.

bool isSymbol() const

isSymbol - Tests if this is a MO_ExternalSymbol operand.

bool isGlobal() const

isGlobal - Tests if this is a MO_GlobalAddress operand.

const char * getSymbolName() const

Register getReg() const

getReg - Returns the register number.

Wrapper class representing virtual and physical registers.

Represents a location in source code.

StringRef - Represent a constant reference to a string, i.e.

const TargetMachine & getTargetMachine() const

unsigned getID() const

Return the register class ID number.

bool isArch64Bit() const

Test whether the architecture is 64-bit.

This class is derived from MachineFunctionInfo and contains private WebAssembly-specific information ...

bool isVRegStackified(unsigned VReg) const

bool hasCallIndirectOverlong() const

const Triple & getTargetTriple() const

const WebAssemblyTargetLowering * getTargetLowering() const override

bool hasMultivalue() const

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

const char *const StdTerminateFn

const char *const CxaBeginCatchFn

bool isChild(const MachineInstr &MI, const WebAssemblyFunctionInfo &MFI)

Test whether MI is a child of some other node in an expression tree.

bool isCallIndirect(unsigned Opc)

bool canLowerMultivalueReturn(const WebAssemblySubtarget *Subtarget)

Returns true if multivalue returns of a function can be lowered directly, i.e., not indirectly via a ...

const char *const CxaRethrowFn

MCSymbolWasm * getOrCreateFunctionTableSymbol(MCContext &Ctx, const WebAssemblySubtarget *Subtarget)

Returns the __indirect_function_table, for use in call_indirect and in function bitcasts.

bool isMarker(unsigned Opc)

unsigned getCopyOpcodeForRegClass(const TargetRegisterClass *RC)

Returns the appropriate copy opcode for the given register class.

const MachineOperand & getCalleeOp(const MachineInstr &MI)

Returns the operand number of a callee, assuming the argument is a call instruction.

MachineInstr * findCatch(MachineBasicBlock *EHPad)

Find a catch instruction from an EH pad.

bool isCatch(unsigned Opc)

MCSymbolWasm * getOrCreateFuncrefCallTableSymbol(MCContext &Ctx, const WebAssemblySubtarget *Subtarget)

Returns the __funcref_call_table, for use in funcref calls when lowered to table.set + call_indirect.

const char *const PersonalityWrapperFn

bool canLowerReturn(size_t ResultSize, const WebAssemblySubtarget *Subtarget)

Returns true if the function's return value(s) can be lowered directly, i.e., not indirectly via a po...

bool mayThrow(const MachineInstr &MI)

This is an optimization pass for GlobalISel generic memory operations.