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) {
const IOffsetT Offset = Var->getStackOffset();
if (!Utils::IsAbsoluteUint(12, Offset))
return CantDecode;
Value = decodeImmRegOffset(RegARM32::Encoded_Reg_sp, Offset,
OperandARM32Mem::Offset);
RegARM32::GPRRegister BaseReg = RegARM32::Encoded_Reg_sp;
if (const auto *StackVar = llvm::dyn_cast<StackVariable>(Var))
BaseReg = decodeGPRRegister(StackVar->getBaseRegNum());
Value = decodeImmRegOffset(BaseReg, Offset, OperandARM32Mem::Offset);
return DecodedAsImmRegOffset;
}
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