diff options
| author | Wouter van Oortmerssen <aardappel@gmail.com> | 2019-07-08 16:58:37 +0000 | 
|---|---|---|
| committer | Wouter van Oortmerssen <aardappel@gmail.com> | 2019-07-08 16:58:37 +0000 | 
| commit | 81db9f543ceb2f91a03ed5ce01f734f580829e47 (patch) | |
| tree | 877531b85a413298e633edd30ba21b591f6d2da1 /llvm | |
| parent | 224d8cd987b6b66292f1c56928d17997dba3bc2a (diff) | |
| download | bcm5719-llvm-81db9f543ceb2f91a03ed5ce01f734f580829e47.tar.gz bcm5719-llvm-81db9f543ceb2f91a03ed5ce01f734f580829e47.zip  | |
[WebAssembly] tablegen: distinguish float/int immediate operands.
Summary:
Before, they were one category of operands which could cause
crashes in non-sensical combinations, e.g. "f32.const symbol".
Now these are forced to be an error.
Reviewers: dschuff
Subscribers: sbc100, jgravelle-google, aheejin, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D64039
llvm-svn: 365351
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 17 | ||||
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td | 15 | ||||
| -rw-r--r-- | llvm/test/MC/WebAssembly/basic-assembly-errors.s | 4 | 
3 files changed, 28 insertions, 8 deletions
diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index e22ed8e4764..c7a88906019 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -89,9 +89,8 @@ struct WebAssemblyOperand : public MCParsedAsmOperand {    }    bool isToken() const override { return Kind == Token; } -  bool isImm() const override { -    return Kind == Integer || Kind == Float || Kind == Symbol; -  } +  bool isImm() const override { return Kind == Integer || Kind == Symbol; } +  bool isFPImm() const { return Kind == Float; }    bool isMem() const override { return false; }    bool isReg() const override { return false; }    bool isBrList() const { return Kind == BrList; } @@ -118,12 +117,18 @@ struct WebAssemblyOperand : public MCParsedAsmOperand {      assert(N == 1 && "Invalid number of operands!");      if (Kind == Integer)        Inst.addOperand(MCOperand::createImm(Int.Val)); -    else if (Kind == Float) -      Inst.addOperand(MCOperand::createFPImm(Flt.Val));      else if (Kind == Symbol)        Inst.addOperand(MCOperand::createExpr(Sym.Exp));      else -      llvm_unreachable("Should be immediate or symbol!"); +      llvm_unreachable("Should be integer immediate or symbol!"); +  } + +  void addFPImmOperands(MCInst &Inst, unsigned N) const { +    assert(N == 1 && "Invalid number of operands!"); +    if (Kind == Float) +      Inst.addOperand(MCOperand::createFPImm(Flt.Val)); +    else +      llvm_unreachable("Should be float immediate!");    }    void addBrListOperands(MCInst &Inst, unsigned N) const { diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td index c42118e82c8..859cb9bcdfd 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td @@ -118,6 +118,17 @@ def WebAssemblythrow : SDNode<"WebAssemblyISD::THROW", SDT_WebAssemblyThrow,  // WebAssembly-specific Operands.  //===----------------------------------------------------------------------===// +// Default Operand has AsmOperandClass "Imm" which is for integers (and +// symbols), so specialize one for floats: +def FPImmAsmOperand : AsmOperandClass { +  let Name = "FPImm"; +  let PredicateMethod = "isFPImm"; +} + +class FPOperand<ValueType ty> : Operand<ty> { +  AsmOperandClass ParserMatchClass = FPImmAsmOperand; +} +  let OperandNamespace = "WebAssembly" in {  let OperandType = "OPERAND_BASIC_BLOCK" in @@ -136,10 +147,10 @@ let OperandType = "OPERAND_I64IMM" in  def i64imm_op : Operand<i64>;  let OperandType = "OPERAND_F32IMM" in -def f32imm_op : Operand<f32>; +def f32imm_op : FPOperand<f32>;  let OperandType = "OPERAND_F64IMM" in -def f64imm_op : Operand<f64>; +def f64imm_op : FPOperand<f64>;  let OperandType = "OPERAND_VEC_I8IMM" in  def vec_i8imm_op : Operand<i32>; diff --git a/llvm/test/MC/WebAssembly/basic-assembly-errors.s b/llvm/test/MC/WebAssembly/basic-assembly-errors.s index eead082e93f..ba990f14e11 100644 --- a/llvm/test/MC/WebAssembly/basic-assembly-errors.s +++ b/llvm/test/MC/WebAssembly/basic-assembly-errors.s @@ -1,5 +1,9 @@  # RUN: not llvm-mc -triple=wasm32-unknown-unknown -mattr=+simd128,+nontrapping-fptoint,+exception-handling < %s 2>&1 | FileCheck %s +# CHECK: invalid operand for instruction +# (must be 0.0 or similar) +    f32.const 0 +  # CHECK: End of block construct with no start: end_try      end_try  test0:  | 

