1a3dcfb130044f306632a5fab43854eda4095a09cChris Lattner//===- Disassembler.cpp - Disassembler for hex strings --------------------===// 2ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// 3ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// The LLVM Compiler Infrastructure 4ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// 5ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// This file is distributed under the University of Illinois Open Source 6ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// License. See LICENSE.TXT for details. 7ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// 8ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan//===----------------------------------------------------------------------===// 9ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// 10ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// This class implements the disassembler of strings of bytes written in 11ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// hexadecimal, from standard input or from a file. 12ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan// 13ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan//===----------------------------------------------------------------------===// 14ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan 15a3dcfb130044f306632a5fab43854eda4095a09cChris Lattner#include "Disassembler.h" 16f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/ADT/Triple.h" 17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCAsmInfo.h" 18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCContext.h" 19ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan#include "llvm/MC/MCDisassembler.h" 20ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan#include "llvm/MC/MCInst.h" 21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCRegisterInfo.h" 22d0c478d95f440b4db76279fe47d6cf734a28fa9aRichard Barton#include "llvm/MC/MCStreamer.h" 23b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy#include "llvm/MC/MCSubtargetInfo.h" 24ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan#include "llvm/Support/MemoryBuffer.h" 25ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan#include "llvm/Support/MemoryObject.h" 26c3de94fabf3858ad57373171fa6bda407f2224c9Chris Lattner#include "llvm/Support/SourceMgr.h" 273e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 283e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/raw_ostream.h" 29d0c478d95f440b4db76279fe47d6cf734a28fa9aRichard Barton 30ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callananusing namespace llvm; 31ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan 32665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattnertypedef std::vector<std::pair<unsigned char, const char*> > ByteArrayTy; 33665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner 34665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattnernamespace { 35ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callananclass VectorMemoryObject : public MemoryObject { 36ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callananprivate: 37665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner const ByteArrayTy &Bytes; 38ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callananpublic: 39665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner VectorMemoryObject(const ByteArrayTy &bytes) : Bytes(bytes) {} 40f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t getBase() const override { return 0; } 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t getExtent() const override { return Bytes.size(); } 43ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int readByte(uint64_t Addr, uint8_t *Byte) const override { 452f867a63daf99dc27830d4442a574a790e02f27eRafael Espindola if (Addr >= getExtent()) 46ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan return -1; 47665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner *Byte = Bytes[Addr].first; 48ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan return 0; 49ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan } 50ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan}; 51665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner} 52ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan 53c6ab1901f922c854c84e9e055cbc83601df80addDaniel Dunbarstatic bool PrintInsts(const MCDisassembler &DisAsm, 54d0c478d95f440b4db76279fe47d6cf734a28fa9aRichard Barton const ByteArrayTy &Bytes, 55d0c478d95f440b4db76279fe47d6cf734a28fa9aRichard Barton SourceMgr &SM, raw_ostream &Out, 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCStreamer &Streamer, bool InAtomicBlock, 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI) { 58ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan // Wrap the vector in a MemoryObject. 59665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner VectorMemoryObject memoryObject(Bytes); 60f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 612e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan // Disassemble it to strings. 62665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner uint64_t Size; 632e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan uint64_t Index; 64f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 652e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan for (Index = 0; Index < Bytes.size(); Index += Size) { 662e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan MCInst Inst; 67f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 6883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson MCDisassembler::DecodeStatus S; 6983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson S = DisAsm.getInstruction(Inst, Size, memoryObject, Index, 7098c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson /*REMOVE*/ nulls(), nulls()); 7183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson switch (S) { 7283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson case MCDisassembler::Fail: 732e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan SM.PrintMessage(SMLoc::getFromPointer(Bytes[Index].second), 743f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner SourceMgr::DK_Warning, 753f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner "invalid instruction encoding"); 7638c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover // Don't try to resynchronise the stream in a block 7738c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover if (InAtomicBlock) 7838c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover return true; 7938c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover 802e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan if (Size == 0) 812e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan Size = 1; // skip illegible bytes 8238c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover 8383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson break; 8483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson 8583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson case MCDisassembler::SoftFail: 8683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson SM.PrintMessage(SMLoc::getFromPointer(Bytes[Index].second), 873f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner SourceMgr::DK_Warning, 883f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner "potentially undefined instruction encoding"); 8983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson // Fall through 9083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson 9183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson case MCDisassembler::Success: 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Streamer.EmitInstruction(Inst, STI); 9383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson break; 942e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan } 95ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan } 96f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 97665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner return false; 98ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan} 99ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan 10038c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northoverstatic bool SkipToToken(StringRef &Str) { 10138c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover while (!Str.empty() && Str.find_first_not_of(" \t\r\n#,") != 0) { 10238c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover // Strip horizontal whitespace and commas. 10338c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover if (size_t Pos = Str.find_first_not_of(" \t\r,")) { 1042adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner Str = Str.substr(Pos); 1052adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner } 106f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 1072e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan // If this is the end of a line or start of a comment, remove the rest of 1082e235a826d2f65a064b2a39b27c775d0adf8b7c3Sean Callanan // the line. 1092adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner if (Str[0] == '\n' || Str[0] == '#') { 1102adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner // Strip to the end of line if we already processed any bytes on this 1112adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner // line. This strips the comment and/or the \n. 112668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan if (Str[0] == '\n') { 1132adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner Str = Str.substr(1); 114668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan } else { 1152adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner Str = Str.substr(Str.find_first_of('\n')); 1162adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner if (!Str.empty()) 1172adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner Str = Str.substr(1); 1182adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner } 1192adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner continue; 120ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan } 12138c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover } 12238c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover 12338c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover return !Str.empty(); 12438c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover} 12538c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover 12638c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover 12738c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northoverstatic bool ByteArrayFromString(ByteArrayTy &ByteArray, 12838c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover StringRef &Str, 12938c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover SourceMgr &SM) { 13038c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover while (SkipToToken(Str)) { 13138c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover // Handled by higher level 13238c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover if (Str[0] == '[' || Str[0] == ']') 13338c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover return false; 134f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 135ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan // Get the current token. 13638c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover size_t Next = Str.find_first_of(" \t\n\r,#[]"); 1372adbef06a637b367f724d0a46f7fa78d5827ec64Chris Lattner StringRef Value = Str.substr(0, Next); 138f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 139ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan // Convert to a byte and add to the byte vector. 140222af464822c9c47b2859e813912ed6ba5339217Chris Lattner unsigned ByteVal; 141222af464822c9c47b2859e813912ed6ba5339217Chris Lattner if (Value.getAsInteger(0, ByteVal) || ByteVal > 255) { 142c3de94fabf3858ad57373171fa6bda407f2224c9Chris Lattner // If we have an error, print it and skip to the end of line. 1433f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner SM.PrintMessage(SMLoc::getFromPointer(Value.data()), SourceMgr::DK_Error, 1443f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner "invalid input token"); 145c3de94fabf3858ad57373171fa6bda407f2224c9Chris Lattner Str = Str.substr(Str.find('\n')); 146c3de94fabf3858ad57373171fa6bda407f2224c9Chris Lattner ByteArray.clear(); 147c3de94fabf3858ad57373171fa6bda407f2224c9Chris Lattner continue; 148ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan } 149f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 150665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner ByteArray.push_back(std::make_pair((unsigned char)ByteVal, Value.data())); 151222af464822c9c47b2859e813912ed6ba5339217Chris Lattner Str = Str.substr(Next); 152ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan } 153f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 154668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan return false; 155668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan} 156668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan 157b262799d49891b036daa00eddf51947487346c98Evan Chengint Disassembler::disassemble(const Target &T, 158a5c177e70a42f48e4885075c4c48aad0816a2817Bill Wendling const std::string &Triple, 159d0c478d95f440b4db76279fe47d6cf734a28fa9aRichard Barton MCSubtargetInfo &STI, 160d0c478d95f440b4db76279fe47d6cf734a28fa9aRichard Barton MCStreamer &Streamer, 161d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman MemoryBuffer &Buffer, 162d0c478d95f440b4db76279fe47d6cf734a28fa9aRichard Barton SourceMgr &SM, 163d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman raw_ostream &Out) { 164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::unique_ptr<const MCRegisterInfo> MRI(T.createMCRegInfo(Triple)); 166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MRI) { 167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines errs() << "error: no register info for target " << Triple << "\n"; 168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return -1; 169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::unique_ptr<const MCAsmInfo> MAI(T.createMCAsmInfo(*MRI, Triple)); 172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MAI) { 173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines errs() << "error: no assembly info for target " << Triple << "\n"; 174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return -1; 175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Set up the MCContext for creating symbols and MCExpr's. 178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCContext Ctx(MAI.get(), MRI.get(), nullptr); 179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::unique_ptr<const MCDisassembler> DisAsm( 181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines T.createMCDisassembler(STI, Ctx)); 182668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan if (!DisAsm) { 183668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan errs() << "error: no disassembler for target " << Triple << "\n"; 184668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan return -1; 185668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan } 186f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 187d0c478d95f440b4db76279fe47d6cf734a28fa9aRichard Barton // Set up initial section manually here 188d0c478d95f440b4db76279fe47d6cf734a28fa9aRichard Barton Streamer.InitSections(); 189f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 190668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan bool ErrorOccurred = false; 191f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 192668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan // Convert the input to a vector for disassembly. 193668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan ByteArrayTy ByteArray; 194668b15467be158a5f0e0c4a5e1ec232da021892cSean Callanan StringRef Str = Buffer.getBuffer(); 19538c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover bool InAtomicBlock = false; 19638c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover 19738c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover while (SkipToToken(Str)) { 19838c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover ByteArray.clear(); 19938c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover 20038c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover if (Str[0] == '[') { 20138c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover if (InAtomicBlock) { 20238c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover SM.PrintMessage(SMLoc::getFromPointer(Str.data()), SourceMgr::DK_Error, 20338c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover "nested atomic blocks make no sense"); 20438c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover ErrorOccurred = true; 20538c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover } 20638c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover InAtomicBlock = true; 20738c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover Str = Str.drop_front(); 20838c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover continue; 20938c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover } else if (Str[0] == ']') { 21038c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover if (!InAtomicBlock) { 21138c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover SM.PrintMessage(SMLoc::getFromPointer(Str.data()), SourceMgr::DK_Error, 21238c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover "attempt to close atomic block without opening"); 21338c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover ErrorOccurred = true; 21438c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover } 21538c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover InAtomicBlock = false; 21638c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover Str = Str.drop_front(); 21738c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover continue; 21838c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover } 219f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 22038c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover // It's a real token, get the bytes and emit them 22138c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover ErrorOccurred |= ByteArrayFromString(ByteArray, Str, SM); 222f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 22338c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover if (!ByteArray.empty()) 22438c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover ErrorOccurred |= PrintInsts(*DisAsm, ByteArray, SM, Out, Streamer, 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines InAtomicBlock, STI); 22638c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover } 22738c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover 22838c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover if (InAtomicBlock) { 22938c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover SM.PrintMessage(SMLoc::getFromPointer(Str.data()), SourceMgr::DK_Error, 23038c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover "unclosed atomic block"); 23138c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover ErrorOccurred = true; 23238c6ff6c111fcc53debb9e2880f89e2dd0676217Tim Northover } 233f5bf3cf7e2a0ff1ca884a83a8b56b5a57f8a5c80Jim Grosbach 234665e947740bb1909f9c3dc60927e8b9620d644e5Chris Lattner return ErrorOccurred; 235ba847da571354e13f1caa3699ee06b2d57df9fe9Sean Callanan} 236