mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[AArch64] Decorate AArch64 instrs with OPERAND_PCREL
Summary: This is a canonical way to teach objdump to print the target symbols for branches when disassembling AArch64 code. Reviewers: evandro, t.p.northover, espindola Reviewed By: t.p.northover Differential Revision: https://reviews.llvm.org/D44851 llvm-svn: 328638
This commit is contained in:
parent
f4f5aa42aa
commit
cff8c7276f
@ -1244,6 +1244,7 @@ def am_brcond : Operand<OtherVT> {
|
||||
let DecoderMethod = "DecodePCRelLabel19";
|
||||
let PrintMethod = "printAlignedLabel";
|
||||
let ParserMatchClass = PCRelLabel19Operand;
|
||||
let OperandType = "OPERAND_PCREL";
|
||||
}
|
||||
|
||||
class BranchCond : I<(outs), (ins ccode:$cond, am_brcond:$target),
|
||||
@ -1299,6 +1300,7 @@ def am_tbrcond : Operand<OtherVT> {
|
||||
let EncoderMethod = "getTestBranchTargetOpValue";
|
||||
let PrintMethod = "printAlignedLabel";
|
||||
let ParserMatchClass = BranchTarget14Operand;
|
||||
let OperandType = "OPERAND_PCREL";
|
||||
}
|
||||
|
||||
// AsmOperand classes to emit (or not) special diagnostics
|
||||
@ -1375,11 +1377,13 @@ def am_b_target : Operand<OtherVT> {
|
||||
let EncoderMethod = "getBranchTargetOpValue";
|
||||
let PrintMethod = "printAlignedLabel";
|
||||
let ParserMatchClass = BranchTarget26Operand;
|
||||
let OperandType = "OPERAND_PCREL";
|
||||
}
|
||||
def am_bl_target : Operand<i64> {
|
||||
let EncoderMethod = "getBranchTargetOpValue";
|
||||
let PrintMethod = "printAlignedLabel";
|
||||
let ParserMatchClass = BranchTarget26Operand;
|
||||
let OperandType = "OPERAND_PCREL";
|
||||
}
|
||||
|
||||
class BImm<bit op, dag iops, string asm, list<dag> pattern>
|
||||
@ -2667,6 +2671,7 @@ def am_ldrlit : Operand<iPTR> {
|
||||
let DecoderMethod = "DecodePCRelLabel19";
|
||||
let PrintMethod = "printAlignedLabel";
|
||||
let ParserMatchClass = PCRelLabel19Operand;
|
||||
let OperandType = "OPERAND_PCREL";
|
||||
}
|
||||
|
||||
let mayLoad = 1, mayStore = 0, hasSideEffects = 0 in
|
||||
|
@ -131,8 +131,29 @@ createWinCOFFStreamer(MCContext &Ctx, std::unique_ptr<MCAsmBackend> &&TAB,
|
||||
IncrementalLinkerCompatible);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
class AArch64MCInstrAnalysis : public MCInstrAnalysis {
|
||||
public:
|
||||
AArch64MCInstrAnalysis(const MCInstrInfo *Info) : MCInstrAnalysis(Info) {}
|
||||
|
||||
bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
|
||||
uint64_t &Target) const override {
|
||||
if (Inst.getNumOperands() == 0 ||
|
||||
Info->get(Inst.getOpcode()).OpInfo[0].OperandType !=
|
||||
MCOI::OPERAND_PCREL)
|
||||
return false;
|
||||
|
||||
int64_t Imm = Inst.getOperand(0).getImm() * 4;
|
||||
Target = Addr + Imm;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
static MCInstrAnalysis *createAArch64InstrAnalysis(const MCInstrInfo *Info) {
|
||||
return new MCInstrAnalysis(Info);
|
||||
return new AArch64MCInstrAnalysis(Info);
|
||||
}
|
||||
|
||||
// Force static initialization.
|
||||
|
3
test/tools/llvm-objdump/AArch64/pc-rel-targets.test
Normal file
3
test/tools/llvm-objdump/AArch64/pc-rel-targets.test
Normal file
@ -0,0 +1,3 @@
|
||||
// RUN: llvm-objdump -d %p/Inputs/kextbundle.macho-aarch64 | FileCheck %s
|
||||
|
||||
CHECK: 4008: 03 00 00 94 bl #12 <_bar.stub>
|
Loading…
Reference in New Issue
Block a user