From a9bae4dae94c5e7823e1f3a7488e264b7a13f6c7 Mon Sep 17 00:00:00 2001 From: Quentin MICHAUD Date: Fri, 12 Dec 2025 15:08:55 +0100 Subject: [PATCH] Updated patch for new Wasm SSP --- .../WebAssembly/WebAssemblyAsmPrinter.cpp | 6 ++++-- .../WebAssembly/WebAssemblyISelLowering.cpp | 4 ++++ .../WebAssembly/WebAssemblyISelLowering.h | 2 ++ .../WebAssembly/WebAssemblyInstrInfo.cpp | 21 ++++++++++++++++++- .../Target/WebAssembly/WebAssemblyInstrInfo.h | 3 +++ 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 526420bb2b294..19c11244bb6b1 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -229,9 +229,11 @@ MCSymbol *WebAssemblyAsmPrinter::getOrCreateWasmSymbol(StringRef Name) { // Clang-provided symbols. if (Name == "__stack_pointer" || Name == "__tls_base" || Name == "__memory_base" || Name == "__table_base" || - Name == "__tls_size" || Name == "__tls_align") { + Name == "__tls_size" || Name == "__tls_align" || + Name == "__stack_chk_guard") { bool Mutable = - Name == "__stack_pointer" || Name == "__tls_base"; + Name == "__stack_pointer" || Name == "__tls_base" || + Name == "__stack_chk_guard"; WasmSym->setType(wasm::WASM_SYMBOL_TYPE_GLOBAL); WasmSym->setGlobalType(wasm::WasmGlobalType{ uint8_t(Subtarget.hasAddr64() ? wasm::WASM_TYPE_I64 diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index e0c527b9b2581..c13dbac06dc5c 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -3695,3 +3695,7 @@ WebAssemblyTargetLowering::PerformDAGCombine(SDNode *N, return performMulCombine(N, DCI); } } + +bool WebAssemblyTargetLowering::useLoadStackGuardNode(const Module &M) const { + return true; +} diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h index c37970f458e36..9b5056e7b9bea 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h @@ -29,6 +29,8 @@ class WebAssemblyTargetLowering final : public TargetLowering { MVT getPointerTy(const DataLayout &DL, uint32_t AS = 0) const override; MVT getPointerMemTy(const DataLayout &DL, uint32_t AS = 0) const override; + bool useLoadStackGuardNode(const Module &M) const override; + private: /// Keep a pointer to the WebAssemblySubtarget around so that we can make the /// right decision when generating code for different targets. diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp index 8b4e4fbbbd1e5..fe49097a64391 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp @@ -37,7 +37,7 @@ WebAssemblyInstrInfo::WebAssemblyInstrInfo(const WebAssemblySubtarget &STI) : WebAssemblyGenInstrInfo(STI, RI, WebAssembly::ADJCALLSTACKDOWN, WebAssembly::ADJCALLSTACKUP, WebAssembly::CATCHRET), - RI(STI.getTargetTriple()) {} + Subtarget(STI), RI(STI.getTargetTriple()) {} bool WebAssemblyInstrInfo::isReMaterializableImpl( const MachineInstr &MI) const { @@ -233,3 +233,22 @@ bool WebAssemblyInstrInfo::isExplicitTargetIndexDef(const MachineInstr &MI, } return false; } + +bool WebAssemblyInstrInfo::expandPostRAPseudo(MachineInstr &MI) const { + if(MI.getOpcode() == TargetOpcode::LOAD_STACK_GUARD) { + MachineFunction *MF = MI.getParent()->getParent(); + const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo(); + const char *BaseName = MF->createExternalSymbolName("__stack_chk_guard"); + + MachineInstrBuilder MIB = BuildMI(*MF, MI.getDebugLoc(), + TII->get(Subtarget.hasAddr64() + ? WebAssembly::GLOBAL_GET_I64 + : WebAssembly::GLOBAL_GET_I32)) + .addDef(MI.getOperand(0).getReg()) + .addExternalSymbol(BaseName); + MI.getParent()->insert(MI.getIterator(), MIB.getInstr()); + MI.eraseFromParent(); + return true; + } + return false; +} diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.h b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.h index b92f62d7638c1..9507956a2a9be 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.h @@ -30,6 +30,7 @@ namespace llvm { class WebAssemblySubtarget; class WebAssemblyInstrInfo final : public WebAssemblyGenInstrInfo { + const WebAssemblySubtarget &Subtarget; const WebAssemblyRegisterInfo RI; public: @@ -67,6 +68,8 @@ class WebAssemblyInstrInfo final : public WebAssemblyGenInstrInfo { bool isExplicitTargetIndexDef(const MachineInstr &MI, int &Index, int64_t &Offset) const override; + + bool expandPostRAPseudo(MachineInstr &MI) const override; }; } // end namespace llvm