Commit 57586f73 by Karl Schimpf

Fix base register for stack variables in ARM integrated assembler.

When translating an Variable without a register, the code assumes the variable is on the stack using sp. This is still true. However, if it is a (derived class) StackVariable, the register defined by getBaseRegNum() should be used instead. BUG= https://code.google.com/p/nativeclient/issues/detail?id=4334 R=jpp@chromium.org, stichnot@chromium.org Review URL: https://codereview.chromium.org/1432453003 .
parent cb504ca5
...@@ -236,8 +236,10 @@ DecodedResult decodeAddress(const Operand *Opnd, IValueT &Value) { ...@@ -236,8 +236,10 @@ DecodedResult decodeAddress(const Operand *Opnd, IValueT &Value) {
const IOffsetT Offset = Var->getStackOffset(); const IOffsetT Offset = Var->getStackOffset();
if (!Utils::IsAbsoluteUint(12, Offset)) if (!Utils::IsAbsoluteUint(12, Offset))
return CantDecode; return CantDecode;
Value = decodeImmRegOffset(RegARM32::Encoded_Reg_sp, Offset, RegARM32::GPRRegister BaseReg = RegARM32::Encoded_Reg_sp;
OperandARM32Mem::Offset); if (const auto *StackVar = llvm::dyn_cast<StackVariable>(Var))
BaseReg = decodeGPRRegister(StackVar->getBaseRegNum());
Value = decodeImmRegOffset(BaseReg, Offset, OperandARM32Mem::Offset);
return DecodedAsImmRegOffset; return DecodedAsImmRegOffset;
} }
if (const auto *Mem = llvm::dyn_cast<OperandARM32Mem>(Opnd)) { if (const auto *Mem = llvm::dyn_cast<OperandARM32Mem>(Opnd)) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment