@@ -1932,6 +1932,19 @@ class X86MCPlusBuilder : public MCPlusBuilder {
1932
1932
// = R_X86_64_PC32(Ln) + En - JT
1933
1933
// = R_X86_64_PC32(Ln + offsetof(En))
1934
1934
//
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
+ };
1935
1948
LLVM_DEBUG (dbgs () << " Checking for PIC jump table\n " );
1936
1949
MCInst *MemLocInstr = nullptr ;
1937
1950
const MCInst *MovInstr = nullptr ;
@@ -1965,9 +1978,8 @@ class X86MCPlusBuilder : public MCPlusBuilder {
1965
1978
std::optional<X86MemOperand> MO = evaluateX86MemoryOperand (Instr);
1966
1979
if (!MO)
1967
1980
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
1971
1983
break ;
1972
1984
MovInstr = &Instr;
1973
1985
} else {
@@ -1986,9 +1998,7 @@ class X86MCPlusBuilder : public MCPlusBuilder {
1986
1998
std::optional<X86MemOperand> MO = evaluateX86MemoryOperand (Instr);
1987
1999
if (!MO)
1988
2000
break ;
1989
- if (MO->BaseRegNum != RegInfo->getProgramCounter () ||
1990
- MO->IndexRegNum != X86::NoRegister ||
1991
- MO->SegRegNum != X86::NoRegister || MO->DispExpr == nullptr )
2001
+ if (!isRIPRel (*MO))
1992
2002
break ;
1993
2003
MemLocInstr = &Instr;
1994
2004
break ;
0 commit comments