diff options
Diffstat (limited to 'lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp')
| -rw-r--r-- | lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp b/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp index 77744e53d62f..94ca94e1e18c 100644 --- a/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp +++ b/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp @@ -8,7 +8,7 @@  //===----------------------------------------------------------------------===//  ///  /// \file -/// \brief This file implements the WebAssemblyMCCodeEmitter class. +/// This file implements the WebAssemblyMCCodeEmitter class.  ///  //===----------------------------------------------------------------------===// @@ -23,9 +23,11 @@  #include "llvm/MC/MCRegisterInfo.h"  #include "llvm/MC/MCSubtargetInfo.h"  #include "llvm/MC/MCSymbol.h" +#include "llvm/Support/Debug.h"  #include "llvm/Support/EndianStream.h"  #include "llvm/Support/LEB128.h"  #include "llvm/Support/raw_ostream.h" +  using namespace llvm;  #define DEBUG_TYPE "mccodeemitter" @@ -86,14 +88,18 @@ void WebAssemblyMCCodeEmitter::encodeInstruction(          assert(Desc.TSFlags == 0 &&                 "WebAssembly non-variable_ops don't use TSFlags");          const MCOperandInfo &Info = Desc.OpInfo[i]; +        LLVM_DEBUG(dbgs() << "Encoding immediate: type=" +                          << int(Info.OperandType) << "\n");          if (Info.OperandType == WebAssembly::OPERAND_I32IMM) {            encodeSLEB128(int32_t(MO.getImm()), OS); +        } else if (Info.OperandType == WebAssembly::OPERAND_OFFSET32) { +          encodeULEB128(uint32_t(MO.getImm()), OS);          } else if (Info.OperandType == WebAssembly::OPERAND_I64IMM) {            encodeSLEB128(int64_t(MO.getImm()), OS);          } else if (Info.OperandType == WebAssembly::OPERAND_GLOBAL) {            llvm_unreachable("wasm globals should only be accessed symbolicly");          } else if (Info.OperandType == WebAssembly::OPERAND_SIGNATURE) { -          encodeSLEB128(int64_t(MO.getImm()), OS); +          OS << uint8_t(MO.getImm());          } else {            encodeULEB128(uint64_t(MO.getImm()), OS);          } @@ -112,11 +118,11 @@ void WebAssemblyMCCodeEmitter::encodeInstruction(          // TODO: MC converts all floating point immediate operands to double.          // This is fine for numeric values, but may cause NaNs to change bits.          float f = float(MO.getFPImm()); -        support::endian::Writer<support::little>(OS).write<float>(f); +        support::endian::write<float>(OS, f, support::little);        } else {          assert(Info.OperandType == WebAssembly::OPERAND_F64IMM);          double d = MO.getFPImm(); -        support::endian::Writer<support::little>(OS).write<double>(d); +        support::endian::write<double>(OS, d, support::little);        }      } else if (MO.isExpr()) {        const MCOperandInfo &Info = Desc.OpInfo[i];  | 
