[llvm] [BOLT][NFCI] Fix return type of BC::getSignedValueAtAddress (PR #91664)
Amir Ayupov via llvm-commits
llvm-commits at lists.llvm.org
Fri May 24 15:33:53 PDT 2024
https://github.com/aaupov updated https://github.com/llvm/llvm-project/pull/91664
>From 3e9c1decce49f841fefc8fc5f7e8563627e38eaa Mon Sep 17 00:00:00 2001
From: Amir Ayupov <aaupov at fb.com>
Date: Thu, 9 May 2024 14:50:32 -0700
Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?=
=?UTF-8?q?anges=20to=20main=20this=20commit=20is=20based=20on?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.4
[skip ci]
---
bolt/lib/Core/BinaryFunction.cpp | 16 ++++++----
bolt/lib/Target/X86/X86MCPlusBuilder.cpp | 38 ++++++++++++++++--------
2 files changed, 35 insertions(+), 19 deletions(-)
diff --git a/bolt/lib/Core/BinaryFunction.cpp b/bolt/lib/Core/BinaryFunction.cpp
index de34421ebeb08..11103f7bdce8b 100644
--- a/bolt/lib/Core/BinaryFunction.cpp
+++ b/bolt/lib/Core/BinaryFunction.cpp
@@ -851,15 +851,19 @@ BinaryFunction::processIndirectBranch(MCInst &Instruction, unsigned Size,
return IndirectBranchType::UNKNOWN;
}
- // RIP-relative addressing should be converted to symbol form by now
- // in processed instructions (but not in jump).
- if (DispExpr) {
+ auto getExprValue = [&](const MCExpr *Expr) {
const MCSymbol *TargetSym;
uint64_t TargetOffset;
- std::tie(TargetSym, TargetOffset) = BC.MIB->getTargetSymbolInfo(DispExpr);
+ std::tie(TargetSym, TargetOffset) = BC.MIB->getTargetSymbolInfo(Expr);
ErrorOr<uint64_t> SymValueOrError = BC.getSymbolValue(*TargetSym);
- assert(SymValueOrError && "global symbol needs a value");
- ArrayStart = *SymValueOrError + TargetOffset;
+ assert(SymValueOrError && "Global symbol needs a value");
+ return *SymValueOrError + TargetOffset;
+ };
+
+ // RIP-relative addressing should be converted to symbol form by now
+ // in processed instructions (but not in jump).
+ if (DispExpr) {
+ ArrayStart = getExprValue(DispExpr);
BaseRegNum = BC.MIB->getNoRegister();
if (BC.isAArch64()) {
ArrayStart &= ~0xFFFULL;
diff --git a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp
index 8b1894953f375..86e7d4dfaed8d 100644
--- a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp
+++ b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp
@@ -1932,6 +1932,19 @@ class X86MCPlusBuilder : public MCPlusBuilder {
// = R_X86_64_PC32(Ln) + En - JT
// = R_X86_64_PC32(Ln + offsetof(En))
//
+ auto isRIPRel = [&](X86MemOperand &MO) {
+ // NB: DispExpr should be set
+ return MO.DispExpr != nullptr &&
+ MO.BaseRegNum == RegInfo->getProgramCounter() &&
+ MO.IndexRegNum == X86::NoRegister &&
+ MO.SegRegNum == X86::NoRegister;
+ };
+ auto isIndexed = [](X86MemOperand &MO, MCPhysReg R) {
+ // NB: IndexRegNum should be set.
+ return MO.IndexRegNum != X86::NoRegister && MO.BaseRegNum == R &&
+ MO.ScaleImm == 4 && MO.DispImm == 0 &&
+ MO.SegRegNum == X86::NoRegister;
+ };
LLVM_DEBUG(dbgs() << "Checking for PIC jump table\n");
MCInst *MemLocInstr = nullptr;
const MCInst *MovInstr = nullptr;
@@ -1965,9 +1978,8 @@ class X86MCPlusBuilder : public MCPlusBuilder {
std::optional<X86MemOperand> MO = evaluateX86MemoryOperand(Instr);
if (!MO)
break;
- if (MO->BaseRegNum != R1 || MO->ScaleImm != 4 ||
- MO->IndexRegNum == X86::NoRegister || MO->DispImm != 0 ||
- MO->SegRegNum != X86::NoRegister)
+ if (!isIndexed(*MO, R1))
+ // POSSIBLE_PIC_JUMP_TABLE
break;
MovInstr = &Instr;
} else {
@@ -1986,9 +1998,7 @@ class X86MCPlusBuilder : public MCPlusBuilder {
std::optional<X86MemOperand> MO = evaluateX86MemoryOperand(Instr);
if (!MO)
break;
- if (MO->BaseRegNum != RegInfo->getProgramCounter() ||
- MO->IndexRegNum != X86::NoRegister ||
- MO->SegRegNum != X86::NoRegister || MO->DispExpr == nullptr)
+ if (!isRIPRel(*MO))
break;
MemLocInstr = &Instr;
break;
@@ -2105,13 +2115,15 @@ class X86MCPlusBuilder : public MCPlusBuilder {
return IndirectBranchType::POSSIBLE_FIXED_BRANCH;
}
- if (Type == IndirectBranchType::POSSIBLE_PIC_JUMP_TABLE &&
- (MO->ScaleImm != 1 || MO->BaseRegNum != RIPRegister))
- return IndirectBranchType::UNKNOWN;
-
- if (Type != IndirectBranchType::POSSIBLE_PIC_JUMP_TABLE &&
- MO->ScaleImm != PtrSize)
- return IndirectBranchType::UNKNOWN;
+ switch (Type) {
+ case IndirectBranchType::POSSIBLE_PIC_JUMP_TABLE:
+ if (MO->ScaleImm != 1 || MO->BaseRegNum != RIPRegister)
+ return IndirectBranchType::UNKNOWN;
+ break;
+ default:
+ if (MO->ScaleImm != PtrSize)
+ return IndirectBranchType::UNKNOWN;
+ }
MemLocInstrOut = MemLocInstr;
>From 8d97606325c0620edb2e7a169442e370a569be74 Mon Sep 17 00:00:00 2001
From: Amir Ayupov <aaupov at fb.com>
Date: Thu, 9 May 2024 16:35:22 -0700
Subject: [PATCH 2/2] clang-format
Created using spr 1.3.4
---
bolt/lib/Core/BinaryContext.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index 507b203ea9d8b..0a0c827c3a962 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -2213,7 +2213,7 @@ ErrorOr<uint64_t> BinaryContext::getUnsignedValueAtAddress(uint64_t Address,
}
ErrorOr<int64_t> BinaryContext::getSignedValueAtAddress(uint64_t Address,
- size_t Size) const {
+ size_t Size) const {
const ErrorOr<const BinarySection &> Section = getSectionForAddress(Address);
if (!Section)
return std::make_error_code(std::errc::bad_address);
More information about the llvm-commits
mailing list