diff options
Diffstat (limited to 'contrib/llvm/tools/llvm-mc/Disassembler.cpp')
| -rw-r--r-- | contrib/llvm/tools/llvm-mc/Disassembler.cpp | 36 | 
1 files changed, 28 insertions, 8 deletions
diff --git a/contrib/llvm/tools/llvm-mc/Disassembler.cpp b/contrib/llvm/tools/llvm-mc/Disassembler.cpp index 81a0045897a2..936759039874 100644 --- a/contrib/llvm/tools/llvm-mc/Disassembler.cpp +++ b/contrib/llvm/tools/llvm-mc/Disassembler.cpp @@ -13,10 +13,12 @@  //===----------------------------------------------------------------------===//  #include "Disassembler.h" -#include "llvm/ADT/OwningPtr.h"  #include "llvm/ADT/Triple.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCContext.h"  #include "llvm/MC/MCDisassembler.h"  #include "llvm/MC/MCInst.h" +#include "llvm/MC/MCRegisterInfo.h"  #include "llvm/MC/MCStreamer.h"  #include "llvm/MC/MCSubtargetInfo.h"  #include "llvm/Support/MemoryBuffer.h" @@ -36,10 +38,10 @@ private:  public:    VectorMemoryObject(const ByteArrayTy &bytes) : Bytes(bytes) {} -  uint64_t getBase() const { return 0; } -  uint64_t getExtent() const { return Bytes.size(); } +  uint64_t getBase() const override { return 0; } +  uint64_t getExtent() const override { return Bytes.size(); } -  int readByte(uint64_t Addr, uint8_t *Byte) const { +  int readByte(uint64_t Addr, uint8_t *Byte) const override {      if (Addr >= getExtent())        return -1;      *Byte = Bytes[Addr].first; @@ -51,7 +53,8 @@ public:  static bool PrintInsts(const MCDisassembler &DisAsm,                         const ByteArrayTy &Bytes,                         SourceMgr &SM, raw_ostream &Out, -                       MCStreamer &Streamer, bool InAtomicBlock) { +                       MCStreamer &Streamer, bool InAtomicBlock, +                       const MCSubtargetInfo &STI) {    // Wrap the vector in a MemoryObject.    VectorMemoryObject memoryObject(Bytes); @@ -86,7 +89,7 @@ static bool PrintInsts(const MCDisassembler &DisAsm,        // Fall through      case MCDisassembler::Success: -      Streamer.EmitInstruction(Inst); +      Streamer.EmitInstruction(Inst, STI);        break;      }    } @@ -158,7 +161,24 @@ int Disassembler::disassemble(const Target &T,                                MemoryBuffer &Buffer,                                SourceMgr &SM,                                raw_ostream &Out) { -  OwningPtr<const MCDisassembler> DisAsm(T.createMCDisassembler(STI)); + +  std::unique_ptr<const MCRegisterInfo> MRI(T.createMCRegInfo(Triple)); +  if (!MRI) { +    errs() << "error: no register info for target " << Triple << "\n"; +    return -1; +  } + +  std::unique_ptr<const MCAsmInfo> MAI(T.createMCAsmInfo(*MRI, Triple)); +  if (!MAI) { +    errs() << "error: no assembly info for target " << Triple << "\n"; +    return -1; +  } + +  // Set up the MCContext for creating symbols and MCExpr's. +  MCContext Ctx(MAI.get(), MRI.get(), nullptr); + +  std::unique_ptr<const MCDisassembler> DisAsm( +    T.createMCDisassembler(STI, Ctx));    if (!DisAsm) {      errs() << "error: no disassembler for target " << Triple << "\n";      return -1; @@ -202,7 +222,7 @@ int Disassembler::disassemble(const Target &T,      if (!ByteArray.empty())        ErrorOccurred |= PrintInsts(*DisAsm, ByteArray, SM, Out, Streamer, -                                  InAtomicBlock); +                                  InAtomicBlock, STI);    }    if (InAtomicBlock) {  | 
