aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2020-01-10 23:43:44 -0800
committerFangrui Song <maskray@google.com>2020-01-11 11:24:38 -0800
commita5994c789a2982a770254ae1607b5b4cb641f73c (patch)
tree512cfc6c546c6ee090aa0b22e4cdbb875cc862f0 /llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
parent9cc9120969fd9f7f6a99321c7d94133a32927a3a (diff)
downloadllvm-a5994c789a2982a770254ae1607b5b4cb641f73c.zip
llvm-a5994c789a2982a770254ae1607b5b4cb641f73c.tar.gz
llvm-a5994c789a2982a770254ae1607b5b4cb641f73c.tar.bz2
[X86][Disassembler] Simplify and optimize reader functions
llvm-objdump -d on clang is decreased from 8.2s to 7.8s.
Diffstat (limited to 'llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp')
-rw-r--r--llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp22
1 files changed, 2 insertions, 20 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
index 9a635bb..ca12326 100644
--- a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
+++ b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
@@ -169,29 +169,12 @@ X86GenericDisassembler::X86GenericDisassembler(
llvm_unreachable("Invalid CPU mode");
}
-namespace {
-struct Region {
- ArrayRef<uint8_t> Bytes;
- uint64_t Base;
- Region(ArrayRef<uint8_t> Bytes, uint64_t Base) : Bytes(Bytes), Base(Base) {}
-};
-} // end anonymous namespace
-
/// A callback function that wraps the readByte method from Region.
///
/// @param Arg - The generic callback parameter. In this case, this should
/// be a pointer to a Region.
/// @param Byte - A pointer to the byte to be read.
/// @param Address - The address to be read.
-static int regionReader(const void *Arg, uint8_t *Byte, uint64_t Address) {
- auto *R = static_cast<const Region *>(Arg);
- ArrayRef<uint8_t> Bytes = R->Bytes;
- unsigned Index = Address - R->Base;
- if (Bytes.size() <= Index)
- return -1;
- *Byte = Bytes[Index];
- return 0;
-}
/// logger - a callback function that wraps the operator<< method from
/// raw_ostream.
@@ -222,10 +205,9 @@ MCDisassembler::DecodeStatus X86GenericDisassembler::getInstruction(
if (&VStream == &nulls())
LoggerFn = nullptr; // Disable logging completely if it's going to nulls().
- Region R(Bytes, Address);
+ std::pair<ArrayRef<uint8_t>, uint64_t> R(Bytes, Address);
- int Ret = decodeInstruction(&InternalInstr, regionReader, (const void *)&R,
- LoggerFn, (void *)&VStream,
+ int Ret = decodeInstruction(&InternalInstr, &R, LoggerFn, (void *)&VStream,
(const void *)MII.get(), Address, fMode);
if (Ret) {