diff options
| author | Owen Anderson <resistor@mac.com> | 2011-09-12 20:36:51 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2011-09-12 20:36:51 +0000 |
| commit | 4a9eb5f8dc613a9afe925ce3c277a7078e1bb8a1 (patch) | |
| tree | 89ef11caa3f32f70051733c83d385b8cbff04d98 /llvm/lib/Target | |
| parent | d2e61e1f70a998396afba3bfdfbe771c9c602c56 (diff) | |
| download | bcm5719-llvm-4a9eb5f8dc613a9afe925ce3c277a7078e1bb8a1.tar.gz bcm5719-llvm-4a9eb5f8dc613a9afe925ce3c277a7078e1bb8a1.zip | |
Fix encoding of PC-relative LDRSHW with an immediate offset.
llvm-svn: 139537
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp index e65af677f80..f0cb95f39b1 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp @@ -713,17 +713,26 @@ getAddrModeImm12OpValue(const MCInst &MI, unsigned OpIdx, Imm12 = 0; isAdd = false ; // 'U' bit is set as part of the fixup. - assert(MO.isExpr() && "Unexpected machine operand type!"); - const MCExpr *Expr = MO.getExpr(); + if (MO.isExpr()) { + const MCExpr *Expr = MO.getExpr(); - MCFixupKind Kind; - if (isThumb2()) - Kind = MCFixupKind(ARM::fixup_t2_ldst_pcrel_12); - else - Kind = MCFixupKind(ARM::fixup_arm_ldst_pcrel_12); - Fixups.push_back(MCFixup::Create(0, Expr, Kind)); - - ++MCNumCPRelocations; + MCFixupKind Kind; + if (isThumb2()) + Kind = MCFixupKind(ARM::fixup_t2_ldst_pcrel_12); + else + Kind = MCFixupKind(ARM::fixup_arm_ldst_pcrel_12); + Fixups.push_back(MCFixup::Create(0, Expr, Kind)); + + ++MCNumCPRelocations; + } else { + Reg = ARM::PC; + int32_t Offset = MO.getImm(); + if (Offset < 0) { + Offset *= -1; + isAdd = false; + } + Imm12 = Offset; + } } else isAdd = EncodeAddrModeOpValues(MI, OpIdx, Reg, Imm12, Fixups); |

