@@ -1932,6 +1932,19 @@ class X86MCPlusBuilder : public MCPlusBuilder {
19321932 // = R_X86_64_PC32(Ln) + En - JT
19331933 // = R_X86_64_PC32(Ln + offsetof(En))
19341934 //
1935+ auto isRIPRel = [&](X86MemOperand &MO) {
1936+ // NB: DispExpr should be set
1937+ return MO.DispExpr != nullptr &&
1938+ MO.BaseRegNum == RegInfo->getProgramCounter () &&
1939+ MO.IndexRegNum == X86::NoRegister &&
1940+ MO.SegRegNum == X86::NoRegister;
1941+ };
1942+ auto isIndexed = [](X86MemOperand &MO, MCPhysReg R) {
1943+ // NB: IndexRegNum should be set.
1944+ return MO.IndexRegNum != X86::NoRegister && MO.BaseRegNum == R &&
1945+ MO.ScaleImm == 4 && MO.DispImm == 0 &&
1946+ MO.SegRegNum == X86::NoRegister;
1947+ };
19351948 LLVM_DEBUG (dbgs () << " Checking for PIC jump table\n " );
19361949 MCInst *MemLocInstr = nullptr ;
19371950 const MCInst *MovInstr = nullptr ;
@@ -1965,9 +1978,8 @@ class X86MCPlusBuilder : public MCPlusBuilder {
19651978 std::optional<X86MemOperand> MO = evaluateX86MemoryOperand (Instr);
19661979 if (!MO)
19671980 break ;
1968- if (MO->BaseRegNum != R1 || MO->ScaleImm != 4 ||
1969- MO->IndexRegNum == X86::NoRegister || MO->DispImm != 0 ||
1970- MO->SegRegNum != X86::NoRegister)
1981+ if (!isIndexed (*MO, R1))
1982+ // POSSIBLE_PIC_JUMP_TABLE
19711983 break ;
19721984 MovInstr = &Instr;
19731985 } else {
@@ -1986,9 +1998,7 @@ class X86MCPlusBuilder : public MCPlusBuilder {
19861998 std::optional<X86MemOperand> MO = evaluateX86MemoryOperand (Instr);
19871999 if (!MO)
19882000 break ;
1989- if (MO->BaseRegNum != RegInfo->getProgramCounter () ||
1990- MO->IndexRegNum != X86::NoRegister ||
1991- MO->SegRegNum != X86::NoRegister || MO->DispExpr == nullptr )
2001+ if (!isRIPRel (*MO))
19922002 break ;
19932003 MemLocInstr = &Instr;
19942004 break ;
0 commit comments