34 explicit WebAssemblyWasmObjectWriter(
bool Is64Bit,
bool IsEmscripten);
39 bool IsLocRel)
const override;
43 WebAssemblyWasmObjectWriter::WebAssemblyWasmObjectWriter(
bool Is64Bit,
48 if (
auto SyExp = dyn_cast<MCSymbolRefExpr>(Expr)) {
49 if (SyExp->getSymbol().isInSection())
50 return &SyExp->getSymbol().getSection();
54 if (
auto BinOp = dyn_cast<MCBinaryExpr>(Expr)) {
57 return SectionLHS == SectionRHS ? nullptr : SectionLHS;
60 if (
auto UnOp = dyn_cast<MCUnaryExpr>(Expr))
66 unsigned WebAssemblyWasmObjectWriter::getRelocType(
71 auto& SymA = cast<MCSymbolWasm>(RefA->
getSymbol());
78 return wasm::R_WASM_GLOBAL_INDEX_LEB;
81 return is64Bit() ? wasm::R_WASM_TABLE_INDEX_REL_SLEB64
82 : wasm::R_WASM_TABLE_INDEX_REL_SLEB;
84 return is64Bit() ? wasm::R_WASM_MEMORY_ADDR_TLS_SLEB64
85 : wasm::R_WASM_MEMORY_ADDR_TLS_SLEB;
88 return is64Bit() ? wasm::R_WASM_MEMORY_ADDR_REL_SLEB64
89 : wasm::R_WASM_MEMORY_ADDR_REL_SLEB;
91 return wasm::R_WASM_TYPE_INDEX_LEB;
99 switch (
unsigned(
Fixup.getKind())) {
101 if (SymA.isFunction())
102 return wasm::R_WASM_TABLE_INDEX_SLEB;
103 return wasm::R_WASM_MEMORY_ADDR_SLEB;
105 if (SymA.isFunction())
106 return wasm::R_WASM_TABLE_INDEX_SLEB64;
107 return wasm::R_WASM_MEMORY_ADDR_SLEB64;
110 return wasm::R_WASM_GLOBAL_INDEX_LEB;
111 if (SymA.isFunction())
112 return wasm::R_WASM_FUNCTION_INDEX_LEB;
114 return wasm::R_WASM_TAG_INDEX_LEB;
116 return wasm::R_WASM_TABLE_NUMBER_LEB;
117 return wasm::R_WASM_MEMORY_ADDR_LEB;
120 return wasm::R_WASM_MEMORY_ADDR_LEB64;
122 if (SymA.isFunction()) {
124 return wasm::R_WASM_FUNCTION_OFFSET_I32;
126 return wasm::R_WASM_TABLE_INDEX_I32;
129 return wasm::R_WASM_GLOBAL_INDEX_I32;
132 if (
Section->getKind().isText())
133 return wasm::R_WASM_FUNCTION_OFFSET_I32;
134 else if (!
Section->isWasmData())
135 return wasm::R_WASM_SECTION_OFFSET_I32;
137 return IsLocRel ? wasm::R_WASM_MEMORY_ADDR_LOCREL_I32
138 : wasm::R_WASM_MEMORY_ADDR_I32;
140 if (SymA.isFunction()) {
142 return wasm::R_WASM_FUNCTION_OFFSET_I64;
143 return wasm::R_WASM_TABLE_INDEX_I64;
149 if (
Section->getKind().isText())
150 return wasm::R_WASM_FUNCTION_OFFSET_I64;
151 else if (!
Section->isWasmData())
155 return wasm::R_WASM_MEMORY_ADDR_I64;
161 std::unique_ptr<MCObjectTargetWriter>
163 return std::make_unique<WebAssemblyWasmObjectWriter>(Is64Bit, IsEmscripten);