diff options
author | Sean Callanan <scallanan@apple.com> | 2011-02-23 03:31:28 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2011-02-23 03:31:28 +0000 |
commit | 34770edf4396c4106f396a98a1d0a1a93afe3797 (patch) | |
tree | ff2d7cb80556dff15af7fd2e9f4cfb137e766f6e /llvm/lib/MC/MCDisassembler/EDOperand.cpp | |
parent | be81988c99d6867b05d0900ce4536284838e3131 (diff) | |
download | bcm5719-llvm-34770edf4396c4106f396a98a1d0a1a93afe3797.tar.gz bcm5719-llvm-34770edf4396c4106f396a98a1d0a1a93afe3797.zip |
Fixed a bug in the enhanced disassembler that caused
it to ignore valid uses of FS and GS as additional
base registers in address computations. Added a test
case for this.
llvm-svn: 126302
Diffstat (limited to 'llvm/lib/MC/MCDisassembler/EDOperand.cpp')
-rw-r--r-- | llvm/lib/MC/MCDisassembler/EDOperand.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/llvm/lib/MC/MCDisassembler/EDOperand.cpp b/llvm/lib/MC/MCDisassembler/EDOperand.cpp index cfeb56fa3df..2b0c73e8059 100644 --- a/llvm/lib/MC/MCDisassembler/EDOperand.cpp +++ b/llvm/lib/MC/MCDisassembler/EDOperand.cpp @@ -152,10 +152,23 @@ int EDOperand::evaluate(uint64_t &result, uint64_t scaleAmount = Inst.Inst->getOperand(MCOpIndex+1).getImm(); unsigned indexReg = Inst.Inst->getOperand(MCOpIndex+2).getReg(); int64_t displacement = Inst.Inst->getOperand(MCOpIndex+3).getImm(); - //unsigned segmentReg = Inst.Inst->getOperand(MCOpIndex+4).getReg(); - + uint64_t addr = 0; + unsigned segmentReg = Inst.Inst->getOperand(MCOpIndex+4).getReg(); + + if (segmentReg != 0 && Disassembler.Key.Arch == Triple::x86_64) { + unsigned fsID = Disassembler.registerIDWithName("FS"); + unsigned gsID = Disassembler.registerIDWithName("GS"); + + if (segmentReg == fsID || + segmentReg == gsID) { + uint64_t segmentBase; + if (!callback(&segmentBase, segmentReg, arg)) + addr += segmentBase; + } + } + if (baseReg) { uint64_t baseVal; if (callback(&baseVal, baseReg, arg)) @@ -175,7 +188,7 @@ int EDOperand::evaluate(uint64_t &result, result = addr; return 0; } - } + } // switch (operandType) break; case Triple::arm: case Triple::thumb: @@ -203,6 +216,7 @@ int EDOperand::evaluate(uint64_t &result, return 0; } } + break; } return -1; |