diff --git a/tools/llvm-mc/Disassembler.cpp b/tools/llvm-mc/Disassembler.cpp index cdd1892f25c..93b9723902a 100644 --- a/tools/llvm-mc/Disassembler.cpp +++ b/tools/llvm-mc/Disassembler.cpp @@ -39,7 +39,7 @@ private: const ByteArrayTy &Bytes; public: VectorMemoryObject(const ByteArrayTy &bytes) : Bytes(bytes) {} - + uint64_t getBase() const { return 0; } uint64_t getExtent() const { return Bytes.size(); } @@ -57,15 +57,15 @@ static bool PrintInsts(const MCDisassembler &DisAsm, SourceMgr &SM, raw_ostream &Out) { // Wrap the vector in a MemoryObject. VectorMemoryObject memoryObject(Bytes); - + // Disassemble it to strings. uint64_t Size; uint64_t Index; - + for (Index = 0; Index < Bytes.size(); Index += Size) { MCInst Inst; - - if (DisAsm.getInstruction(Inst, Size, memoryObject, Index, + + if (DisAsm.getInstruction(Inst, Size, memoryObject, Index, /*REMOVE*/ nulls())) { Printer.printInst(&Inst, Out); Out << "\n"; @@ -76,12 +76,12 @@ static bool PrintInsts(const MCDisassembler &DisAsm, Size = 1; // skip illegible bytes } } - + return false; } -static bool ByteArrayFromString(ByteArrayTy &ByteArray, - StringRef &Str, +static bool ByteArrayFromString(ByteArrayTy &ByteArray, + StringRef &Str, SourceMgr &SM) { while (!Str.empty()) { // Strip horizontal whitespace. @@ -89,7 +89,7 @@ static bool ByteArrayFromString(ByteArrayTy &ByteArray, Str = Str.substr(Pos); continue; } - + // If this is the end of a line or start of a comment, remove the rest of // the line. if (Str[0] == '\n' || Str[0] == '#') { @@ -104,11 +104,11 @@ static bool ByteArrayFromString(ByteArrayTy &ByteArray, } continue; } - + // Get the current token. size_t Next = Str.find_first_of(" \t\n\r#"); StringRef Value = Str.substr(0, Next); - + // Convert to a byte and add to the byte vector. unsigned ByteVal; if (Value.getAsInteger(0, ByteVal) || ByteVal > 255) { @@ -119,11 +119,11 @@ static bool ByteArrayFromString(ByteArrayTy &ByteArray, ByteArray.clear(); continue; } - + ByteArray.push_back(std::make_pair((unsigned char)ByteVal, Value.data())); Str = Str.substr(Next); } - + return false; } @@ -133,18 +133,18 @@ int Disassembler::disassemble(const Target &T, TargetMachine &TM, raw_ostream &Out) { // Set up disassembler. OwningPtr AsmInfo(T.createAsmInfo(Triple)); - + if (!AsmInfo) { errs() << "error: no assembly info for target " << Triple << "\n"; return -1; } - + OwningPtr DisAsm(T.createMCDisassembler()); if (!DisAsm) { errs() << "error: no disassembler for target " << Triple << "\n"; return -1; } - + int AsmPrinterVariant = AsmInfo->getAssemblerDialect(); OwningPtr IP(T.createMCInstPrinter(TM, AsmPrinterVariant, *AsmInfo)); @@ -152,67 +152,67 @@ int Disassembler::disassemble(const Target &T, TargetMachine &TM, errs() << "error: no instruction printer for target " << Triple << '\n'; return -1; } - + bool ErrorOccurred = false; - + SourceMgr SM; SM.AddNewSourceBuffer(&Buffer, SMLoc()); - + // Convert the input to a vector for disassembly. ByteArrayTy ByteArray; StringRef Str = Buffer.getBuffer(); - + ErrorOccurred |= ByteArrayFromString(ByteArray, Str, SM); - + if (!ByteArray.empty()) ErrorOccurred |= PrintInsts(*DisAsm, *IP, ByteArray, SM, Out); - + return ErrorOccurred; } static int byteArrayReader(uint8_t *B, uint64_t A, void *Arg) { ByteArrayTy &ByteArray = *((ByteArrayTy*)Arg); - + if (A >= ByteArray.size()) return -1; - + *B = ByteArray[A].first; - + return 0; } static int verboseEvaluator(uint64_t *V, unsigned R, void *Arg) { EDDisassembler &disassembler = *(EDDisassembler *)((void **)Arg)[0]; raw_ostream &Out = *(raw_ostream *)((void **)Arg)[1]; - + if (const char *regName = disassembler.nameWithRegisterID(R)) Out << "[" << regName << "/" << R << "]"; - + if (disassembler.registerIsStackPointer(R)) Out << "(sp)"; if (disassembler.registerIsProgramCounter(R)) Out << "(pc)"; - + *V = 0; return 0; } -int Disassembler::disassembleEnhanced(const std::string &TS, +int Disassembler::disassembleEnhanced(const std::string &TS, MemoryBuffer &Buffer, raw_ostream &Out) { ByteArrayTy ByteArray; StringRef Str = Buffer.getBuffer(); SourceMgr SM; - + SM.AddNewSourceBuffer(&Buffer, SMLoc()); - + if (ByteArrayFromString(ByteArray, Str, SM)) { return -1; } - + Triple T(TS); EDDisassembler::AssemblySyntax AS; - + switch (T.getArch()) { default: errs() << "error: no default assembly syntax for " << TS.c_str() << "\n"; @@ -226,53 +226,53 @@ int Disassembler::disassembleEnhanced(const std::string &TS, AS = EDDisassembler::kEDAssemblySyntaxX86ATT; break; } - + EDDisassembler::initialize(); OwningPtr disassembler(EDDisassembler::getDisassembler(TS.c_str(), AS)); - + if (disassembler == 0) { errs() << "error: couldn't get disassembler for " << TS << '\n'; return -1; } - + while (ByteArray.size()) { OwningPtr inst(disassembler->createInst(byteArrayReader, 0, &ByteArray)); - + if (inst == 0) { errs() << "error: Didn't get an instruction\n"; return -1; } ByteArray.erase (ByteArray.begin(), ByteArray.begin() + inst->byteSize()); - + unsigned numTokens = inst->numTokens(); if ((int)numTokens < 0) { errs() << "error: couldn't count the instruction's tokens\n"; return -1; } - + for (unsigned tokenIndex = 0; tokenIndex != numTokens; ++tokenIndex) { EDToken *token; - + if (inst->getToken(token, tokenIndex)) { errs() << "error: Couldn't get token\n"; return -1; } - + const char *buf; if (token->getString(buf)) { errs() << "error: Couldn't get string for token\n"; return -1; } - + Out << '['; int operandIndex = token->operandID(); - + if (operandIndex >= 0) Out << operandIndex << "-"; - + switch (token->type()) { default: Out << "?"; break; case EDToken::kTokenWhitespace: Out << "w"; break; @@ -281,9 +281,9 @@ int Disassembler::disassembleEnhanced(const std::string &TS, case EDToken::kTokenLiteral: Out << "l"; break; case EDToken::kTokenRegister: Out << "r"; break; } - + Out << ":" << buf; - + if (token->type() == EDToken::kTokenLiteral) { Out << "="; if (token->literalSign()) @@ -303,33 +303,34 @@ int Disassembler::disassembleEnhanced(const std::string &TS, } Out << "r" << regID; } - + Out << "]"; } - + Out << " "; - + if (inst->isBranch()) Out << "
"; if (inst->isMove()) Out << " "; - + unsigned numOperands = inst->numOperands(); - + if ((int)numOperands < 0) { errs() << "error: Couldn't count operands\n"; return -1; } - - for (unsigned operandIndex = 0; operandIndex != numOperands; ++operandIndex) { + + for (unsigned operandIndex = 0; operandIndex != numOperands; + ++operandIndex) { Out << operandIndex << ":"; - + EDOperand *operand; if (inst->getOperand(operand, operandIndex)) { errs() << "error: couldn't get operand\n"; return -1; } - + uint64_t evaluatedResult; void *Arg[] = { disassembler.get(), &Out }; if (operand->evaluate(evaluatedResult, verboseEvaluator, Arg)) { @@ -338,10 +339,10 @@ int Disassembler::disassembleEnhanced(const std::string &TS, } Out << "=" << evaluatedResult << " "; } - + Out << '\n'; } - + return 0; } diff --git a/tools/llvm-mc/Disassembler.h b/tools/llvm-mc/Disassembler.h index aaf77b5a0ff..d738ee767e0 100644 --- a/tools/llvm-mc/Disassembler.h +++ b/tools/llvm-mc/Disassembler.h @@ -31,12 +31,12 @@ public: const std::string &tripleString, MemoryBuffer &buffer, raw_ostream &Out); - + static int disassembleEnhanced(const std::string &tripleString, MemoryBuffer &buffer, raw_ostream &Out); }; - + } // namespace llvm #endif diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 24cc263c2ec..eb23a1a4671 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -183,10 +183,10 @@ static int AsLexInput(const char *ProgName) { MemoryBuffer *Buffer = BufferPtr.take(); SourceMgr SrcMgr; - + // Tell SrcMgr about this buffer, which is what TGParser will pick up. SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); - + // Record the location of the include directories so that the lexer can find // it later. SrcMgr.setIncludeDirs(IncludeDirs); @@ -279,7 +279,7 @@ static int AsLexInput(const char *ProgName) { // Keep output if no errors. if (Error == 0) Out->keep(); - + return Error; } @@ -294,20 +294,20 @@ static int AssembleInput(const char *ProgName) { return 1; } MemoryBuffer *Buffer = BufferPtr.take(); - + SourceMgr SrcMgr; - + // Tell SrcMgr about this buffer, which is what the parser will pick up. SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); - + // Record the location of the include directories so that the lexer can find // it later. SrcMgr.setIncludeDirs(IncludeDirs); - - + + llvm::OwningPtr MAI(TheTarget->createAsmInfo(TripleName)); assert(MAI && "Unable to create target asm info!"); - + // Package up features to be passed to target/subtarget std::string FeaturesStr; if (MCPU.size()) { @@ -378,7 +378,7 @@ static int AssembleInput(const char *ProgName) { *Str.get(), *MAI)); OwningPtr TAP(TheTarget->createAsmParser(*Parser, *TM)); if (!TAP) { - errs() << ProgName + errs() << ProgName << ": error: this target does not support assembly parsing.\n"; return 1; } @@ -404,7 +404,7 @@ static int DisassembleInput(const char *ProgName, bool Enhanced) { errs() << ProgName << ": " << ec.message() << '\n'; return 1; } - + OwningPtr Out(GetOutputStream()); if (!Out) return 1; @@ -459,7 +459,7 @@ int main(int argc, char **argv) { llvm::InitializeAllAsmPrinters(); llvm::InitializeAllAsmParsers(); llvm::InitializeAllDisassemblers(); - + cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); TripleName = Triple::normalize(TripleName); @@ -474,7 +474,7 @@ int main(int argc, char **argv) { case AC_EDisassemble: return DisassembleInput(argv[0], true); } - + return 0; }