diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -103,7 +103,10 @@ int64_t Addend, unsigned Type, const MCSectionWasm *FixupSection) : Offset(Offset), Symbol(Symbol), Addend(Addend), Type(Type), - FixupSection(FixupSection) {} + FixupSection(FixupSection) { + assert((Addend == 0 || wasm::relocTypeHasAddend(Type)) && + "Reloc entry has addend but its type does not"); + } bool hasAddend() const { return wasm::relocTypeHasAddend(Type); } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td @@ -380,10 +380,38 @@ "f64.const\t$res, $imm", "f64.const\t$imm", 0x44>; } // isMoveImm = 1, isAsCheapAsAMove = 1, isReMaterializable = 1 -def : Pat<(i32 (WebAssemblywrapper tglobaladdr:$addr)), - (CONST_I32 tglobaladdr:$addr)>, Requires<[IsNotPIC, HasAddr32]>; + +def XFormGlobal : SDNodeXFormgetOffset() == 0 || isa(N->getGlobal())) + return SDValue(CurDAG->getMachineNode(WebAssembly::CONST_I32, SDLoc(N), N->getValueType(0), SDValue(N, 0)), 0); + + return SDValue(CurDAG->getMachineNode(WebAssembly::ADD_I32, SDLoc(N), N->getValueType(0), + SDValue(CurDAG->getMachineNode(WebAssembly::CONST_I32, SDLoc(N), N->getValueType(0), + CurDAG->getTargetGlobalAddress(N->getGlobal(), SDLoc(N), + N->getValueType(0), 0, N->getTargetFlags())), 0), + SDValue(CurDAG->getMachineNode(WebAssembly::CONST_I32, SDLoc(N), N->getValueType(0), + CurDAG->getTargetConstant(N->getOffset(), SDLoc(N), N->getValueType(0))), 0)), 0); + + }]>; + +//def FunctionGlobal : PatLeaf< +// (i32 tglobaladdr), +// [{}],//[{ llvm::errs() << "blah "<< isa(N)<<"\n"; N->dump();return true;}], +// XFormGlobal>; + + +//def : Pat<(i32 (WebAssemblywrapper FunctionGlobal:$addr)), +// (CONST_I32 tglobaladdr:$addr)>, Requires<[IsNotPIC]>; + + +//def : Pat<(i32 (WebAssemblywrapper tglobaladdr:$addr)), +// (CONST_I32 tglobaladdr:$addr)>, Requires<[IsNotPIC, HasAddr32]>; def : Pat<(i64 (WebAssemblywrapper tglobaladdr:$addr)), (CONST_I64 tglobaladdr:$addr)>, Requires<[IsNotPIC, HasAddr64]>; +def : Pat<(i32 (WebAssemblywrapper tglobaladdr:$addr)), + (XFormGlobal tglobaladdr:$addr)>, Requires<[IsNotPIC]>; + def : Pat<(i32 (WebAssemblywrapper tglobaladdr:$addr)), (GLOBAL_GET_I32 tglobaladdr:$addr)>, Requires<[IsPIC, HasAddr32]>;