MCSymbol *WebAssemblyMCInstLower::GetExternalSymbolSymbol( const MachineOperand &MO) const { const char *Name = MO.getSymbolName(); MCSymbolWasm *WasmSym = cast<MCSymbolWasm>(Printer.GetExternalSymbolSymbol(Name)); const WebAssemblySubtarget &Subtarget = Printer.getSubtarget(); // Except for the two exceptions (__stack_pointer and __cpp_exception), all // other external symbols used by CodeGen are functions. It's OK to hardcode // knowledge of specific symbols here; this method is precisely there for // fetching the signatures of known Clang-provided symbols. if (strcmp(Name, "__stack_pointer") == 0) { WasmSym->setType(wasm::WASM_SYMBOL_TYPE_GLOBAL); WasmSym->setGlobalType(wasm::WasmGlobalType{ uint8_t(Subtarget.hasAddr64() ? wasm::WASM_TYPE_I64 : wasm::WASM_TYPE_I32), true}); return WasmSym; } SmallVector<wasm::ValType, 4> Returns; SmallVector<wasm::ValType, 4> Params; if (strcmp(Name, "__cpp_exception") == 0) { WasmSym->setType(wasm::WASM_SYMBOL_TYPE_EVENT); // We can't confirm its signature index for now because there can be // imported exceptions. Set it to be 0 for now. WasmSym->setEventType( {wasm::WASM_EVENT_ATTRIBUTE_EXCEPTION, /* SigIndex */ 0}); // We may have multiple C++ compilation units to be linked together, each of // which defines the exception symbol. To resolve them, we declare them as // weak. WasmSym->setWeak(true); WasmSym->setExternal(true); // All C++ exceptions are assumed to have a single i32 (for wasm32) or i64 // (for wasm64) param type and void return type. The reaon is, all C++ // exception values are pointers, and to share the type section with // functions, exceptions are assumed to have void return type. Params.push_back(Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32); } else { // Function symbols WasmSym->setType(wasm::WASM_SYMBOL_TYPE_FUNCTION); GetLibcallSignature(Subtarget, Name, Returns, Params); } auto Signature = make_unique<wasm::WasmSignature>(std::move(Returns), std::move(Params)); WasmSym->setSignature(Signature.get()); Printer.addSignature(std::move(Signature)); return WasmSym; }