Skip to content

Commit 4658803

Browse files
authored
[BOLT][NFC] Add isRIPRel and isIndexed helpers (#91661)
Move out common X86MemOperand checks into helper lambdas. To be reused in #91667. Test Plan: NFC
1 parent 9a038fc commit 4658803

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

bolt/lib/Target/X86/X86MCPlusBuilder.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)