diff options
Diffstat (limited to 'lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp')
-rw-r--r-- | lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp | 98 |
1 files changed, 66 insertions, 32 deletions
diff --git a/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp b/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp index a6a2c0bf06ae..4209bc333f23 100644 --- a/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp +++ b/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp @@ -24,10 +24,11 @@ #include "WebAssemblyMachineFunctionInfo.h" #include "WebAssemblySubtarget.h" #include "WebAssemblyTargetMachine.h" +#include "WebAssemblyUtilities.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstrBuilder.h" -#include "llvm/CodeGen/MachineModuleInfo.h" +#include "llvm/CodeGen/MachineModuleInfoImpls.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/Support/Debug.h" using namespace llvm; @@ -101,25 +102,35 @@ static void writeSPToMemory(unsigned SrcReg, MachineFunction &MF, MachineBasicBlock::iterator &InsertAddr, MachineBasicBlock::iterator &InsertStore, const DebugLoc &DL) { - const char *ES = "__stack_pointer"; - auto *SPSymbol = MF.createExternalSymbolName(ES); - MachineRegisterInfo &MRI = MF.getRegInfo(); - const TargetRegisterClass *PtrRC = - MRI.getTargetRegisterInfo()->getPointerRegClass(MF); - unsigned Zero = MRI.createVirtualRegister(PtrRC); const auto *TII = MF.getSubtarget<WebAssemblySubtarget>().getInstrInfo(); - BuildMI(MBB, InsertAddr, DL, TII->get(WebAssembly::CONST_I32), Zero) - .addImm(0); - MachineMemOperand *MMO = MF.getMachineMemOperand( - MachinePointerInfo(MF.getPSVManager().getExternalSymbolCallEntry(ES)), - MachineMemOperand::MOStore, 4, 4); - BuildMI(MBB, InsertStore, DL, TII->get(WebAssembly::STORE_I32)) - .addImm(2) // p2align - .addExternalSymbol(SPSymbol) - .addReg(Zero) - .addReg(SrcReg) - .addMemOperand(MMO); + if (MF.getSubtarget<WebAssemblySubtarget>() + .getTargetTriple().isOSBinFormatELF()) { + const char *ES = "__stack_pointer"; + auto *SPSymbol = MF.createExternalSymbolName(ES); + MachineRegisterInfo &MRI = MF.getRegInfo(); + const TargetRegisterClass *PtrRC = + MRI.getTargetRegisterInfo()->getPointerRegClass(MF); + unsigned Zero = MRI.createVirtualRegister(PtrRC); + + BuildMI(MBB, InsertAddr, DL, TII->get(WebAssembly::CONST_I32), Zero) + .addImm(0); + MachineMemOperand *MMO = MF.getMachineMemOperand( + MachinePointerInfo(MF.getPSVManager().getExternalSymbolCallEntry(ES)), + MachineMemOperand::MOStore, 4, 4); + BuildMI(MBB, InsertStore, DL, TII->get(WebAssembly::STORE_I32)) + .addImm(2) // p2align + .addExternalSymbol(SPSymbol) + .addReg(Zero) + .addReg(SrcReg) + .addMemOperand(MMO); + } else { + MachineModuleInfoWasm &MMIW = + MF.getMMI().getObjFileInfo<MachineModuleInfoWasm>(); + BuildMI(MBB, InsertStore, DL, TII->get(WebAssembly::SET_GLOBAL_I32)) + .addImm(MMIW.getStackPointerGlobal()) + .addReg(SrcReg); + } } MachineBasicBlock::iterator @@ -151,27 +162,50 @@ void WebAssemblyFrameLowering::emitPrologue(MachineFunction &MF, auto &MRI = MF.getRegInfo(); auto InsertPt = MBB.begin(); + while (InsertPt != MBB.end() && WebAssembly::isArgument(*InsertPt)) + ++InsertPt; DebugLoc DL; const TargetRegisterClass *PtrRC = MRI.getTargetRegisterInfo()->getPointerRegClass(MF); - unsigned Zero = MRI.createVirtualRegister(PtrRC); unsigned SPReg = WebAssembly::SP32; if (StackSize) SPReg = MRI.createVirtualRegister(PtrRC); - const char *ES = "__stack_pointer"; - auto *SPSymbol = MF.createExternalSymbolName(ES); - BuildMI(MBB, InsertPt, DL, TII->get(WebAssembly::CONST_I32), Zero) - .addImm(0); - MachineMemOperand *LoadMMO = MF.getMachineMemOperand( - MachinePointerInfo(MF.getPSVManager().getExternalSymbolCallEntry(ES)), - MachineMemOperand::MOLoad, 4, 4); - // Load the SP value. - BuildMI(MBB, InsertPt, DL, TII->get(WebAssembly::LOAD_I32), SPReg) - .addImm(2) // p2align - .addExternalSymbol(SPSymbol) - .addReg(Zero) // addr - .addMemOperand(LoadMMO); + if (MF.getSubtarget<WebAssemblySubtarget>() + .getTargetTriple().isOSBinFormatELF()) { + const char *ES = "__stack_pointer"; + auto *SPSymbol = MF.createExternalSymbolName(ES); + unsigned Zero = MRI.createVirtualRegister(PtrRC); + + BuildMI(MBB, InsertPt, DL, TII->get(WebAssembly::CONST_I32), Zero) + .addImm(0); + MachineMemOperand *LoadMMO = MF.getMachineMemOperand( + MachinePointerInfo(MF.getPSVManager().getExternalSymbolCallEntry(ES)), + MachineMemOperand::MOLoad, 4, 4); + // Load the SP value. + BuildMI(MBB, InsertPt, DL, TII->get(WebAssembly::LOAD_I32), SPReg) + .addImm(2) // p2align + .addExternalSymbol(SPSymbol) + .addReg(Zero) // addr + .addMemOperand(LoadMMO); + } else { + auto &MMIW = MF.getMMI().getObjFileInfo<MachineModuleInfoWasm>(); + if (!MMIW.hasStackPointerGlobal()) { + MMIW.setStackPointerGlobal(MMIW.getGlobals().size()); + + // Create the stack-pointer global. For now, just use the + // Emscripten/Binaryen ABI names. + wasm::Global G; + G.Type = wasm::ValType::I32; + G.Mutable = true; + G.InitialValue = 0; + G.InitialModule = "env"; + G.InitialName = "STACKTOP"; + MMIW.addGlobal(G); + } + BuildMI(MBB, InsertPt, DL, TII->get(WebAssembly::GET_GLOBAL_I32), SPReg) + .addImm(MMIW.getStackPointerGlobal()); + } bool HasBP = hasBP(MF); if (HasBP) { |