diff options
| author | Sam Clegg <sbc@chromium.org> | 2018-04-04 22:27:58 +0000 |
|---|---|---|
| committer | Sam Clegg <sbc@chromium.org> | 2018-04-04 22:27:58 +0000 |
| commit | 685c5e838a59c6c84883bd9b4250da01a9dcabe4 (patch) | |
| tree | 1cd5ec5b6b451e897f568b5b13138f85cb1229af /llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp | |
| parent | 0f87a807950704b080dab6ec3cf06ff77eaf3cb0 (diff) | |
| download | bcm5719-llvm-685c5e838a59c6c84883bd9b4250da01a9dcabe4.tar.gz bcm5719-llvm-685c5e838a59c6c84883bd9b4250da01a9dcabe4.zip | |
[WebAssembly] Only write 32-bits for WebAssembly::OPERAND_OFFSET32
A bug was found where an offset of -1 would generate an encoding
of max int64 which is invalid in the binary format.
Differential Revision: https://reviews.llvm.org/D45280
llvm-svn: 329238
Diffstat (limited to 'llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp')
| -rw-r--r-- | llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp index 2baa135ebd9..440b9a5ad10 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCCodeEmitter.cpp @@ -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,8 +88,11 @@ void WebAssemblyMCCodeEmitter::encodeInstruction( assert(Desc.TSFlags == 0 && "WebAssembly non-variable_ops don't use TSFlags"); const MCOperandInfo &Info = Desc.OpInfo[i]; + 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) { |

