diff options
| author | Jim Grosbach <grosbach@apple.com> | 2011-07-19 16:50:30 +0000 | 
|---|---|---|
| committer | Jim Grosbach <grosbach@apple.com> | 2011-07-19 16:50:30 +0000 | 
| commit | 6bc1dbc37695bcfc5ae23a1a9e17550ee50fe02f (patch) | |
| tree | 5cce43ef786951f22ef4e0889641e8f7928e2c70 /lib/Target | |
| parent | f51bb7cef8b0aa25506308c2ec0fcde58e1dc7ed (diff) | |
| download | external_llvm-6bc1dbc37695bcfc5ae23a1a9e17550ee50fe02f.zip external_llvm-6bc1dbc37695bcfc5ae23a1a9e17550ee50fe02f.tar.gz external_llvm-6bc1dbc37695bcfc5ae23a1a9e17550ee50fe02f.tar.bz2  | |
ARM range checking for so_imm operands in assembly parsing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135489 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
| -rw-r--r-- | lib/Target/ARM/ARMInstrInfo.td | 2 | ||||
| -rw-r--r-- | lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 13 | 
2 files changed, 15 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMInstrInfo.td b/lib/Target/ARM/ARMInstrInfo.td index a42dd1a..9845e0b 100644 --- a/lib/Target/ARM/ARMInstrInfo.td +++ b/lib/Target/ARM/ARMInstrInfo.td @@ -443,10 +443,12 @@ def shift_so_reg : Operand<i32>,    // reg reg imm  // so_imm - Match a 32-bit shifter_operand immediate operand, which is an  // 8-bit immediate rotated by an arbitrary number of bits. +def SOImmAsmOperand: AsmOperandClass { let Name = "ARMSOImm"; }  def so_imm : Operand<i32>, ImmLeaf<i32, [{      return ARM_AM::getSOImmVal(Imm) != -1;    }]> {    let EncoderMethod = "getSOImmOpValue"; +  let ParserMatchClass = SOImmAsmOperand;  }  // Break so_imm's up into two pieces.  This handles immediates with up to 16 diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index a474127..a0f2726 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -407,6 +407,14 @@ public:      int64_t Value = CE->getValue();      return Value >= 0 && Value < 65536;    } +  bool isARMSOImm() const { +    if (Kind != Immediate) +      return false; +    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); +    if (!CE) return false; +    int64_t Value = CE->getValue(); +    return ARM_AM::getSOImmVal(Value) != -1; +  }    bool isT2SOImm() const {      if (Kind != Immediate)        return false; @@ -613,6 +621,11 @@ public:      addExpr(Inst, getImm());    } +  void addARMSOImmOperands(MCInst &Inst, unsigned N) const { +    assert(N == 1 && "Invalid number of operands!"); +    addExpr(Inst, getImm()); +  } +    void addT2SOImmOperands(MCInst &Inst, unsigned N) const {      assert(N == 1 && "Invalid number of operands!");      addExpr(Inst, getImm());  | 
