-
Notifications
You must be signed in to change notification settings - Fork 11.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[llvm-exegesis] Factor out DisassemblerHelper from the Analysis class
As part of preparing the reports, the Analysis class needs to print machine instructions in a disassembled form. For this purpose, the class has four fields (namely Context_, AsmInfo_, InstPrinter_ and Disasm_). All the constructor of the Analysis class does is conditionally initializing these four fields. This commit factors out the logic for decoding machine code and printing it in an assembler form into a separate DisassemblerHelper class. ~~ Huawei RRI, OS Lab Reviewed By: courbet Differential Revision: https://reviews.llvm.org/D147156
- Loading branch information
Showing
5 changed files
with
95 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
//===-- DisassemblerHelper.cpp ----------------------------------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "DisassemblerHelper.h" | ||
|
||
#include "llvm/MC/TargetRegistry.h" | ||
|
||
namespace llvm { | ||
namespace exegesis { | ||
|
||
DisassemblerHelper::DisassemblerHelper(const LLVMState &State) : State_(State) { | ||
MCTargetOptions MCOptions; | ||
const auto &TM = State.getTargetMachine(); | ||
const auto &Triple = TM.getTargetTriple(); | ||
AsmInfo_.reset(TM.getTarget().createMCAsmInfo(State_.getRegInfo(), | ||
Triple.str(), MCOptions)); | ||
InstPrinter_.reset(TM.getTarget().createMCInstPrinter( | ||
Triple, 0 /*default variant*/, *AsmInfo_, State_.getInstrInfo(), | ||
State_.getRegInfo())); | ||
|
||
Context_ = std::make_unique<MCContext>( | ||
Triple, AsmInfo_.get(), &State_.getRegInfo(), &State_.getSubtargetInfo()); | ||
Disasm_.reset(TM.getTarget().createMCDisassembler(State_.getSubtargetInfo(), | ||
*Context_)); | ||
assert(Disasm_ && "cannot create MCDisassembler. missing call to " | ||
"InitializeXXXTargetDisassembler ?"); | ||
} | ||
|
||
} // namespace exegesis | ||
} // namespace llvm |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
//===-- DisassemblerHelper.h ------------------------------------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
/// | ||
/// \file | ||
/// Helper class for decoding machine instructions and printing them in an | ||
/// assembler form. | ||
/// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_TOOLS_LLVM_EXEGESIS_DISASSEMBLER_HELPER_H | ||
#define LLVM_TOOLS_LLVM_EXEGESIS_DISASSEMBLER_HELPER_H | ||
|
||
#include "LlvmState.h" | ||
#include "llvm/MC/MCAsmInfo.h" | ||
#include "llvm/MC/MCContext.h" | ||
#include "llvm/MC/MCDisassembler/MCDisassembler.h" | ||
#include "llvm/MC/MCInstPrinter.h" | ||
|
||
#include <memory> | ||
|
||
namespace llvm { | ||
namespace exegesis { | ||
|
||
// A helper class for decoding and printing machine instructions. | ||
class DisassemblerHelper { | ||
public: | ||
DisassemblerHelper(const LLVMState &State); | ||
|
||
void printInst(const MCInst *MI, raw_ostream &OS) const { | ||
const auto &STI = State_.getSubtargetInfo(); | ||
InstPrinter_->printInst(MI, 0, "", STI, OS); | ||
} | ||
|
||
bool decodeInst(MCInst &MI, uint64_t &MISize, ArrayRef<uint8_t> Bytes) const { | ||
return Disasm_->getInstruction(MI, MISize, Bytes, 0, nulls()); | ||
} | ||
|
||
private: | ||
const LLVMState &State_; | ||
std::unique_ptr<MCContext> Context_; | ||
std::unique_ptr<MCAsmInfo> AsmInfo_; | ||
std::unique_ptr<MCInstPrinter> InstPrinter_; | ||
std::unique_ptr<MCDisassembler> Disasm_; | ||
}; | ||
|
||
} // namespace exegesis | ||
} // namespace llvm | ||
|
||
#endif // LLVM_TOOLS_LLVM_EXEGESIS_DISASSEMBLER_HELPER_H |