mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-02 05:02:15 +00:00
[BOLT] Use MCInstPrinter in createRetpolineFunctionTag
Make retpoline functions invariant of X86 register numbers. retpoline-synthetic.test is known to fail NFC testing due to shifting register numbers. Use canonical register names instead of tablegen numbers. Before: ``` __retpoline_r51_ __retpoline_mem_r58+DATAat0x200fe8 __retpoline_mem_r51+0 __retpoline_mem_r132+0+8*53 ``` After: ``` __retpoline_%rax_ __retpoline_mem_%rip+DATAat0x200fe8 __retpoline_mem_%rax+0 __retpoline_mem_%r12+0+8*%rbx ``` Test Plan: - Revert 67bd3c58c0c7389e39c5a2f4d3b1a30459ccf5b7 that touches X86RegisterInfo.td. - retpoline-synthetic.test passes in NFC mode with this diff, fails without it. Reviewed By: #bolt, rafauler Differential Revision: https://reviews.llvm.org/D150138
This commit is contained in:
parent
793c5b12b9
commit
19941b0468
@ -22,6 +22,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "bolt/Passes/RetpolineInsertion.h"
|
||||
#include "llvm/MC/MCInstPrinter.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
||||
#define DEBUG_TYPE "bolt-retpoline"
|
||||
@ -173,39 +174,45 @@ BinaryFunction *createNewRetpoline(BinaryContext &BC,
|
||||
std::string createRetpolineFunctionTag(BinaryContext &BC,
|
||||
const IndirectBranchInfo &BrInfo,
|
||||
bool R11Available) {
|
||||
if (BrInfo.isReg())
|
||||
return "__retpoline_r" + to_string(BrInfo.BranchReg) + "_";
|
||||
std::string Tag;
|
||||
llvm::raw_string_ostream TagOS(Tag);
|
||||
TagOS << "__retpoline_";
|
||||
|
||||
if (BrInfo.isReg()) {
|
||||
BC.InstPrinter->printRegName(TagOS, BrInfo.BranchReg);
|
||||
TagOS << "_";
|
||||
TagOS.flush();
|
||||
return Tag;
|
||||
}
|
||||
|
||||
// Memory Branch
|
||||
if (R11Available)
|
||||
return "__retpoline_r11";
|
||||
|
||||
std::string Tag = "__retpoline_mem_";
|
||||
|
||||
const IndirectBranchInfo::MemOpInfo &MemRef = BrInfo.Memory;
|
||||
|
||||
std::string DispExprStr;
|
||||
if (MemRef.DispExpr) {
|
||||
llvm::raw_string_ostream Ostream(DispExprStr);
|
||||
MemRef.DispExpr->print(Ostream, BC.AsmInfo.get());
|
||||
Ostream.flush();
|
||||
TagOS << "mem_";
|
||||
|
||||
if (MemRef.BaseRegNum != BC.MIB->getNoRegister())
|
||||
BC.InstPrinter->printRegName(TagOS, MemRef.BaseRegNum);
|
||||
|
||||
TagOS << "+";
|
||||
if (MemRef.DispExpr)
|
||||
MemRef.DispExpr->print(TagOS, BC.AsmInfo.get());
|
||||
else
|
||||
TagOS << MemRef.DispImm;
|
||||
|
||||
if (MemRef.IndexRegNum != BC.MIB->getNoRegister()) {
|
||||
TagOS << "+" << MemRef.ScaleImm << "*";
|
||||
BC.InstPrinter->printRegName(TagOS, MemRef.IndexRegNum);
|
||||
}
|
||||
|
||||
Tag += MemRef.BaseRegNum != BC.MIB->getNoRegister()
|
||||
? "r" + to_string(MemRef.BaseRegNum)
|
||||
: "";
|
||||
|
||||
Tag += MemRef.DispExpr ? "+" + DispExprStr : "+" + to_string(MemRef.DispImm);
|
||||
|
||||
Tag += MemRef.IndexRegNum != BC.MIB->getNoRegister()
|
||||
? "+" + to_string(MemRef.ScaleImm) + "*" +
|
||||
to_string(MemRef.IndexRegNum)
|
||||
: "";
|
||||
|
||||
Tag += MemRef.SegRegNum != BC.MIB->getNoRegister()
|
||||
? "_seg_" + to_string(MemRef.SegRegNum)
|
||||
: "";
|
||||
if (MemRef.SegRegNum != BC.MIB->getNoRegister()) {
|
||||
TagOS << "_seg_";
|
||||
BC.InstPrinter->printRegName(TagOS, MemRef.SegRegNum);
|
||||
}
|
||||
|
||||
TagOS.flush();
|
||||
return Tag;
|
||||
}
|
||||
|
||||
|
@ -47,6 +47,7 @@ list(APPEND BOLT_TEST_DEPS
|
||||
llvm-objdump
|
||||
llvm-readelf
|
||||
llvm-readobj
|
||||
llvm-strings
|
||||
llvm-strip
|
||||
llvm-objcopy
|
||||
merge-fdata
|
||||
|
@ -87,6 +87,7 @@ tools = [
|
||||
ToolSubst('llvm-nm', unresolved='fatal'),
|
||||
ToolSubst('llvm-objdump', unresolved='fatal'),
|
||||
ToolSubst('llvm-objcopy', unresolved='fatal'),
|
||||
ToolSubst('llvm-strings', unresolved='fatal'),
|
||||
ToolSubst('llvm-strip', unresolved='fatal'),
|
||||
ToolSubst('llvm-readelf', unresolved='fatal'),
|
||||
ToolSubst('link_fdata', command=sys.executable, unresolved='fatal', extra_args=[link_fdata_cmd]),
|
||||
|
@ -20,5 +20,12 @@ CHECK-CALL-NOT: callq *
|
||||
RUN: llvm-objdump -d -j ".text" %t | FileCheck %s -check-prefix=CHECK-JUMP
|
||||
CHECK-JUMP-NOT: jmpq *
|
||||
|
||||
# Check generated retpoline stub names
|
||||
RUN: llvm-strings %t | FileCheck %s -check-prefix=CHECK-STRINGS
|
||||
CHECK-STRINGS-DAG: __retpoline_%rax_
|
||||
CHECK-STRINGS-DAG: __retpoline_mem_%rip+DATAat0x[[#]]
|
||||
CHECK-STRINGS-DAG: __retpoline_mem_%rax+0
|
||||
CHECK-STRINGS-DAG: __retpoline_mem_%r[[#]]+0+8*%rbx
|
||||
|
||||
RUN: %t 1000 3 | FileCheck %s
|
||||
CHECK: 30000000
|
||||
|
Loading…
x
Reference in New Issue
Block a user